專利名稱:一種二叉樹的存儲方法、系統的制作方法
技術領域:
本發明屬于計算機技術領域,尤其涉及一種二叉樹的存儲方法、系統。
背景技術:
在二叉樹的大多數應用場景中,使用管道pipeline模式的查找結構以達到高性能。這就要求把二叉樹中的節點按Branch (Branch是指二叉樹里具有相同深度的節點集)分層存儲在不同的存儲單元memory中,并且對每塊memory的訪問次數做出了限制。在當前的方案下,如果一顆二叉樹的層數過多,那么最后幾層所需存儲的節點數目將會變得非常大,以至于超出已有的單片DDR存儲器件的容量。例如如圖I所示的高度為25的二叉樹的存儲結構。從圖I所示的結構中可以看出,對于一個形狀固定的二叉樹,在查找時,是從二叉樹頂部一直向下經過每一層Branch,最終得到比較結果。在比較的過程中,不能折返回上級Branch進行再一次的比較。這樣存儲二叉樹節點的最后2塊memory,對存儲體占用的需求將相差4倍,若要將最后2層的節點分別放入同樣規格的DDR3芯片中,比如,以前一級的memory作為存儲體,將會出現最后一級對存儲體占用的需求太大,而前一級memory容量太小,不能夠存儲最后一級所有的節點,而若是加大memory的容量,以能夠完全存儲最后一級所有的節點的memory作為存儲體,貝U又會出現在存儲前一級所有的節點時,memory中會剩下很多存儲空間,空間利用率太低。
發明內容
本發明實施例提供了一種二叉樹的存儲方法、系統,旨在解決現有技術提供的存儲方法,在存儲最后幾層節點時,會出現memory的利用率低的問題。—方面,提供一種二叉樹的存儲方法,包括將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中。另一方面,提供一種二叉樹的存儲控制裝置,包括劃分單元,用于將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中; 分類單元,用于將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊;存儲控制單元,用于調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元。再一方面,提供一種二叉樹的存儲系統,包括外部存儲器,還包括如上所述的二叉樹的存儲控制裝置。在本發明實施例中,把一個大的形狀固定的二叉樹劃分成一個root tree和多個sub tree,所述多個子樹分層存儲在N級存儲器中;將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊;調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元,這樣可以將每級節點的存儲空間由大小不均勻空間歸一化為同樣大小的空間,從而提高存儲器的空間利用率。
圖I是現有技術提供的高度為25的二叉樹的存儲結構示意圖;圖2是本發明實施例一提供的二叉樹的存儲方法的實現流程圖;圖3是本發明實施例提供的一個形狀固定的二叉樹是如何切割和切割后的節點如何關聯的不意圖;圖4是本發明實施例一提供的高度為25的二叉樹的存儲結構示意圖;圖5是本發明實施例提供的一個原始的不均勻的三級存儲結構示意圖; 圖6是本發明實施例提供的切割后的不均勻存儲空間結構示意圖;圖7是本發明實施例提供的調整后的均勻存儲結構示意圖;圖8是本發明實施例二提供的二叉樹的存儲控制裝置的結構框圖;圖9是本發明實施例三提供的二叉樹的存儲系統的結構框圖。
具體實施例方式為了使本發明的目的、技術方案及優點更加清楚明白,以下結合附圖及實施例,對本發明進行進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發明,并不用于限定本發明。在本發明實施例中,把一個大的形狀固定的二叉樹劃分成一個root tree和多個sub tree,所述多個子樹分層存儲在N級存儲器中;將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊;調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元。實施例一 圖2示出了本發明實施例一提供的二叉樹的存儲方法的實現流程,詳述如下201、將二叉樹劃分為一個根樹(root tree)和多個子樹(sub tree),所述多個子樹分層存儲在N級存儲器。在本實施例中,將高度為m的二叉樹在Branch n和Branch(n+1)之間進行切割(n < m,且m、n均為正整數,整個二叉樹從branchO層開始計算),則Branchn層以上(包括Branch n層本身)共有2(n+1)_l個節點,這2(n+1)_l個節點也構成一個二叉樹,即根樹,用root tree表示。Branch n層以下有2(n+1)個高度為m-n_l的二叉樹,將Branch n層以下的二叉樹用子樹sub tree來表示,所述m-n_l個子樹分層存儲在N級存儲,其中,N為正整數。下面以m = 26,n = 21為例,說明一個形狀固定的二叉樹是如何切割和切割后的節點如何關聯,如圖3所示。切割線(黑色實線)以上的root tree中的每個節點除了存儲Key (用來查找二叉樹)值以外,還維護有一個指針,指向一個sub tree (指針存儲的是所指向sub tree的根節點的地址),因為root tree節點數比sub tree數目少I,因此有I個sub tree不能用。sub tree的Branch22至Branch25可以被分成兩部分存儲,其中,上半部分Branch22和Branch23存儲在外部存儲器DDR3 stageO中,下半部分Branch24和Branch25存儲在外部存儲器DDR3 stagel中。202、將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個
數據塊。對子樹的分類,可以采用不同的方式將子樹切分為M類,其中,M可以為2、3等正整數,比如,在本實施例中,按照二叉樹首節點的奇偶編號將子樹切分成兩類,即奇子樹和偶子樹。203、調整所述NXM個數據塊在存儲器中的存儲位置,使的每一級存儲器占用相同的存儲單元。其中,當N = 2,M = 2時,調整所述NXM個數據塊在存儲器中的存儲位置,使的每一級存儲器占用相同的存儲單元具體為將第一類子樹的上半部分和下半部分分別存儲在第二級存儲器和第一級存儲器中,將第二類子樹的上半部分和下半部分分別存儲在第一級存儲器和第二級存儲器中。在本實施例中,如圖4所示,第一類子樹是奇子樹,第二類子樹是偶子樹,將奇子樹(subtree 4M-1)的上半部分(Branch22和Branch23)存儲在第二級存儲器(DDR3stagel)中,下半部分(Branch24和Branch25)存儲在第一級存儲器(DDR3 stageO)中;將偶子樹(subtree 4M-2)的上半部分(Branch22和Branch23)存儲在第一級存儲器(DDR3stageO)中,下半部分(Branch24和Branch25)存儲在第二級存儲器(DDR3 stagel)中,其中M是表示2的20次方,即1024*1024 = 1048576。其中,在實施例中,在將奇子樹的上半部分和下半部分分別存儲在第二級存儲器和第一級存儲器中后,還可以將偶子樹的下半部分相對于原有的存儲地址做一次偏移計算,將偶子樹的下半部分存儲在存儲奇子樹的上半部分的位置,將奇子樹的上半部分存儲在存儲偶子樹的下半部分的位置。這樣可以將最后兩級節點的存儲空間由一大一小的不均勻空間歸一化為同樣大小的空間,從而提高存儲器的空間利用率。例如=StageO原來需要X大小的空間,按每個stage放2層節點計算,則stagel需要4X的空間。如果按傳統的方式,則需要一個X大小的存儲器以及一個4X大小的存儲器來達到存儲樹形結構的目的。若采用本發明實施例提供的儲存方法,則可以由兩個2. 5X空間大小的存儲器來實現,可以達到存儲器采購歸一化以及提聞存儲利用率的目的。在將sub tree存儲在外部存儲器DDR3中后,可以對二叉樹進行查找,具體的查找過程包括步驟I、訪問根樹root treeo步驟2、判斷是否訪問到偶子樹,如果訪問的是偶子樹,則執行步驟3,否則,執行
步驟4。步驟3、先訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果。其中,第一級存儲器是DDR3 stageO存儲器,第二級存儲器是DDR3 stagel存儲 器。
步驟4、先訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果。另外,特別注意的是,訪問偶子樹(或奇子樹)的請求,不會中途因為查找分支的跳轉從當前偶子樹(或奇子樹)轉到另一棵奇子樹(或偶子樹)中去。其中,對于二叉樹后面的幾級節點,存儲在多級存儲器中,也可以按此方式進行節點的存儲和訪問。此外,還需注意的是,在添加、刪除節點Node時,只會在同一個偶子樹(或奇子樹)內進行節點的搬移或移動。在移動的過程中,只需要保持偶子樹是從第一級存儲器到第二級存儲器的訪問次序,而奇子樹是從第二級存儲器到第一級存儲器的訪問次序,就能保證訪問的正確性。進一步地,對sub tree的分類,可以采用不同的方式,將sub tree分成多類,按最 優方式存儲在存儲器中。如下給出三級不均勻存儲的平衡儲存方案圖5所不為一個原始的不均勻的二級存儲結構不意圖,存儲空間大小關系為stageO < stagel < stage2。由于原始存儲空間的大小為三級,把每一級劃分成三等份,如圖6所示為切割后的不均勻存儲空間結構示意圖a0,b0,c0占用相同的存儲單元,al,bl,cl占用相同的存儲單元,a2,b2,c2占用相同的存儲單元,有a0 < al < a2。調整其中某些存儲單元的存儲空間的位置,就可以使每一級存儲器都占用相同的存儲單元。如圖7所示為調整后的均勻存儲結構示意圖。同樣可以將n級大小的不均勻空間歸一化為每級大小相同的空間。歸一化后每一級所需的存儲空間大小為(stageO+stagel+. . . +stagen-1)/n,從而達到提高存儲利用率的目的。實施例二圖8示出了本發明實施例二提供的二叉樹的存儲控制裝置的具體結構框圖,為了便于說明,僅示出了與本發明實施例相關的部分。該二叉樹的存儲控制裝置,包括劃分單元81、分類單元82和存儲控制單元83。其中,劃分單元81,用于將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中;分類單元82,用于將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊,當M = 2時,具體是按照二叉樹首節點的奇偶編號將子樹劃分成奇子樹和偶子樹;存儲控制單元83,用于調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元,其中,當N= 2,M = 2時,所述存儲控制單元83,用于將第一類子樹的上半部分和下半部分分別存儲在第二級存儲器和第一級存儲器中,將第二類子樹的上半部分和下半部分分別存儲在第一級存儲器和第二級存儲器中。進一步地,所述的裝置,還包括根樹訪問單元84、判斷單元85、偶子樹訪問單元86和奇子樹訪問單元87。
其中,根樹訪問單元84,用于訪問根樹;判斷單元85,用于判斷是否訪問到偶子樹;偶子樹訪問單元86,用于如果訪問的是偶子樹,則先訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果;奇子樹訪問單元87,用于如果訪問的是奇子樹,則先訪問第二級存儲器,比較判斷 當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果。進一步地,所述的裝置,還包括節點移動單元88。節點移動單元88,用于在同一個偶子樹或奇子樹內進行節點的搬移或移動。具體可參照圖2所示方法實施例,在此不再贅述。實施例三圖9示出了本發明實施例三提供的二叉樹的存儲系統的結構框圖,為了便于說明,僅示出了與本發明實施例相關的部分。所述二叉樹的存儲系統,包括多個外部存儲器(External RAM)91,還包括如圖8所示的二叉樹的存儲控制裝置92,其中,所述二叉樹的存儲控制裝置92 內置于專用集成電路(application-specific integrated circuit,ASIC)/現場可編程邏輯門陣列(FPGA, field-programmable gate array)93 中。在本發明實施例中,將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中;將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊;調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元,這樣可以將每級節點的存儲空間由大小不均勻空間歸一化為同樣大小的空間,從而提聞存儲器的空間利用率。以上所述僅為本發明的較佳實施例而已,并不用以限制本發明,凡在本發明的精神和原則之內所作的任何修改、等同替換和改進等,均應包含在本發明的保護范圍之內。
權利要求
1.一種二叉樹的存儲方法,其特征在于,包括 將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中; 將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊;調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元。
2.如權利要求I所述的方法,其特征在于,當N= 2,M = 2時,所述調整所述NXM個數據塊在存儲器中的存儲位置,使的每一級存儲器占用相同的存儲單元包括 將第一類子樹的上半部分和下半部分分別存儲在第二級存儲器和第一級存儲器中,將第二類子樹的上半部分和下半部分分別存儲在第一級存儲器和第二級存儲器中。
3.如權利要求2所述的方法,其特征在于,當M= 2時,所述將所述多個子樹按照預設的規則切分為M類包括 按照二叉樹首節點的奇偶編號將子樹劃分成奇子樹和偶子樹。
4.如權利要求2所述的方法,其特征在于,在所述將第一類子樹的上半部分和下半部分分別存儲在第二級存儲器和第一級存儲器中,將第二類子樹的上半部分和下半部分分別存儲在第一級存儲器和第二級存儲器中的步驟之后,還包括 查找二叉樹的步驟; 所述查找二叉樹的步驟包括 訪問根樹; 判斷是否訪問到偶子樹; 如果訪問的是偶子樹,則先訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果; 如果訪問的是奇子樹,則先訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果。
5.如權利要求4所述的方法,其特征在于,在所述查找二叉樹的步驟之后,還包括 節點的添加、刪除; 所述節點的添加、刪除包括 在同一個偶子樹或奇子樹內進行節點的搬移或移動。
6.一種二叉樹的存儲控制裝置,其特征在于,包括 劃分單元,用于將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中; 分類單元,用于將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成NXM個數據塊; 存儲控制單元,用于調整所述NXM個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元。
7.如權利要求6所述的裝置,其特征在于,當N= 2,M = 2時,所述存儲控制單元,用于將第一類子樹的上半部分和下半部分分別存儲在第二級存儲器和第一級存儲器中,將第二類子樹的上半部分和下半部分分別存儲在第一級存儲器和第二級存儲器中。
8.如權利要求7所述的裝置,其特征在于,所述分類單元是按照二叉樹首節點的奇偶編號將子樹劃分成奇子樹和偶子樹。
9.如權利要求7所述的裝置,其特征在于,還包括 根樹訪問單元,用于訪問根樹; 判斷單元,用于判斷是否訪問到偶子樹; 偶子樹訪問單元,用于如果訪問的是偶子樹,則先訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果; 奇子樹訪問單元,用于如果訪問的是奇子樹,則先訪問第二級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,如果是,則查找結束,否則,再訪問第一級存儲器,比較判斷當前節點中存儲的數值是否與關鍵字Key的值相等,得到最終結果。
10.如權利要求7所述的裝置,其特征在于,還包括 節點移動單元,用于在同一個偶子樹或奇子樹內進行節點的搬移或移動。
11.一種二叉樹的存儲系統,包括多個外部存儲器,其特征在于,還包括如權利要求7至10任一項所述的二叉樹的存儲控制裝置。
12.如權利要求11所述的系統,其特征在于,所述二叉樹的存儲控制裝置內置于專用集成電路ASIC/現場可編程邏輯門陣列FPGA中。
全文摘要
本發明適用于計算機技術領域,提供了一種二叉樹的存儲方法、系統,方法包括將二叉樹劃分為一個根樹和多個子樹,所述多個子樹分層存儲在N級存儲器中;將所述多個子樹按照預設的規則切分為M類,所述多個子樹被切分成N×M個數據塊;調整所述N×M個數據塊在存儲器中的存儲位置,使得每一級存儲器占用相同的存儲單元。本發明,可以將每級節點的存儲空間由大小不均勻空間歸一化為同樣大小的空間,從而提高存儲器的空間利用率。
文檔編號G06F12/08GK102662855SQ20121011270
公開日2012年9月12日 申請日期2012年4月17日 優先權日2012年4月17日
發明者易毅, 洪榮峰, 王建 申請人:華為技術有限公司