專(zhuān)利名稱(chēng):一種基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于物聯(lián)網(wǎng)通信領(lǐng)域中大數(shù)據(jù)量的存儲(chǔ)、查詢(xún)方法領(lǐng)域,特別是一種基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法。
背景技術(shù):
通信技術(shù)中,傳統(tǒng)的數(shù)據(jù)查詢(xún)方法包括靜態(tài)查找方法和動(dòng)態(tài)查找方法。靜態(tài)查找方法包括順序查找、二分查找、索引查找;動(dòng)態(tài)查找方法包括二叉搜索樹(shù)、B-樹(shù)、哈希 (Hash)查找法、鍵樹(shù)等。順序查找中假設(shè)對(duì)于η個(gè)記錄的查找表,其查找成功時(shí)的平均查找長(zhǎng)度為 ASL (Average Search Length), ASL=
f概率X比較次數(shù)= 乃XG,且比較次數(shù)為=n-i+l,查找到的概率為Pi= I則 ιUiη
ASL=HP^(H-I)P2+……+2ΡΗ+Ρ。= 1 ^ι+1) = tl,則其算法時(shí)間復(fù)雜度為 0(n)。
η2二分查找法,對(duì)于一般情況下假設(shè)有序表的長(zhǎng)度為n=2h_l,在每個(gè)記錄的查找概
1j ι
率都相等的情況下,即Pi= —,可得其ASL= L Iog2 (n+l)-l,當(dāng)η值大于50,其ASL可
ηη
近似為Iog2 (η+1)-1,故其算法的時(shí)間復(fù)雜度為0 (log2n)0索引查找法,是介于順序查找和二分查找之間的一種方法,又可稱(chēng)為“分塊有序”查找法,即將順序表進(jìn)行分塊,按前一塊的最大關(guān)鍵字小于后一塊中的最小關(guān)鍵字,內(nèi)部關(guān)鍵字不一定有序,假設(shè)索引表的長(zhǎng)度為b,順序表的長(zhǎng)度為η,則其 ASL=ASLlndex (b)+ASLseq(n/b) ^ 1呢2 (b+1 )-1+(n/b+1)/2,故其算法的時(shí)間復(fù)雜度為(0 (1呢2 η)+ 0(η))/2。二叉搜索樹(shù)查找法,對(duì)于有η個(gè)節(jié)點(diǎn)的二叉搜索樹(shù),在平衡情況下其樹(shù)高為10 n,則其每次查找的時(shí)間代價(jià)為0(10 η),而在極端情況下如其η個(gè)節(jié)點(diǎn)成一條直鏈表形則樹(shù)高為η,對(duì)于查找到每個(gè)節(jié)點(diǎn)的時(shí)間代價(jià)為0(η),又知其是插入節(jié)點(diǎn)的遍歷時(shí)間代價(jià)均為0(η),則其總的算法的時(shí)間復(fù)雜度最佳為0(η·1Ο&η),最差為0 (η2)。B-樹(shù)是一種平衡的多路查找樹(shù),對(duì)結(jié)點(diǎn)內(nèi)的關(guān)鍵字(有序)序列進(jìn)行二分查找,如果命中則結(jié)束,否則進(jìn)入查詢(xún)關(guān)鍵字所屬范圍的兒子結(jié)點(diǎn);重復(fù),直到所對(duì)應(yīng)的兒子指針為空,或已經(jīng)是葉子結(jié)點(diǎn),故其算法的時(shí)間復(fù)雜度為0 (10 η)。哈希(Hash)查找法由于自身的散列性使得其在應(yīng)用于分類(lèi)查找中查找效率不高。鍵樹(shù)一般用于特殊查找,從根到葉子節(jié)點(diǎn)的一條“路徑”對(duì)應(yīng)為一個(gè)關(guān)鍵字,不適合通用的大數(shù)據(jù)量的查詢(xún)。當(dāng)前物聯(lián)網(wǎng)通信領(lǐng)域中,通信數(shù)據(jù)技術(shù)的發(fā)展,越來(lái)越趨向于高實(shí)時(shí)性和巨型化。傳統(tǒng)的靜態(tài)查找方法如順序查找、二分查找、索引查找,很難滿(mǎn)足當(dāng)前大數(shù)據(jù)量處理對(duì)實(shí)時(shí)性的要求。而對(duì)于動(dòng)態(tài)查找(DST),如二叉搜索樹(shù),B-樹(shù),哈希(Hash)查找法,鍵樹(shù)等, 其時(shí)間復(fù)雜度遠(yuǎn)遠(yuǎn)高于靜態(tài)查找。
發(fā)明內(nèi)容
本發(fā)明針對(duì)以上不足,提供一種針對(duì)大量數(shù)據(jù)的速度快、能耗低、占用內(nèi)存少、算法簡(jiǎn)單的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法。本發(fā)明提供一種基于分類(lèi)特性和平衡二叉樹(shù)(AVL樹(shù))的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,實(shí)現(xiàn)方法包括以下步驟
1. 1構(gòu)建AVL樹(shù),創(chuàng)建結(jié)點(diǎn);
1.2按照遍歷規(guī)則,動(dòng)態(tài)地將數(shù)據(jù)信息存儲(chǔ)到相應(yīng)結(jié)點(diǎn);
1. 3輸入需要查詢(xún)的信息,動(dòng)態(tài)遍歷AVL樹(shù),直到找到所需的數(shù)據(jù)信息或遍歷完AVL樹(shù)返回查找失敗。所述AVL樹(shù)為有序的,AVL樹(shù)按照順序(中序、前序、后序)遍歷規(guī)則,動(dòng)態(tài)地將數(shù)據(jù)信息存儲(chǔ)到相應(yīng)結(jié)點(diǎn)。所述結(jié)點(diǎn)數(shù)據(jù)儲(chǔ)存結(jié)構(gòu)按實(shí)現(xiàn)的語(yǔ)言分為C語(yǔ)言和C++語(yǔ)言。本發(fā)明的具體實(shí)現(xiàn)方法如下
(1)新建AVL樹(shù),首先按照有AVL樹(shù)的建樹(shù)規(guī)則構(gòu)建一個(gè)節(jié)點(diǎn)數(shù)為n,樹(shù)高為10 η的 AVL樹(shù),然后增加結(jié)點(diǎn)。每一個(gè)結(jié)點(diǎn)代表一個(gè)特征類(lèi)C1^iCiC4......Cn,每個(gè)結(jié)點(diǎn)中又包含一類(lèi)
細(xì)化的信息,結(jié)點(diǎn)中的細(xì)化信息根據(jù)實(shí)現(xiàn)的不同語(yǔ)言而使用不同的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)便于數(shù)據(jù)信息存儲(chǔ)和查找。(2)向AVL樹(shù)中插入數(shù)據(jù)信息,對(duì)于AVL樹(shù)結(jié)點(diǎn)采用順序(中序、前序、后序)遍歷的規(guī)則進(jìn)行插入,其算法的時(shí)間復(fù)雜度為log2n,依據(jù)實(shí)現(xiàn)的語(yǔ)言可分為用C++語(yǔ)言實(shí)現(xiàn)和 C語(yǔ)言實(shí)現(xiàn)
①C++語(yǔ)言實(shí)現(xiàn)采用C++語(yǔ)言中VECTOR類(lèi)作為結(jié)點(diǎn)中數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),當(dāng)有數(shù)據(jù)信息需要存儲(chǔ)時(shí),首先判斷AVL樹(shù)是否為空;若是,則新建一個(gè)根結(jié)點(diǎn)并將數(shù)據(jù)信息保存到根結(jié)點(diǎn)同時(shí)返回保存成功;若否,則遍歷AVL樹(shù),判斷其是否屬于已存儲(chǔ)結(jié)點(diǎn);若是,則按照存儲(chǔ)信息的規(guī)則,將需要保存的信息保存到相應(yīng)結(jié)點(diǎn),并返回保存成功;若否,則執(zhí)行步驟(1), 再將所需保存的數(shù)據(jù)信息保存到新建結(jié)點(diǎn)中,最后由返回函數(shù)將保存結(jié)果返回供上層調(diào)用;
②C語(yǔ)言實(shí)現(xiàn)利用結(jié)構(gòu)體變量構(gòu)建一個(gè)結(jié)構(gòu)體struct,所有結(jié)點(diǎn)采用雙向鏈表的存儲(chǔ)結(jié)構(gòu),將對(duì)結(jié)點(diǎn)的所有操作定義為結(jié)構(gòu)體的成員變量,當(dāng)有數(shù)據(jù)信息需要保存時(shí),首先判斷AVL樹(shù)是否為空;若是,則新建一個(gè)根結(jié)點(diǎn)并將數(shù)據(jù)信息保存到根結(jié)點(diǎn)同時(shí)返回保存成功;若否,則遍歷AVL樹(shù),判斷是否為已存儲(chǔ)結(jié)點(diǎn)類(lèi);若是,則調(diào)用結(jié)構(gòu)體的保存成員對(duì)象執(zhí)行相應(yīng)的保存操作并返回保存成功;若否,則執(zhí)行步驟(1),再將所需保存的數(shù)據(jù)信息保存到新建結(jié)點(diǎn)類(lèi)中,最后由返回函數(shù)將保存結(jié)果返回供上層調(diào)用。(3)查詢(xún)AVL樹(shù)的數(shù)據(jù)信息,根據(jù)有序AVL樹(shù)的時(shí)間復(fù)雜度為0 (log2n),于是查詢(xún)結(jié)點(diǎn)最多需要次訪問(wèn)內(nèi)存,通過(guò)將結(jié)點(diǎn)中的數(shù)據(jù)信息讀取到緩沖區(qū)中,利用二分法查找,其時(shí)間復(fù)雜度也是0 (l0g2n)。依據(jù)結(jié)點(diǎn)的保存實(shí)現(xiàn)方式也可分為用C++語(yǔ)言實(shí)現(xiàn)和C 語(yǔ)言實(shí)現(xiàn)①C++語(yǔ)言實(shí)現(xiàn)當(dāng)輸入查詢(xún)信息時(shí),調(diào)用查找函數(shù),首先判斷AVL樹(shù)是否為空;若是, 則直接返回樹(shù)為空;若否,則遍歷AVL樹(shù),判斷是否為已存儲(chǔ)結(jié)點(diǎn);若是,則繼續(xù)訪問(wèn)結(jié)點(diǎn)信息,并將結(jié)點(diǎn)信息加載到緩存區(qū),利用二分法進(jìn)行查找,并將查詢(xún)結(jié)果給返回函數(shù)供上層調(diào)用;若否,則返回?zé)o結(jié)點(diǎn)類(lèi)給返回函數(shù);
②C語(yǔ)言實(shí)現(xiàn)當(dāng)需要查詢(xún)數(shù)據(jù)信息時(shí),則調(diào)用結(jié)構(gòu)體變量的查找變量及其對(duì)應(yīng)的函數(shù),首先判斷AVL樹(shù)是否為空;若是,則直接返回樹(shù)為空;若否,則遍歷AVL樹(shù),判斷是否為已存儲(chǔ)結(jié)點(diǎn);若是,則調(diào)用結(jié)構(gòu)體的查詢(xún)操作成員對(duì)象執(zhí)行相應(yīng)的查詢(xún)操作,繼續(xù)訪問(wèn)結(jié)點(diǎn)類(lèi)中的細(xì)化信息,直到查詢(xún)到所需結(jié)果或查詢(xún)完所有記錄信息,并將查詢(xún)結(jié)果賦給返回函數(shù)供上層調(diào)用;若否,則返回?zé)o結(jié)點(diǎn)類(lèi)給返回函數(shù)供上層調(diào)用。(4)刪除平衡二叉樹(shù)數(shù)據(jù)信息,刪除時(shí)首先保存刪除的方式和需要?jiǎng)h除的數(shù)據(jù)信息,然后調(diào)用獲取刪除方式(AVLTreeDeleteStyle)函數(shù),具體分以下兩種情況
①當(dāng)AVLTreeDeleteStyle值為刪除結(jié)點(diǎn)Ci時(shí),則直接遍歷AVL樹(shù),查詢(xún)所需要?jiǎng)h除的結(jié)點(diǎn)Ci,若遍歷完所有結(jié)點(diǎn)未找到,則返回?zé)o此結(jié)點(diǎn)刪除失?。蝗粽业街苯觿h除結(jié)點(diǎn)Ci,并返回刪除成功;最后將刪除結(jié)果賦給返回函數(shù)供上層調(diào)用,同時(shí)執(zhí)行步驟(5),調(diào)整平衡二叉樹(shù)的樹(shù)形結(jié)構(gòu);
②當(dāng)AVLTreeDeleteStyle值為刪除結(jié)點(diǎn)Ci中的數(shù)據(jù)時(shí),則首先遍歷AVL樹(shù),查詢(xún)結(jié)點(diǎn) Ci,遍歷完所有結(jié)點(diǎn)未找到則返回?zé)o此結(jié)點(diǎn)信息刪除失?。蝗粽业剿枰?jiǎng)h除的結(jié)點(diǎn)Ci,則繼續(xù)查找結(jié)點(diǎn)中的信息,直到找到所需刪除數(shù)據(jù),將其刪除并返回刪除成功;或者查詢(xún)完所有記錄沒(méi)有找到所需信息,返回?zé)o數(shù)據(jù)記錄刪除失??;最后將刪除結(jié)果賦給返回函數(shù)供上層調(diào)用。
(5)對(duì)平衡二叉樹(shù)(AVL樹(shù))的插入和刪除操作都會(huì)對(duì)樹(shù)形結(jié)構(gòu)產(chǎn)生影響,為了保持對(duì)樹(shù)的遍歷復(fù)雜度最低為log2n,需要對(duì)樹(shù)進(jìn)行平衡化調(diào)整,可分以下四種情況
①平衡二叉樹(shù)的L型旋轉(zhuǎn),當(dāng)AVL樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的左孩子的左子樹(shù)中)或者刪除操作(刪除的結(jié)點(diǎn)是最小子樹(shù)根結(jié)點(diǎn)的右孩子且為葉節(jié)點(diǎn))時(shí),且滿(mǎn)足最小子樹(shù)的平衡因子bf大于1時(shí),則需要進(jìn)行L型旋轉(zhuǎn)來(lái)調(diào)節(jié)AVL樹(shù)的結(jié)構(gòu);
②平衡二叉樹(shù)的R型旋轉(zhuǎn),當(dāng)AVL樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的右孩子的右子樹(shù)中)或者刪除操作(刪除的結(jié)點(diǎn)是最小子樹(shù)根結(jié)點(diǎn)的左孩子且為葉節(jié)點(diǎn))時(shí),且滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的bf小于-1時(shí),需要進(jìn)行R型旋轉(zhuǎn)調(diào)整;
③平衡二叉樹(shù)的LR型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的右孩子的左子樹(shù)中)時(shí),同時(shí)滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)bf小于-1且其左孩子bf大于1時(shí),則需要進(jìn)行LR型旋轉(zhuǎn)來(lái)調(diào)節(jié)AVL樹(shù)的結(jié)構(gòu);
④平衡二叉樹(shù)的RL型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的左孩子的右子樹(shù)中)時(shí),同時(shí)滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的bf大于1且其右孩子bf小于-1時(shí);則需要進(jìn)行RL型旋轉(zhuǎn)來(lái)調(diào)節(jié)AVL樹(shù)的結(jié)構(gòu)。(6)連續(xù)且滿(mǎn)的AVL樹(shù)的遍歷,對(duì)于連續(xù)且滿(mǎn)的結(jié)點(diǎn)數(shù)為η的AVL樹(shù),其共有 L=Iog2I^l結(jié)點(diǎn),CL為當(dāng)前級(jí)數(shù),Da為當(dāng)前級(jí)數(shù)結(jié)點(diǎn)的層距差(相鄰樹(shù)層之間的結(jié)點(diǎn)值的差);那么所有結(jié)點(diǎn)的遍歷公式為根結(jié)點(diǎn)ft·=浐、當(dāng)前結(jié)點(diǎn)的父節(jié)點(diǎn)為PF,其左孩子
=Pf- Dcl,其右孩子 Pk = Pf +Dcl, Dcl = 21^1, CL e [1,L);前序遍歷公式為=Pr= 1,Pl = PF+1, Pe = Pf +Dcl, Dcl = 2l_cl,CL e [1,L);后序遍歷公式為=Pr= 2L_1,PL = Pf-Dcl, Pe =PF-1, Dcl = 2l_cl, CL e [1,L)。本方法與現(xiàn)有方法的比較,具有以下有益效果
(1)本方法算法復(fù)雜度小,實(shí)現(xiàn)簡(jiǎn)單,能實(shí)現(xiàn)快速高效存儲(chǔ)和查詢(xún)。本方法按照AVL樹(shù)的構(gòu)建原則構(gòu)建一棵結(jié)點(diǎn)為η的樹(shù),則其樹(shù)高為h=log2n,即當(dāng)對(duì)數(shù)據(jù)進(jìn)行查詢(xún)時(shí),其遍歷的算法復(fù)雜度不大于0(10 η),同時(shí)在結(jié)點(diǎn)類(lèi)中的信息查詢(xún)采用二分法,其算法復(fù)雜度也是0 (10 η),在當(dāng)前使用的查詢(xún)算法中其算法復(fù)雜度最低,將動(dòng)態(tài)查詢(xún)的時(shí)間復(fù)雜度降低到靜態(tài)查詢(xún)的級(jí)別,大大提高了存儲(chǔ)和查詢(xún)的效率,達(dá)到快速查詢(xún)的要求。(2)本方法算法復(fù)雜度低,有效減少處理器的訪問(wèn)次數(shù),減少能耗。本方法的算法復(fù)雜度在上一特點(diǎn)中已給出,相對(duì)于目前使用的其他算法,算法復(fù)雜度相對(duì)較低,在程序運(yùn)行時(shí),能有效減少處理器對(duì)于內(nèi)存的訪問(wèn)次數(shù),能夠有效降低能耗。(3)本方法能合理靈活的分配存儲(chǔ)空間,節(jié)省內(nèi)存空間,提高內(nèi)存資源利用率。由于此方法是應(yīng)用于動(dòng)態(tài)存儲(chǔ)和查找,對(duì)于資源的分配不是使用額定分配,而是基于所用描述語(yǔ)言的自身特性(例如C++語(yǔ)言中VECTOR,具有自增長(zhǎng)特性;C語(yǔ)言中的雙向鏈表,也具有動(dòng)態(tài)插入特性),達(dá)到動(dòng)態(tài)分配存儲(chǔ)空間。使用C++語(yǔ)言是基于支持VECTOR實(shí)現(xiàn)的,利用VECTOR的本身具有的自增長(zhǎng)特性,將分類(lèi)到具體結(jié)點(diǎn)的元素按需分配存儲(chǔ)單元;而使用 C語(yǔ)言實(shí)現(xiàn)是基于構(gòu)建結(jié)構(gòu)體,利用結(jié)構(gòu)體可以關(guān)聯(lián)成員變量,將其成員變量設(shè)置為一個(gè)函數(shù),當(dāng)有數(shù)據(jù)存入時(shí),先分類(lèi)到特征類(lèi)的結(jié)點(diǎn)處,再按照對(duì)應(yīng)結(jié)點(diǎn)的成員變量的函數(shù)進(jìn)行相應(yīng)處理,并返回相應(yīng)結(jié)果供上層調(diào)用,其內(nèi)在的處理機(jī)制也是利用鏈表進(jìn)行有序存儲(chǔ)。同時(shí)其不完全使用二叉樹(shù)作為存儲(chǔ)載體,節(jié)省了用于二叉樹(shù)前后指針的存儲(chǔ)空間,從而有效節(jié)省內(nèi)存資源。(4)可支持多種語(yǔ)言實(shí)現(xiàn),應(yīng)用范圍廣泛。本發(fā)明方法可以基于C++/C語(yǔ)言實(shí)現(xiàn), 此兩種語(yǔ)言是當(dāng)前描述語(yǔ)言的主流,可以將此方法應(yīng)用于大型的數(shù)據(jù)庫(kù)平臺(tái),也可以應(yīng)用于小型的數(shù)據(jù)終端使用,使其應(yīng)用范圍得到有效擴(kuò)展。
圖1是本發(fā)明實(shí)施例AVL樹(shù)存儲(chǔ)結(jié)構(gòu)圖; 圖2是本發(fā)明實(shí)施例AVL樹(shù)插入流程圖3是本發(fā)明實(shí)施例AVL樹(shù)查找流程圖; 圖4是本發(fā)明實(shí)施例AVL樹(shù)刪除流程圖; 圖5是本發(fā)明實(shí)施例AVL樹(shù)L型旋轉(zhuǎn)示意圖; 圖6是本發(fā)明實(shí)施例AVL樹(shù)R型旋轉(zhuǎn)示意圖; 圖7是本發(fā)明實(shí)施例AVL樹(shù)LR型旋轉(zhuǎn)示意圖; 圖8是本發(fā)明實(shí)施例AVL樹(shù)RL型旋轉(zhuǎn)示意圖; 圖9是本發(fā)明實(shí)施例AVL樹(shù)后序存儲(chǔ)結(jié)構(gòu)圖; 圖10是本發(fā)明實(shí)施例AVL樹(shù)前序存儲(chǔ)結(jié)構(gòu)圖。
具體實(shí)施例方式下面結(jié)合附圖和實(shí)例對(duì)本發(fā)明作進(jìn)一步描述,以中序遍歷為例。本發(fā)明是應(yīng)用于物聯(lián)網(wǎng)通信領(lǐng)域的大數(shù)據(jù)量的數(shù)據(jù)存儲(chǔ)和快速查詢(xún)方法。例如,對(duì)物聯(lián)網(wǎng)中終端場(chǎng)所內(nèi)的50000人(結(jié)點(diǎn)數(shù)N=50000),其中IC卡號(hào)(1字節(jié))、姓名(10字節(jié))、人員編號(hào)(2字節(jié)),考勤信息(2字節(jié)),協(xié)查通報(bào)信息(200字節(jié))以及其他有關(guān)信息進(jìn)行統(tǒng)一管理,終端RAM空間資源為8M,對(duì)于數(shù)據(jù)信息的查詢(xún)可以使用刷卡和手動(dòng)兩種方式查詢(xún)。針對(duì)于以上需求,用本發(fā)明來(lái)實(shí)現(xiàn),采用AVL樹(shù)作為結(jié)點(diǎn)類(lèi)索引,AVL樹(shù)內(nèi)依次保存左指針(4字節(jié)),IC卡號(hào)(1字節(jié)),結(jié)點(diǎn)信息保存地址(2字節(jié)),右指針(4字節(jié)),總共需要 11X50000 ^ 530Kb ο(1)首先建一棵AVL樹(shù)的根結(jié)點(diǎn),參照附圖1,構(gòu)建一個(gè)復(fù)雜度為10&N (N為結(jié)點(diǎn)數(shù))的平衡二叉樹(shù),調(diào)用創(chuàng)建結(jié)點(diǎn)(AVLTreeCreate)函數(shù),增加AVL樹(shù)的結(jié)點(diǎn)。每一個(gè)結(jié)點(diǎn)代表一個(gè)人CliC2iC3iC4......Cn,每個(gè)結(jié)點(diǎn)又包含一類(lèi)細(xì)化信息DliD2i D3i D4......Dn(包括個(gè)人資料、
考勤信息等),結(jié)點(diǎn)中的細(xì)化信息根據(jù)實(shí)現(xiàn)的語(yǔ)言不同而使用不同的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),便于數(shù)據(jù)信息存儲(chǔ)和查找。(2)然后向AVL樹(shù)中存入數(shù)據(jù)信息,可參考附圖2,此處對(duì)于AVL樹(shù)采用中序遍歷的規(guī)則向結(jié)點(diǎn)中插入數(shù)據(jù)信息,其算法復(fù)雜度為log2n,其存儲(chǔ)結(jié)點(diǎn)以IC卡號(hào)為關(guān)鍵字Key 區(qū)分,可分為用C++語(yǔ)言實(shí)現(xiàn)和C語(yǔ)言實(shí)現(xiàn)。①C++語(yǔ)言實(shí)現(xiàn)當(dāng)有人進(jìn)行刷卡或者手動(dòng)輸入卡號(hào)時(shí),保存卡號(hào)信息,首先判斷樹(shù)是否為空;若是,則執(zhí)行AVLTreeCreate函數(shù)新建一個(gè)結(jié)點(diǎn)類(lèi);若否,則遍歷AVL樹(shù),判斷其是否屬于已存儲(chǔ)結(jié)點(diǎn),若是,則執(zhí)行插入(AVLTreelnsert)函數(shù),讀取文件中的結(jié)點(diǎn)數(shù)據(jù)信息并加載到緩存中,然后執(zhí)行保存到文件(AVLTreeSaveToFile)函數(shù),將數(shù)據(jù)按照存儲(chǔ)結(jié)點(diǎn)的格式(如刷卡時(shí)間、上報(bào)時(shí)間以及日期等)保存到文件中相應(yīng)結(jié)點(diǎn)信息類(lèi)的VECTOR中; 若否,則執(zhí)行AVLTreeCreate函數(shù),為其新建一個(gè)結(jié)點(diǎn),再將所需保存的數(shù)據(jù)信息保存到新建結(jié)點(diǎn)類(lèi)中。②C語(yǔ)言實(shí)現(xiàn)基于C語(yǔ)言實(shí)現(xiàn)是利用結(jié)構(gòu)體變量去構(gòu)建一個(gè)結(jié)構(gòu)體,將對(duì)數(shù)據(jù)信息的操作定義為一個(gè)結(jié)構(gòu)體TPvector,結(jié)構(gòu)體的成員變量是對(duì)數(shù)據(jù)的操作, 如(插入 hsert,刪除 Delete,查找 karch,后翻 PushBack,前翻 PushFront )。當(dāng)有人進(jìn)行刷卡或者手動(dòng)輸入卡號(hào)時(shí),保存卡號(hào)信息,首先判斷樹(shù)是否為空;若是,則調(diào)用 AVLTreeCreate函數(shù)新建一個(gè)結(jié)點(diǎn);若否,則遍歷AVL樹(shù),判斷其是否屬于已存儲(chǔ)結(jié)點(diǎn),若是,則執(zhí)行AVLTreelnsert函數(shù),讀取文件中的結(jié)點(diǎn)數(shù)據(jù)信息并加載到緩存中,然后執(zhí)行 AVLTreeSaveToFile函數(shù),將數(shù)據(jù)按照存儲(chǔ)結(jié)點(diǎn)類(lèi)的格式(如刷卡時(shí)間、上報(bào)時(shí)間以及日期等)保存到相應(yīng)結(jié)點(diǎn)的文件中;若否,則執(zhí)行AVLTreeCreate函數(shù),為其新建一個(gè)結(jié)點(diǎn),再將所需保存的數(shù)據(jù)信息保存到新建結(jié)點(diǎn)中。(3)查詢(xún)AVL樹(shù)中的信息,可參照附圖3,此處AVL樹(shù)的查詢(xún)依據(jù)中序順序訪問(wèn),時(shí)間復(fù)雜度10 η,依據(jù)結(jié)點(diǎn)的保存實(shí)現(xiàn)方式也可分為用C++語(yǔ)言實(shí)現(xiàn)和C語(yǔ)言實(shí)現(xiàn)。①C++語(yǔ)言實(shí)現(xiàn)當(dāng)有人進(jìn)行刷卡或者手動(dòng)輸入卡號(hào)時(shí),保存卡號(hào)信息,并通過(guò)上層調(diào)用查找(AVLTreeSearch)函數(shù),首先判斷AVL樹(shù)是否為空;若是,則跳轉(zhuǎn)結(jié)束返回樹(shù)為空,若否,則按中序遍歷AVL樹(shù),將保存的卡號(hào)與平衡二叉樹(shù)的訪問(wèn)結(jié)點(diǎn)關(guān)鍵字(key)進(jìn)行比較,判斷是否為已存儲(chǔ)結(jié)點(diǎn),若是,則讀取文件信息并加載到緩存中,按照查詢(xún)的方式 (如按輸入號(hào)查找,查找當(dāng)前的前一條,查找當(dāng)前后一條,查找需要?jiǎng)h除的信息等)利用二分法繼續(xù)查詢(xún)結(jié)點(diǎn)中的信息,若找到所需要的查詢(xún)信息,將查詢(xún)結(jié)果通過(guò)返回函數(shù)返回供上層調(diào)用;若查詢(xún)完所有記錄沒(méi)有找到所需信息,則將無(wú)數(shù)據(jù)記錄賦給返回函數(shù)供上層調(diào)用; 若否,則將無(wú)此結(jié)點(diǎn)數(shù)據(jù)賦給返回函數(shù)供上層調(diào)用。②C語(yǔ)言實(shí)現(xiàn)定義一個(gè)結(jié)構(gòu)體TPVector,結(jié)構(gòu)體的成員變量是對(duì)數(shù)據(jù)的操作, 如(插入Insert,刪除Delete,查詢(xún)karch, 后翻PushBack,前翻PushFront)。當(dāng)有人進(jìn)行刷卡或者手動(dòng)輸入卡號(hào)時(shí),保存卡號(hào)信息,并調(diào)用結(jié)構(gòu)體的查找成員對(duì)象TPVector. AVLTreeSearch,調(diào)用查找(AVLTreeSearch)函數(shù),首先判斷AVL樹(shù)是否為空;若是,則跳轉(zhuǎn)結(jié)束返回樹(shù)為空;若否,則遍歷AVL樹(shù),判斷其是否為已存儲(chǔ)結(jié)點(diǎn),若是,則讀取文件信息并加載到緩存中,按照查詢(xún)的方式(如按輸入號(hào)查找,PushFront, PushBack, Delete等)利用二分法繼續(xù)查詢(xún)結(jié)點(diǎn)中的信息,若找到所需要的信息,將查詢(xún)結(jié)果通過(guò)返回函數(shù)返回供上層調(diào)用;若查詢(xún)完所有記錄沒(méi)有找到所需信息,則將無(wú)數(shù)據(jù)記錄賦給返回函數(shù)供上層調(diào)用; 若否,則將無(wú)此結(jié)點(diǎn)數(shù)據(jù)賦給返回函數(shù)供上層調(diào)用。(4)刪除AVL樹(shù)中的信息,可參照附圖4,刪除時(shí)首先保存刪除的方式 (AVLTreeDeleteStyle)和需要?jiǎng)h除的數(shù)據(jù)信息,然后判斷AVL樹(shù)是否為空;若是,則直接跳轉(zhuǎn)結(jié)束返回樹(shù)為空,若否則遍歷AVL樹(shù),具體分以下兩種情況
①當(dāng)AVLTreeDeleteStyle值為刪除結(jié)點(diǎn)時(shí),則直接遍歷AVL樹(shù),找到所需要?jiǎng)h除的結(jié)點(diǎn),直接刪除整個(gè)結(jié)點(diǎn),并將刪除結(jié)果賦給返回函數(shù)供上層調(diào)用,同時(shí)調(diào)用平衡化函數(shù)調(diào)整 AVL樹(shù)的樹(shù)形結(jié)構(gòu)。②當(dāng)AVLTreeDeleteStyle值為刪除結(jié)點(diǎn)中數(shù)據(jù)時(shí),則首先遍歷AVL樹(shù),判斷其是否為以存儲(chǔ)結(jié)點(diǎn);若否,則跳轉(zhuǎn)結(jié)束返回?zé)o數(shù)據(jù)記錄;若是,則調(diào)用LoadAVLTreeNode函數(shù)繼續(xù)查找結(jié)點(diǎn)中的信息,若找到,則刪除查找到的信息,并將刪除結(jié)果賦給返回函數(shù)供上層調(diào)用;若查詢(xún)完所有記錄沒(méi)有找到所需信息,則將無(wú)此記錄結(jié)果賦給返回函數(shù)供上層調(diào)用。(5)調(diào)整AVL樹(shù)。AVL樹(shù)的插入和刪除操作都會(huì)對(duì)樹(shù)形結(jié)構(gòu)產(chǎn)生影響,導(dǎo)致平衡因子bf (balance factor)大于1或小于-1,為了保持對(duì)樹(shù)的時(shí)間復(fù)雜度最低為log2n,需要對(duì)樹(shù)進(jìn)行平衡化調(diào)整,對(duì)樹(shù)形的調(diào)整可分以下四種情況
①平衡二叉樹(shù)的L型旋轉(zhuǎn),當(dāng)AVL樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的左孩子的左子樹(shù)中)或者刪除操作(刪除的結(jié)點(diǎn)是最小子樹(shù)根結(jié)點(diǎn)的右孩子且為葉節(jié)點(diǎn))時(shí),且滿(mǎn)足最小子樹(shù)的bf大于1時(shí),則需要進(jìn)行L型旋轉(zhuǎn)來(lái)調(diào)節(jié)AVL樹(shù)的結(jié)構(gòu)。參照?qǐng)D5,當(dāng)插入Cn時(shí),導(dǎo)致最小子樹(shù)的根結(jié)點(diǎn)A的bf變?yōu)?,則需要進(jìn)行L旋轉(zhuǎn)調(diào)整,首先將 提升為新子樹(shù)的根結(jié)點(diǎn),A下降為 的右孩子,同時(shí)將4旋轉(zhuǎn)為 的左孩子,B下降為4的右孩子;當(dāng)刪除結(jié)點(diǎn)Ak時(shí),導(dǎo)致最小子樹(shù)的根結(jié)點(diǎn)A的bf變?yōu)?,則需要進(jìn)行L旋轉(zhuǎn)調(diào)整,將 提升為最小子樹(shù)根結(jié)點(diǎn),A旋轉(zhuǎn)為 的右孩子,B旋轉(zhuǎn)為 的左孩子。②平衡二叉樹(shù)的R型旋轉(zhuǎn),當(dāng)AVL樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的右孩子的右子樹(shù)中)或者刪除操作(刪除的結(jié)點(diǎn)是最小子樹(shù)根結(jié)點(diǎn)的左孩子且為葉節(jié)點(diǎn))時(shí),且滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的bf小于-1時(shí),需要進(jìn)行R型旋轉(zhuǎn)調(diào)整。參照?qǐng)D6,當(dāng)插入Cn時(shí),導(dǎo)致最小子樹(shù)的根結(jié)點(diǎn)A的bf變?yōu)?2,則需要進(jìn)行R旋轉(zhuǎn)調(diào)整;首先提升B為最小子樹(shù)的根結(jié)點(diǎn),A下降為B的左孩子,將&旋轉(zhuǎn)為A的右孩子; 當(dāng)刪除慫時(shí),導(dǎo)致最小子樹(shù)的根結(jié)點(diǎn)A的bf變?yōu)?2,則需要進(jìn)行R旋轉(zhuǎn),首先提升B為最小子樹(shù)的根結(jié)點(diǎn),Bl旋轉(zhuǎn)為B的左孩子,A旋轉(zhuǎn)為&的左孩子。
③平衡二叉樹(shù)的LR型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的右孩子的左子樹(shù)中)時(shí),同時(shí)滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)bf小于-1且其左孩子bf大于1時(shí),則需要進(jìn)行LR型旋轉(zhuǎn)來(lái)調(diào)節(jié)AVL樹(shù)的結(jié)構(gòu)。參照?qǐng)D7,當(dāng)插入Cn時(shí)導(dǎo)致最小子樹(shù)的根結(jié)點(diǎn)A的bf變?yōu)?2且其左孩子B的bf 變?yōu)?,則需要進(jìn)行LR旋轉(zhuǎn)調(diào)整,首先進(jìn)行L旋轉(zhuǎn),將Q提升為右子樹(shù)的根結(jié)點(diǎn),Ck旋轉(zhuǎn)為 Cl的右孩子,C旋轉(zhuǎn)為Ck的左孩子,B旋轉(zhuǎn)為Ck的右孩子;此時(shí)進(jìn)行R旋轉(zhuǎn),提升C為最小子樹(shù)的根結(jié)點(diǎn),A為C的左孩子且Q旋轉(zhuǎn)為A的右孩子,B旋轉(zhuǎn)為C的右孩子,Ce旋轉(zhuǎn)為B 的左孩子。④平衡二叉樹(shù)的RL型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入(插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的左孩子的右子樹(shù)中)時(shí),同時(shí)滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的bf大于1且其右孩子bf小于-1時(shí); 則需要進(jìn)行LR型旋轉(zhuǎn)來(lái)調(diào)節(jié)AVL樹(shù)的結(jié)構(gòu)。參照?qǐng)D8,當(dāng)插入Cn時(shí)導(dǎo)致最小子樹(shù)的根結(jié)點(diǎn)A的bf變?yōu)?且其左孩子B的bf 變?yōu)開(kāi)2,則需要進(jìn)行RL旋轉(zhuǎn)調(diào)整,首先進(jìn)行R旋轉(zhuǎn),將C提升為左子樹(shù)的根結(jié)點(diǎn),B下降為 C的左孩子,將Q旋轉(zhuǎn)為B的右孩子;此時(shí)進(jìn)行L旋轉(zhuǎn),將C提升為最小子樹(shù)的根結(jié)點(diǎn),A下降為C的右孩子,將Ck旋轉(zhuǎn)為A的左孩子。(6)實(shí)際情況下AVL樹(shù)的遍歷,對(duì)于連續(xù)且滿(mǎn)的結(jié)點(diǎn)數(shù)為50000的AVL樹(shù),其共有 L= Iog2 50000< Iog2 65536=16級(jí)結(jié)點(diǎn),CL為當(dāng)前級(jí)數(shù),Da為當(dāng)前級(jí)數(shù)結(jié)點(diǎn)的層距差;那么所有結(jié)點(diǎn)的遍歷公式為根結(jié)點(diǎn)ft·=浐、當(dāng)前結(jié)點(diǎn)的父節(jié)點(diǎn)為PF,其左孩子= Pf- Dcl, 其右孩子 Pe = Pf +Dcl, Dcl = 2咖,CL e [1,L)。當(dāng)需要尋找結(jié)點(diǎn)序號(hào)為20000時(shí),即n=20000,則由214<20000<215 =32768可知, 目標(biāo)結(jié)點(diǎn)在根結(jié)點(diǎn)的左子樹(shù)中,第一次查找Pl =32768-214=16384,Pe = 32768+214=49152 ; 顯然目標(biāo)結(jié)點(diǎn)在其左子樹(shù)中,第二次查找Pl=16384-213=8192,Pe = 16384+213=24576 ;顯然目標(biāo)結(jié)點(diǎn)在其右子樹(shù)中,第三次查找Pl = 24576-212=20480,Pe =24576+212=28672 ;則執(zhí)行第四次查找 Pl =20480-2n=18332, Pe = 20480+2"=22528 ;執(zhí)行第五次,Pl =18332_21CI=17^4, Pe = 18332+210=19880 ;執(zhí)行第六次,Pl =19880_29=19368,Pe = 198 80+29=20 3 9 2 ;執(zhí)行第七次,Pl =20 3 9 2-28=20 1 36,Pe = 20 3 9 2+28=20 6 48 ;執(zhí)行第八次,Pl =20136_27=20008,Pe =20136+27=2(^64 ;執(zhí)行第九次,Pl =20 0 08-26=199 44,Pk = 20 0 08+26=20 0 7 2 ;執(zhí)行第十次,Pl =19944-25=19912,Pe = 19944+25=19976 ;執(zhí)行第i^一次,Pl =19976_24=199 60,Pe = 199 76+24=199 9 2 ;執(zhí)行第十二次,Pl =19992_23=19984,Pe = 19992+23=20000 ;此時(shí)查找到所需要的目標(biāo)結(jié)點(diǎn)。本發(fā)明公布了一種基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,上述實(shí)例給出了基于中序遍歷的整個(gè)方法過(guò)程,下面給出基于前序和后序遍歷的方法分別如圖9和圖10。圖9公布的是基于前序遍歷AVL樹(shù)的存儲(chǔ)結(jié)構(gòu)圖,與中序遍歷存儲(chǔ)結(jié)構(gòu)差異在于, 當(dāng)對(duì)數(shù)據(jù)信息進(jìn)行存儲(chǔ)和查詢(xún)時(shí)是按照根左右的順序來(lái)遍歷的,那么所有結(jié)點(diǎn)的遍歷公式為根結(jié)點(diǎn)Pr=l,當(dāng)前結(jié)點(diǎn)的父節(jié)點(diǎn)為PF,其左孩子= PF+1,其右孩子Pk = Pf +Dcl, Dcl =2l_cl, CL e [1,L)。圖10公布的是基于后序遍歷AVL樹(shù)的存儲(chǔ)結(jié)構(gòu)圖,其按照左右根的遍歷順序存儲(chǔ)和查詢(xún)AVL樹(shù),與前序和中序不同在于其結(jié)點(diǎn)的遍歷公式為根結(jié)點(diǎn)ft·= 21-1,當(dāng)前結(jié)點(diǎn)的父節(jié)點(diǎn)為 PF,其左孩子 Pl = Pf -Dcl,其右孩子 Pk = Pf -1,Dcl = 2L"CL, CL e [1,L)。上述實(shí)例中,內(nèi)存資源為8M的情況下,要求結(jié)點(diǎn)數(shù)N為50000,那么應(yīng)用AVL樹(shù)其建立二叉樹(shù)的高度H為10 50000< Iog2 65536=16,即樹(shù)高h(yuǎn)=16,那么查找樹(shù)的時(shí)間復(fù)雜度也是16,那么查找到任何一個(gè)結(jié)點(diǎn)最多需要訪問(wèn)16次內(nèi)存。對(duì)于50000個(gè)結(jié)點(diǎn)10000000 條數(shù)據(jù)記錄,平均每個(gè)結(jié)點(diǎn)為200條,再對(duì)這200條記錄信息實(shí)行二分法查找,算法復(fù)雜度也是0(1呢2 200) < 8,也就是最多8次可以確定所要查找的數(shù)據(jù)。此方法利用有序AVL樹(shù)結(jié)構(gòu)將數(shù)據(jù)信息按分類(lèi)特性來(lái)存儲(chǔ)和查詢(xún),使得其存儲(chǔ)結(jié)點(diǎn)類(lèi)的AVL樹(shù)的時(shí)間復(fù)雜度為O(Iog2N),同時(shí)查找具體信息采用將數(shù)據(jù)加載到緩存區(qū)利用二分法來(lái)完成,其時(shí)間復(fù)雜度也為O(Iog2N),較當(dāng)前常用查詢(xún)方法其算法復(fù)雜度最小,大大提高了查詢(xún)效率,節(jié)省查詢(xún)時(shí)間,減少了內(nèi)存訪問(wèn)次數(shù),降低了能耗。同時(shí)利用二叉樹(shù)索引的存儲(chǔ)方式,節(jié)省了存儲(chǔ)二叉樹(shù)前后指針的內(nèi)存空間(8bXN,N結(jié)點(diǎn)數(shù)),實(shí)現(xiàn)動(dòng)態(tài)的插入, 靈活的分配了資源空間,提高了內(nèi)存利用率。
權(quán)利要求
1. 一種基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,包括以下步驟1.1構(gòu)建平衡二叉樹(shù),創(chuàng)建結(jié)點(diǎn);1. 2按照遍歷的規(guī)則,動(dòng)態(tài)地將數(shù)據(jù)信息存儲(chǔ)到相應(yīng)結(jié)點(diǎn);1.3輸入需要查詢(xún)的信息,動(dòng)態(tài)遍歷平衡二叉樹(shù),直到找到所需的數(shù)據(jù)信息或遍歷完平衡二叉樹(shù)返回查找失敗。
2.根據(jù)權(quán)利要求1所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,所述平衡二叉樹(shù)為有序的,可以按照中序、前序或后序的遍歷規(guī)則,動(dòng)態(tài)地將數(shù)據(jù)信息存儲(chǔ)到相應(yīng)結(jié)點(diǎn)。
3.根據(jù)權(quán)利要求1所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,所述步驟1.1,按如下方法實(shí)現(xiàn)首先按照平衡二叉樹(shù)的建樹(shù)規(guī)則構(gòu)建一個(gè)節(jié)點(diǎn)數(shù)為 n,樹(shù)高為10 !!的平衡二叉樹(shù),然后增加結(jié)點(diǎn),每一個(gè)結(jié)點(diǎn)代表一個(gè)特征類(lèi)C^C2X3X4…… Cn,每個(gè)結(jié)點(diǎn)包含一類(lèi)細(xì)化的信息。
4.根據(jù)權(quán)利要求1所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,結(jié)點(diǎn)數(shù)據(jù)以C語(yǔ)言或C++語(yǔ)言的形式存儲(chǔ)。
5.根據(jù)權(quán)利要求1所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,所述步驟1. 2,對(duì)數(shù)據(jù)信息的插入,可以按照中序、前序或后序的遍歷規(guī)則對(duì)結(jié)點(diǎn)進(jìn)行數(shù)據(jù)信息的插入,同時(shí)調(diào)整平衡二叉樹(shù)的樹(shù)形結(jié)構(gòu),可分為利用C++語(yǔ)言形式實(shí)現(xiàn)和利用C 語(yǔ)言形式實(shí)現(xiàn)①C++語(yǔ)言形式實(shí)現(xiàn)采用C++語(yǔ)言中VECTOR類(lèi)作為結(jié)點(diǎn)中數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),當(dāng)有數(shù)據(jù)信息需要存儲(chǔ)時(shí),首先判斷平衡二叉樹(shù)是否為空;若是,則新建一個(gè)根結(jié)點(diǎn)并將數(shù)據(jù)信息保存到根結(jié)點(diǎn)同時(shí)返回保存成功;若否,則遍歷平衡二叉樹(shù),判斷其是否屬于已存儲(chǔ)結(jié)點(diǎn);若是,則按照存儲(chǔ)信息的規(guī)則,將需要保存的信息保存到相應(yīng)結(jié)點(diǎn),并返回保存成功;若否,則執(zhí)行步驟1. 1,再將所需保存的數(shù)據(jù)信息保存到新建結(jié)點(diǎn)中,最后由返回函數(shù)將保存結(jié)果返回供上層調(diào)用;②C語(yǔ)言實(shí)現(xiàn)利用結(jié)構(gòu)體變量構(gòu)建一個(gè)結(jié)構(gòu)體struct,所有結(jié)點(diǎn)采用雙向鏈表的存儲(chǔ)結(jié)構(gòu),將對(duì)結(jié)點(diǎn)的所有操作定義為結(jié)構(gòu)體的成員變量,當(dāng)有數(shù)據(jù)信息需要保存時(shí),首先判斷平衡二叉樹(shù)是否為空;若是,則新建一個(gè)根結(jié)點(diǎn)并將數(shù)據(jù)信息保存到根結(jié)點(diǎn)同時(shí)返回保存成功;若否,則遍歷平衡二叉樹(shù),判斷是否為已存儲(chǔ)結(jié)點(diǎn)類(lèi);若是,則調(diào)用結(jié)構(gòu)體的保存成員對(duì)象執(zhí)行相應(yīng)的保存操作并返回保存成功;若否,則執(zhí)行步驟1. 1,再將所需保存的數(shù)據(jù)信息保存到新建結(jié)點(diǎn)類(lèi)中,最后由返回函數(shù)將保存結(jié)果返回供上層調(diào)用。
6.根據(jù)權(quán)利要求1至5中任何一項(xiàng)所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,所述步驟1. 3中結(jié)點(diǎn)數(shù)據(jù)信息的查詢(xún),通過(guò)將結(jié)點(diǎn)中的數(shù)據(jù)信息讀取到緩沖區(qū)中,利用二分法查找,可分為利用C++語(yǔ)言形式實(shí)現(xiàn)和利用C語(yǔ)言形式實(shí)現(xiàn)①C++語(yǔ)言實(shí)現(xiàn)當(dāng)輸入查詢(xún)信息時(shí),首先判斷平衡二叉樹(shù)是否為空;若是,則直接返回樹(shù)為空;若否,則遍歷平衡二叉樹(shù),判斷是否為已存儲(chǔ)結(jié)點(diǎn);若是,則繼續(xù)訪問(wèn)結(jié)點(diǎn)信息, 并將結(jié)點(diǎn)信息加載到緩存.區(qū),利用二分法進(jìn)行查找,并將查詢(xún)結(jié)果給返回函數(shù)供上層調(diào)用;若否,則返回?zé)o結(jié)點(diǎn)類(lèi)給返回函數(shù);②C語(yǔ)言實(shí)現(xiàn)利用結(jié)構(gòu)體變量去構(gòu)建一個(gè)結(jié)構(gòu)體struct,所有結(jié)點(diǎn)采用雙向鏈表的存儲(chǔ)結(jié)構(gòu),將對(duì)結(jié)點(diǎn)的所有操作定義為結(jié)構(gòu)體的成員對(duì)象;當(dāng)需要查詢(xún)數(shù)據(jù)信息時(shí),首先判斷平衡二叉樹(shù)是否為空;若是,則直接返回樹(shù)為空;若否,則遍歷平衡二叉樹(shù),判斷是否為已存儲(chǔ)結(jié)點(diǎn);若是,則調(diào)用結(jié)構(gòu)體的查詢(xún)操作成員對(duì)象執(zhí)行相應(yīng)的查詢(xún)操作,繼續(xù)訪問(wèn)結(jié)點(diǎn)類(lèi)中的細(xì)化信息,直到查詢(xún)到所需結(jié)果或查詢(xún)完所有記錄信息,并將查詢(xún)結(jié)果賦給返回函數(shù)供上層調(diào)用;若否,則返回?zé)o結(jié)點(diǎn)類(lèi)給返回函數(shù)供上層調(diào)用。
7.根據(jù)權(quán)利要求6所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征還在于,平衡二叉樹(shù)的刪除操作可分為兩類(lèi),刪除結(jié)點(diǎn)和刪除結(jié)點(diǎn)中的數(shù)據(jù);刪除時(shí)首先保存刪除的方式和需要?jiǎng)h除的數(shù)據(jù)信息,然后調(diào)用獲取刪除方式的AVLTreeDeleteStyle函數(shù),具體分以下兩種情況①當(dāng)AVLTreeDeleteStyle值為刪除結(jié)點(diǎn)Ci時(shí),則直接遍歷平衡二叉樹(shù),查詢(xún)所需要?jiǎng)h除的結(jié)點(diǎn)Ci,若遍歷完所有結(jié)點(diǎn)未找到,則返回?zé)o此結(jié)點(diǎn)刪除失??;若找到直接刪除結(jié)點(diǎn) Ci,并返回刪除成功;最后將刪除結(jié)果賦給返回函數(shù)供上層調(diào)用,同時(shí)調(diào)整平衡二叉樹(shù)的樹(shù)形結(jié)構(gòu);②當(dāng)AVLTreeDeleteStyle值為刪除結(jié)點(diǎn)Ci中的數(shù)據(jù)時(shí),則首先遍歷平衡二叉樹(shù),查詢(xún)結(jié)點(diǎn)Ci,遍歷完所有結(jié)點(diǎn)未找到則返回?zé)o此結(jié)點(diǎn)信息刪除失敗;若找到所需要?jiǎng)h除的結(jié)點(diǎn) Ci,則繼續(xù)查找結(jié)點(diǎn)中的信息,直到找到所需刪除數(shù)據(jù),將其刪除并返回刪除成功;或者查詢(xún)完所有記錄沒(méi)有找到所需信息,返回?zé)o數(shù)據(jù)記錄刪除失?。蛔詈髮h除結(jié)果賦給返回函數(shù)供上層調(diào)用。
8.根據(jù)權(quán)利要求6或7所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征在于,對(duì)平衡二叉樹(shù)進(jìn)行平衡化調(diào)整,分為以下四種情況①平衡二叉樹(shù)的L型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入且插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的左孩子的左子樹(shù)中,或者刪除操作且刪除的結(jié)點(diǎn)是最小子樹(shù)根結(jié)點(diǎn)的右孩子且為葉節(jié)點(diǎn)時(shí), 且滿(mǎn)足最小子樹(shù)的平衡因子bf大于1時(shí),則需要進(jìn)行L型旋轉(zhuǎn)來(lái)調(diào)節(jié)平衡二叉樹(shù)的結(jié)構(gòu);②平衡二叉樹(shù)的R型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入且插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的右孩子的右子樹(shù)中,或者刪除操作且刪除的結(jié)點(diǎn)是最小子樹(shù)根結(jié)點(diǎn)的左孩子且為葉節(jié)點(diǎn)時(shí), 且滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的平衡因子bf小于-1時(shí),需要進(jìn)行R型旋轉(zhuǎn)來(lái)調(diào)節(jié)平衡二叉樹(shù)的結(jié)構(gòu);③平衡二叉樹(shù)的LR型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入且插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的右孩子的左子樹(shù)中時(shí),同時(shí)滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的平衡因子bf小于-1且其左孩子的平衡因子bf大于1時(shí),則需要進(jìn)行LR型旋轉(zhuǎn)來(lái)調(diào)節(jié)平衡二叉樹(shù)的結(jié)構(gòu);④平衡二叉樹(shù)的RL型旋轉(zhuǎn),當(dāng)平衡二叉樹(shù)進(jìn)行插入且插入結(jié)點(diǎn)在最小子樹(shù)根結(jié)點(diǎn)的左孩子的右子樹(shù)中時(shí),同時(shí)滿(mǎn)足最小子樹(shù)根結(jié)點(diǎn)的平衡因子bf大于1且其右孩子的平衡因子bf小于-1時(shí);則需要進(jìn)行RL型旋轉(zhuǎn)來(lái)調(diào)節(jié)平衡二叉樹(shù)的結(jié)構(gòu)。
9.根據(jù)權(quán)利要求8所述的基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,其特征還在于,連續(xù)且滿(mǎn)的結(jié)點(diǎn)數(shù)為η的平衡二叉樹(shù),其共有L=l0&n級(jí)結(jié)點(diǎn),CL為當(dāng)前級(jí)數(shù),Dcl 為當(dāng)前級(jí)數(shù)結(jié)點(diǎn)的層距差,層距差為相鄰樹(shù)層之間的結(jié)點(diǎn)值的差;那么所有結(jié)點(diǎn)的中序遍歷公式為根結(jié)點(diǎn)Pr=滬―1,當(dāng)前結(jié)點(diǎn)的父節(jié)點(diǎn)為PF,其左孩子= Pf- Dcl,其右孩子= Pf +Dcl, Dcl = 21^1, CL e [1,L);前序遍歷公式為:Pr= 1,PL = PF+1, Pe = Pf +Dcl, Dcl = 2L_a,CL e [1, L);后序遍歷公式為Pr= 2l-1, Pl = Pf-Dcl, Pe = PF_1,Dcl = 2L^L, CL e [1,L)。
全文摘要
本發(fā)明公布了一種基于分類(lèi)特性和平衡二叉樹(shù)的數(shù)據(jù)存儲(chǔ)、查詢(xún)方法,通過(guò)構(gòu)建平衡二叉樹(shù),創(chuàng)建結(jié)點(diǎn);可以按照3種順序中序、前序、后續(xù)遍歷規(guī)則,動(dòng)態(tài)地將數(shù)據(jù)信息分類(lèi)存儲(chǔ)到相應(yīng)結(jié)點(diǎn);輸入查詢(xún)內(nèi)容,動(dòng)態(tài)遍歷AVL樹(shù),得到所需的數(shù)據(jù)信息。本發(fā)明將動(dòng)態(tài)查詢(xún)的時(shí)間復(fù)雜度降低到靜態(tài)查詢(xún)級(jí)別,大大提高了存儲(chǔ)和查詢(xún)的效率,具有速度快、能耗低、占內(nèi)存少、算法簡(jiǎn)單的優(yōu)點(diǎn),而且可用多種語(yǔ)言實(shí)現(xiàn)。該方法廣泛適用于通信領(lǐng)域中的數(shù)據(jù)管理,尤其是物聯(lián)網(wǎng)通信中大數(shù)據(jù)量的數(shù)據(jù)存儲(chǔ)和查詢(xún)。
文檔編號(hào)G06F17/30GK102521334SQ20111040373
公開(kāi)日2012年6月27日 申請(qǐng)日期2011年12月7日 優(yōu)先權(quán)日2011年12月7日
發(fā)明者孫運(yùn)龍, 王建華, 韓一石, 黃明政 申請(qǐng)人:廣東工業(yè)大學(xué)