專(zhuān)利名稱(chēng)::一種數(shù)據(jù)壓縮存儲(chǔ)并檢索的方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及通訊及計(jì)算機(jī)領(lǐng)域,在移動(dòng)設(shè)備、互聯(lián)網(wǎng)、輸入法等方面均有特定的應(yīng)用。
背景技術(shù):
:詞典的數(shù)據(jù)量是幾十萬(wàn)甚至上百萬(wàn),對(duì)其進(jìn)行快速檢索是迫切需要解決的問(wèn)題??焖俣ㄎ辉~典中單詞所在的記錄不僅僅在移動(dòng)設(shè)備上有非常廣泛的用途,而且在信息檢索領(lǐng)域中也屬于基礎(chǔ)檢索技術(shù)。對(duì)詞典的査詢(xún)非常頻繁,對(duì)其查詢(xún)速度和存儲(chǔ)空間的任何改進(jìn)都具有重大意義。目前大量應(yīng)用系統(tǒng)中常常需要給出某字符串的唯一Id標(biāo)識(shí),該字符串可以為某特征字符串。通常的做法是在數(shù)據(jù)庫(kù)中建立一張表,該表的兩列分別存儲(chǔ)字符串及其對(duì)應(yīng)的Id,并對(duì)String建立索引,而且還需要保證Id的唯一性。另外一種比較直接的做法是采用Map結(jié)構(gòu),但Map結(jié)構(gòu)在處理大數(shù)據(jù)量時(shí)將消耗大量的內(nèi)存資源。另一方面,大量系統(tǒng)都需要支持編輯建議和輸入建議功能,如目前的許多代碼編輯系統(tǒng)中的代碼援助功能,都需要支持前綴査詢(xún)、后綴査詢(xún)功能,前綴查詢(xún)一般采用類(lèi)似于數(shù)據(jù)庫(kù)中的Like匹配策略,或者使用Trie樹(shù)結(jié)構(gòu)或者一些其它檢索樹(shù)(如B-樹(shù),B+樹(shù)以及它們的變形),但是目前公布的對(duì)Trie樹(shù)的優(yōu)化算法都無(wú)法同時(shí)獲得較高的査詢(xún)效率以及消耗較小的內(nèi)存空間。存在性檢測(cè)通常用于檢測(cè)某數(shù)據(jù)是否被處理過(guò),例如判斷url是否被爬蟲(chóng)程序獲取過(guò),以及判斷某串是否出現(xiàn)在某詞典中,以便判斷該串是否是一個(gè)詞等問(wèn)題。數(shù)據(jù)壓縮算法主要分為有損壓縮和無(wú)損壓縮兩種。無(wú)損壓縮就是能夠完全還原的壓縮算法,通常壓縮算法是將數(shù)據(jù)加載到內(nèi)存中,對(duì)其進(jìn)行壓縮處理后,將其持久化。在實(shí)際使用時(shí),需要將持久化的數(shù)據(jù)解壓后放在內(nèi)存中,所以實(shí)際上對(duì)內(nèi)存的消耗并沒(méi)有真正的減少。本發(fā)明采用通過(guò)對(duì)內(nèi)存數(shù)據(jù)進(jìn)行壓縮,然后再對(duì)其進(jìn)行持久化的策略。有沒(méi)有一種結(jié)構(gòu)能夠同時(shí)支持上述功能呢?本發(fā)明將公布這種結(jié)構(gòu)。目前對(duì)詞典進(jìn)行前綴檢索一般采用Trie(字符樹(shù)),它的每一個(gè)節(jié)點(diǎn)上存儲(chǔ)的是一個(gè)字符,這樣就造成了空間的極大浪費(fèi)。針對(duì)空間浪費(fèi)的問(wèn)題,我們需要設(shè)計(jì)一種壓縮裝置來(lái)解決空間浪費(fèi)問(wèn)題。Trie樹(shù)對(duì)一個(gè)節(jié)點(diǎn)的孩子節(jié)點(diǎn)存儲(chǔ)時(shí),可以使用數(shù)組或者鏈?zhǔn)浇Y(jié)構(gòu),并沒(méi)有考慮査詢(xún)單詞的使用頻率,通過(guò)采用特定的置換算法可以改善査詢(xún)命中率。本發(fā)明改進(jìn)了Trie樹(shù)的結(jié)構(gòu),將其命名為字符串Trie樹(shù),并對(duì)其字符串Trie樹(shù)中的內(nèi)容進(jìn)行壓縮處理。發(fā)明就是針對(duì)上述情況進(jìn)行處理和解決。
發(fā)明內(nèi)容目前大部分?jǐn)?shù)據(jù)壓縮方法不具有査詢(xún)功能,本發(fā)明設(shè)計(jì)的壓縮技術(shù)支持前綴查詢(xún)和存在性檢測(cè)。本發(fā)明提出了一種對(duì)Trie樹(shù)結(jié)構(gòu)進(jìn)行改進(jìn)的詞典管理和檢索方法。將字符Trie樹(shù)改進(jìn)為基于字符串的Trie樹(shù)。在構(gòu)造Trie樹(shù)的過(guò)程中提出了一種優(yōu)化策略,將節(jié)點(diǎn)中的數(shù)據(jù)進(jìn)行替換壓縮處理。在對(duì)內(nèi)存要求比較嚴(yán)格或面對(duì)大數(shù)據(jù)量處理時(shí),提出了一種內(nèi)外存方式來(lái)實(shí)現(xiàn)對(duì)Trie樹(shù)的動(dòng)態(tài)加載。本發(fā)明根據(jù)常見(jiàn)需求的不同,給出了在設(shè)計(jì)Trie樹(shù)節(jié)點(diǎn)時(shí)的一些區(qū)別。本發(fā)明提供了一種快速檢索詞典,并對(duì)詞典數(shù)據(jù)進(jìn)行壓縮存儲(chǔ)的方法。該方法能夠高度壓縮詞典數(shù)據(jù),并且本身就帶有查詢(xún)功能,在査詢(xún)速度上也進(jìn)行了改進(jìn),能夠取得不錯(cuò)的效果。實(shí)現(xiàn)本發(fā)明所采用的技術(shù)方案為一種數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,包括步驟步驟一、根據(jù)用戶(hù)檢索情況,選擇合適類(lèi)型節(jié)點(diǎn),將詞典或特征數(shù)據(jù)用改進(jìn)的字符串Trie樹(shù)結(jié)構(gòu)表示;步驟二、對(duì)字符串Trie樹(shù)進(jìn)行壓縮,優(yōu)化;步驟三、根據(jù)用戶(hù)的輸入,在Trie樹(shù)中進(jìn)行檢索。上述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其進(jìn)一步特征在于掃描詞典數(shù)據(jù)或特征數(shù)據(jù),將數(shù)據(jù)插入到改進(jìn)的字符串Trie樹(shù)中。上述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其進(jìn)一步特征在于將字符串Trie樹(shù)用于前綴查找;將字符串Trie樹(shù)用于〈key,value〉類(lèi)型的査找;將字符串Trie樹(shù)用于數(shù)據(jù)存在性檢測(cè)。上述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其更進(jìn)一步特征在于遍歷字符串Trie樹(shù)中的節(jié)點(diǎn)數(shù)據(jù),并對(duì)節(jié)點(diǎn)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),并采用發(fā)明中所述的壓縮算法對(duì)字符串Trie樹(shù)進(jìn)行壓縮處理。所述的壓縮算法是字符串替換算法,即將Tire樹(shù)中節(jié)點(diǎn)存儲(chǔ)的單4詞片段替換為另外一個(gè)較短的串,從而節(jié)省內(nèi)存消耗。本發(fā)明的有益效果解決了現(xiàn)有Trie樹(shù)結(jié)構(gòu)的缺點(diǎn),比現(xiàn)有詞典方法查詢(xún)效率更高,占用空間更少。由于每個(gè)節(jié)點(diǎn)都記錄著被訪(fǎng)問(wèn)的次數(shù)和訪(fǎng)問(wèn)時(shí)間,所以在遍歷某節(jié)點(diǎn)的孩子節(jié)點(diǎn)時(shí),充分利用它們進(jìn)行排序,加速査找過(guò)程。另外本文提出的字符串Trie樹(shù)解決了傳統(tǒng)Trie樹(shù)的空指針浪費(fèi)的問(wèn)題,并且本文采用特定的字符串替換算法進(jìn)一步壓縮了字符串Trie樹(shù)的內(nèi)存消耗。圖1為本發(fā)明實(shí)施例的字符串Trie樹(shù)插入數(shù)據(jù)示例圖。圖2為本發(fā)明實(shí)施例的字符串Trie樹(shù)首字節(jié)點(diǎn)圖。圖3為本發(fā)明實(shí)施例的根據(jù)內(nèi)存狀態(tài)動(dòng)態(tài)加載節(jié)點(diǎn)圖。圖4為本發(fā)明實(shí)施例的字符串Trie樹(shù)生成及査詢(xún)流程圖。具體實(shí)施例方式以下結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步詳細(xì)陳述。本發(fā)明的目的是為了解決Trie樹(shù)結(jié)構(gòu)現(xiàn)有的缺點(diǎn),提供一種比現(xiàn)有詞典方法查詢(xún)效率更高,占用空間更少的詞典管理和檢索方法。該結(jié)構(gòu)支持如下功能前綴査詢(xún),后綴查詢(xún),特征串到Id的映射查詢(xún),存在性檢査。1.改進(jìn)Trie樹(shù)結(jié)構(gòu)本發(fā)明將Trie樹(shù)結(jié)構(gòu)改進(jìn)成字符串Trie樹(shù)?;具^(guò)程如下構(gòu)建字符串Trie樹(shù)的過(guò)程大體上分為下面幾步A.采用改進(jìn)的字符串Trie樹(shù)對(duì)詞典中的所有數(shù)據(jù)建立索引Al.設(shè)計(jì)字符串Trie樹(shù)中的節(jié)點(diǎn)能夠存儲(chǔ)單詞的片斷;A2.設(shè)計(jì)字符串Trie樹(shù)中的節(jié)點(diǎn)的孩子節(jié)點(diǎn)類(lèi)型為鏈?zhǔn)浇Y(jié)構(gòu)A3.設(shè)計(jì)字符串Trie樹(shù)中節(jié)點(diǎn)中設(shè)置鏈接類(lèi)型字段節(jié)點(diǎn)分為過(guò)渡節(jié)點(diǎn)、數(shù)據(jù)節(jié)點(diǎn)、混合節(jié)點(diǎn)。A4.掃描詞典,并將數(shù)據(jù)存儲(chǔ)到改進(jìn)的結(jié)構(gòu)中。改進(jìn)的Trie樹(shù)具有每個(gè)節(jié)點(diǎn)至少兩個(gè)子節(jié)點(diǎn)。如圖1所示,為本發(fā)明實(shí)施例的字符串Trie樹(shù)插入數(shù)據(jù)示例圖,圖1展示了字符串Trie樹(shù)在插入數(shù)據(jù)時(shí)的節(jié)點(diǎn)所作出的調(diào)整。根據(jù)查詢(xún)需求不同,字符串Trie樹(shù)每個(gè)節(jié)點(diǎn)包含不同的內(nèi)容。節(jié)點(diǎn)的kind屬性代表了該節(jié)點(diǎn)的類(lèi)型,kinc^2代表該節(jié)點(diǎn)是一個(gè)過(guò)渡節(jié)點(diǎn),kincN3代表該節(jié)點(diǎn)是數(shù)據(jù)節(jié)點(diǎn),其數(shù)據(jù)內(nèi)容是從根節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)所連接起來(lái)的串(不包括根節(jié)點(diǎn))。5kinc^6時(shí),代表該節(jié)點(diǎn)既是一個(gè)過(guò)渡節(jié)點(diǎn)又是一個(gè)數(shù)據(jù)節(jié)點(diǎn)。kind=kind*7代表該節(jié)點(diǎn)中的數(shù)據(jù)為壓縮數(shù)據(jù),通過(guò)Map可以查詢(xún)得到該節(jié)點(diǎn)的真實(shí)數(shù)據(jù),什么類(lèi)型節(jié)點(diǎn)中的內(nèi)容數(shù)據(jù)需要壓縮將在下面進(jìn)行詳細(xì)描述,kind:kind"-l)代表該節(jié)點(diǎn)存儲(chǔ)在硬盤(pán)上,該節(jié)點(diǎn)被動(dòng)態(tài)加載到Cache中?;谏鲜龌径x,我們?cè)谂袛喙?jié)點(diǎn)類(lèi)型時(shí),將采用表l中所示的規(guī)則。節(jié)點(diǎn)類(lèi)型kind屬性滿(mǎn)足數(shù)據(jù)節(jié)點(diǎn)Mod(3)=0過(guò)渡節(jié)點(diǎn)Mod(2)=0既是數(shù)據(jù)節(jié)點(diǎn)又是過(guò)渡節(jié)點(diǎn)Mod(6):0壓縮節(jié)點(diǎn)Mod(7)=0外存節(jié)點(diǎn)Kind〈0表1.節(jié)點(diǎn)類(lèi)型與kind屬性之間的對(duì)應(yīng)關(guān)系關(guān)于字符串Trie樹(shù)的構(gòu)建,常見(jiàn)的操作有插入操作和刪除操作。在插入數(shù)據(jù)的過(guò)程中,需要分裂部分節(jié)點(diǎn),并根據(jù)需要修改節(jié)點(diǎn)的類(lèi)型。而在刪除數(shù)據(jù)的過(guò)程中,需要對(duì)節(jié)點(diǎn)進(jìn)行合并,確保每個(gè)節(jié)點(diǎn)的孩子個(gè)數(shù)要大于2。根據(jù)上述的描述過(guò)程,我們可知由于沒(méi)有浪費(fèi)的孩子節(jié)點(diǎn)指針,字符串Trie樹(shù)有效地降低了字符Trie樹(shù)的空間浪費(fèi)問(wèn)題。2.對(duì)字符串Trie樹(shù)進(jìn)行壓縮處理由于trie樹(shù)中節(jié)點(diǎn)的內(nèi)容往往重復(fù)出現(xiàn),例如許多節(jié)點(diǎn)的內(nèi)容禰為"abc",當(dāng)重復(fù)出現(xiàn)的次數(shù)非常多時(shí),將"abc"替換成a,能夠節(jié)省一定的內(nèi)存消耗,這非常有利于對(duì)內(nèi)存要求比較嚴(yán)格的系統(tǒng)。所以需要統(tǒng)計(jì)出各節(jié)點(diǎn)內(nèi)容的出現(xiàn)次數(shù)統(tǒng)計(jì)情況。遍歷Trie樹(shù),統(tǒng)計(jì)Trie樹(shù)中所含內(nèi)容的長(zhǎng)度大于2的所有節(jié)點(diǎn),并且該內(nèi)容出現(xiàn)的次數(shù)大于1次的這些單詞片段,否則沒(méi)有壓縮的必要。獲取節(jié)點(diǎn)統(tǒng)計(jì)信息。下面將重點(diǎn)描述字符串Trie樹(shù)的壓縮算法的整個(gè)過(guò)程。算法準(zhǔn)備1.遍歷字符串Trie樹(shù),對(duì)節(jié)點(diǎn)的內(nèi)容長(zhǎng)度大于1的節(jié)點(diǎn)進(jìn)行出現(xiàn)次數(shù)統(tǒng)計(jì),當(dāng)遍歷完字符串Trie樹(shù)時(shí),就完成了各串出現(xiàn)次數(shù)的統(tǒng)計(jì)。將統(tǒng)計(jì)結(jié)果按照長(zhǎng)度升序,出現(xiàn)次數(shù)降序進(jìn)行排列,以下表的形式展現(xiàn)出來(lái)。.2.由于長(zhǎng)度為兩位的串被替換成一位才能夠節(jié)省內(nèi)存空間,我們選定的替換字符為(a……z;A……Z;0……9),單字符的個(gè)數(shù)為63個(gè),所以出現(xiàn)次數(shù)是前63位的長(zhǎng)度為2的串被替換能夠獲得一定的收益,長(zhǎng)度為N的串被小于N的串替換能夠帶來(lái)收益。根據(jù)此原理,刪除原始表中不可能被替換的記錄。3.針對(duì)每一行記錄,按照收益從小到大排序的方式給出替換選擇方案,例如節(jié)點(diǎn)內(nèi)容為"ell"的記錄,其對(duì)應(yīng)的替換方案是{〈2,T3845〉,〈1,(3-l)承T3845〉l,〈2,T3845〉是一個(gè)替換,其中的2表示使用長(zhǎng)度為2的串進(jìn)行替換,T3845是替換所獲得的收益。最佳替換生成算法對(duì)于每行記錄選擇第一個(gè)替換,組成一個(gè)替換方案。顯然,但該方案并不是最優(yōu)方案,下面給出生成最優(yōu)替換方案的算法。算法假設(shè)節(jié)點(diǎn)內(nèi)容最長(zhǎng)的串為L(zhǎng)。由于算法設(shè)計(jì)一些操作,定義如下1.刪除操作將某條記錄第一個(gè)替換刪去,此時(shí)該記錄采用后面的替換。2.沖突操作掃描所有記錄的第一個(gè)替換,如果序號(hào)出現(xiàn)的次數(shù)超過(guò)其能夠表達(dá)的個(gè)數(shù),此時(shí)就存在沖突。3.沖突解決對(duì)于序號(hào)的沖突的解決,刪除該序號(hào)對(duì)應(yīng)的最小收益的那個(gè)二元組。算法過(guò)程如下。1.從長(zhǎng)度最大(L)的第一個(gè)記錄開(kāi)始,刪除該記錄對(duì)應(yīng)的替換集合中的第一個(gè)替換,如果引起沖突,則評(píng)估解決沖突后帶來(lái)的收益與不刪除該替換所獲得的收益進(jìn)行對(duì)比。依次處理長(zhǎng)度為L(zhǎng)的第二個(gè)記錄,直到處理到某記錄,該記錄的第一個(gè)替換不需要?jiǎng)h除為止。調(diào)整影響由于解決沖突所影響到的記錄的位置。2.按照步驟1依次處理長(zhǎng)度L-1,L-2,……,2的記錄。3.如果某次沒(méi)有任何替換可以刪除,則算法結(jié)束,否則,重復(fù)步驟(1),(2)<table>tableseeoriginaldocumentpage7</column></row><table><table>tableseeoriginaldocumentpage8</column></row><table>表3.根據(jù)表2建立的映射表根據(jù)映射表中的映射規(guī)則,通過(guò)遍歷字符串Trie樹(shù),將Trie樹(shù)中節(jié)點(diǎn)的節(jié)點(diǎn)內(nèi)容根據(jù)映射規(guī)則替換成對(duì)應(yīng)的內(nèi)容。對(duì)Trie樹(shù)中需要進(jìn)行壓縮處理的節(jié)點(diǎn),將對(duì)應(yīng)節(jié)點(diǎn)的kind屬性設(shè)置為負(fù)數(shù)。3.采用內(nèi)存+外存存儲(chǔ)字符串Trie樹(shù)策略當(dāng)處理上億數(shù)據(jù)時(shí),無(wú)法將字符串Trie樹(shù)中的所有節(jié)點(diǎn)數(shù)據(jù)都加載到內(nèi)存中,必須將部分節(jié)點(diǎn)進(jìn)行持久化處理,根據(jù)訪(fǎng)問(wèn)Trie樹(shù)時(shí)的情況,當(dāng)真正訪(fǎng)問(wèn)到該節(jié)點(diǎn)時(shí),才將節(jié)點(diǎn)數(shù)據(jù)加載進(jìn)入內(nèi)存。為了評(píng)估字符串Trie樹(shù)中的哪些節(jié)點(diǎn)應(yīng)該被持久化,需要計(jì)算字符串Trie樹(shù)中的節(jié)點(diǎn)的一些附加屬性,例如該節(jié)點(diǎn)被訪(fǎng)問(wèn)的次數(shù),該節(jié)點(diǎn)的大小等信息,訪(fǎng)問(wèn)次數(shù)越少的節(jié)點(diǎn)越應(yīng)該被持久化。如圖3所示分割線(xiàn)上方的數(shù)據(jù)被加載到內(nèi)存中,分割線(xiàn)下方的數(shù)據(jù)被持久化在硬盤(pán)上,當(dāng)需要訪(fǎng)問(wèn)時(shí),根據(jù)指定的置換策略進(jìn)行置換處理。如圖3,為本發(fā)明實(shí)施例的根據(jù)內(nèi)存狀態(tài)動(dòng)態(tài)加載節(jié)點(diǎn)圖,所示節(jié)點(diǎn)t3,t4,t9,tll將被持久化,而根節(jié)點(diǎn)被加載到內(nèi)存中,由于節(jié)點(diǎn)之間存儲(chǔ)鏈接關(guān)系,節(jié)點(diǎn)tl,t2,t5,t6,tl0也被加載在內(nèi)存中,而節(jié)點(diǎn)t7,t8,tl3,tl4,tl5,t16中的信息也被持久化。4.孩子節(jié)點(diǎn)類(lèi)型與査詢(xún)策略改進(jìn)在初始化字符串Trie樹(shù)時(shí),將字符串Trie樹(shù)的孩子節(jié)點(diǎn)類(lèi)型為鏈?zhǔn)浇Y(jié)構(gòu),當(dāng)數(shù)據(jù)全部插入到Trie樹(shù)中時(shí),由于孩子節(jié)點(diǎn)的個(gè)數(shù)已經(jīng)比較穩(wěn)定,所有采用數(shù)組對(duì)鏈?zhǔn)浇Y(jié)構(gòu)進(jìn)行替換,避免鏈?zhǔn)浇Y(jié)構(gòu)在空間上的浪費(fèi)。對(duì)字符串Trie樹(shù)中的某節(jié)點(diǎn)而言,在訪(fǎng)問(wèn)其孩子節(jié)點(diǎn)時(shí),在沒(méi)有先驗(yàn)知識(shí)的前提下,只能順序訪(fǎng)問(wèn)其所有的孩子節(jié)點(diǎn)。為了獲得較快的査找速度,我們將按照該節(jié)點(diǎn)的各孩子節(jié)點(diǎn)的訪(fǎng)問(wèn)頻率和最近訪(fǎng)問(wèn)情況進(jìn)行排序,使得在遍歷Trie樹(shù)的過(guò)程中,優(yōu)先訪(fǎng)問(wèn)最近訪(fǎng)問(wèn)節(jié)點(diǎn)的和訪(fǎng)問(wèn)頻率比較高的節(jié)點(diǎn)。基于Trie樹(shù)的詞典機(jī)制一般是對(duì)詞的首字計(jì)算Hash值,建立首字hash表或者直接根據(jù)首字的內(nèi)部編碼進(jìn)行轉(zhuǎn)換成數(shù)組的下標(biāo),正如圖2所示,圖2為本發(fā)明實(shí)施例的字符串Trie樹(shù)首字節(jié)點(diǎn)圖。然后建立字符串Trie索引樹(shù)。5.Trie樹(shù)的序列化當(dāng)將字符串Trie樹(shù)用于傳輸詞典數(shù)據(jù)時(shí),需要對(duì)其進(jìn)行序列化處理。對(duì)圖1所示的Trie樹(shù)進(jìn)行序列化處理,其結(jié)果為ab[ut,rt),b(a(idu,nk),ell)。其中定義了映射規(guī)則(1)Mod(abs(kind),2)=0時(shí),節(jié)點(diǎn)內(nèi)容后緊跟'(,;(2)Mod(abs(kind),3)=0時(shí),節(jié)點(diǎn)內(nèi)容后緊跟'[';(3)kind〈0時(shí),節(jié)點(diǎn)內(nèi)容后緊跟M';(4)孩子節(jié)點(diǎn)的內(nèi)容之間采用逗號(hào)進(jìn)行分割。對(duì)字符串Trie樹(shù)序列化后,通過(guò)掃描該字符串序列,可以重建出該序列化文件對(duì)應(yīng)的字符串THe樹(shù)。6.改進(jìn)傳統(tǒng)查詢(xún)查詢(xún)l:給定某詞典D和某前綴p,査詢(xún)D中所有以p為前綴的數(shù)據(jù)。1.用戶(hù)輸入査詢(xún)前綴串;2.從Trie樹(shù)的根節(jié)點(diǎn)開(kāi)始,獲得當(dāng)前節(jié)點(diǎn)的孩子節(jié)點(diǎn),通過(guò)孩子節(jié)點(diǎn)的數(shù)量識(shí)別孩子節(jié)點(diǎn)是數(shù)組類(lèi)型還是鏈表類(lèi)型。如果是數(shù)組類(lèi)型,則直接定位到該孩子節(jié)點(diǎn);3.鏈?zhǔn)胶⒆庸?jié)點(diǎn),將順序掃描節(jié)點(diǎn),在掃描過(guò)程中,如果該節(jié)點(diǎn)為壓縮節(jié)點(diǎn),則通過(guò)Map取出相應(yīng)的數(shù)據(jù),然后進(jìn)行匹配,如果第一個(gè)字母相同,則找到節(jié)點(diǎn)。如果用戶(hù)輸入匹配當(dāng)前節(jié)點(diǎn)數(shù)據(jù),則當(dāng)前節(jié)點(diǎn)就是要找的數(shù)據(jù);4.獲取該節(jié)點(diǎn)所有的孫子節(jié)點(diǎn)中kind屬性滿(mǎn)足Mod(kind,3)為0的節(jié)點(diǎn),將他們的內(nèi)容形成列表,該列表就是返回給用戶(hù)相應(yīng)的前綴查詢(xún)數(shù)據(jù)。查詢(xún)2:存在性檢測(cè)傳統(tǒng)的存在性檢測(cè)可以采用Set方式實(shí)現(xiàn),而本發(fā)明也可以支持存在性檢測(cè)。如果用戶(hù)輸入串,完全匹配從根節(jié)點(diǎn)到找到的節(jié)點(diǎn)的串路徑上串的和,則完全匹配;否則,未找到。該節(jié)點(diǎn)所指向的位置就是用戶(hù)所要査詢(xún)的位置,據(jù)此,用戶(hù)可以獲得關(guān)于用戶(hù)輸入串的一切信息。查詢(xún)3:給定某映射關(guān)系,<鍵,值〉對(duì)中的鍵,查詢(xún)?cè)撴I對(duì)應(yīng)的值。傳統(tǒng)的鍵值關(guān)系映射查詢(xún)主要采用Map結(jié)構(gòu)進(jìn)行實(shí)現(xiàn),而本發(fā)明也可以支持對(duì)鍵值映射關(guān)系的査詢(xún)。首先查詢(xún)鍵在字符串Trie樹(shù)中的位置,即獲得鍵在Trie樹(shù)中對(duì)應(yīng)的節(jié)點(diǎn),然后通過(guò)訪(fǎng)問(wèn)該節(jié)點(diǎn)中存儲(chǔ)的值,從而獲得鍵與值之間的對(duì)應(yīng)關(guān)系。圖4為本發(fā)明實(shí)施例的字符串Trie樹(shù)生成及査詢(xún)流程圖。雖然本發(fā)明以較佳實(shí)施例公開(kāi)如上,但它們并不是用來(lái)限定本發(fā)明,任何熟悉此技藝者,在不脫離本發(fā)明之精神和范圍內(nèi),自當(dāng)可作各種變化或潤(rùn)飾,因此本發(fā)明的保護(hù)范圍應(yīng)當(dāng)以本申請(qǐng)的權(quán)利要求保護(hù)范圍所界定的為準(zhǔn)。權(quán)利要求1、一種數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,包括步驟(1)根據(jù)用戶(hù)檢索情況,選擇合適類(lèi)型節(jié)點(diǎn),將詞典或特征數(shù)據(jù)用改進(jìn)的字符串Trie樹(shù)結(jié)構(gòu)表示;(2)對(duì)字符串Trie樹(shù)進(jìn)行壓縮,優(yōu)化;(3)根據(jù)用戶(hù)的輸入,在字符串Trie樹(shù)中進(jìn)行檢索。2、根據(jù)權(quán)利要求1所述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其特征在于掃描詞典數(shù)據(jù)或特征數(shù)據(jù),將數(shù)據(jù)插入到改進(jìn)的字符串Trie樹(shù)中。3、根據(jù)權(quán)利要求1所述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其特征在于遍歷字符串Trie樹(shù)中的節(jié)點(diǎn)數(shù)據(jù),并對(duì)節(jié)點(diǎn)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),并采用壓縮算法對(duì)字符串Trie樹(shù)進(jìn)行壓縮處理。4、根據(jù)權(quán)利要求1所述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其特征在于將字符串Trie樹(shù)用于后綴査找。5、根據(jù)權(quán)利要求1所述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其特征在于將字符串Trie樹(shù)用于〈key,value〉類(lèi)型的查找。6、根據(jù)權(quán)利要求1所述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其特征在于將字符串Trie樹(shù)用于數(shù)據(jù)存在性檢測(cè)。7、根據(jù)權(quán)利要求3所述的數(shù)據(jù)壓縮存儲(chǔ)與檢索方法,其特征在于,所述壓縮算法統(tǒng)計(jì)字符串Trie樹(shù)中節(jié)點(diǎn)內(nèi)容出現(xiàn)情況,選擇可能被替換的字符串,列舉出每種字符串所有可能的替換,通過(guò)刪除候選替換,檢測(cè)沖突并解決沖突,從而獲得字符串Trie樹(shù)的最佳字符串替換方案,實(shí)現(xiàn)對(duì)字符串Trie樹(shù)的壓縮處理;當(dāng)訪(fǎng)問(wèn)字符串Trie樹(shù)時(shí),檢測(cè)節(jié)點(diǎn)的類(lèi)型,如果是壓縮節(jié)點(diǎn),則從映射表中讀取真正內(nèi)容。全文摘要本發(fā)明公開(kāi)了一種數(shù)據(jù)壓縮存儲(chǔ)和快速檢索的裝置和方法。目前對(duì)詞典進(jìn)行前綴檢索一般采用Trie樹(shù)(字符樹(shù)),它的每一個(gè)節(jié)點(diǎn)上存儲(chǔ)的是一個(gè)字符,這樣就造成了空間的極大浪費(fèi)。本發(fā)明將字符Trie樹(shù)改進(jìn)為字符串Trie樹(shù),有效降低了空間浪費(fèi)問(wèn)題。在內(nèi)存要求比較嚴(yán)格的系統(tǒng)中,對(duì)字符串Trie樹(shù)中節(jié)點(diǎn)的內(nèi)容進(jìn)行壓縮處理,給出了壓縮算法。該裝置可用于對(duì)內(nèi)存空間要求比較嚴(yán)格的移動(dòng)存儲(chǔ)設(shè)備中,在詞典數(shù)據(jù)非常大的情況下,越能體現(xiàn)出該方法的優(yōu)越性。另外該裝置還可以用于目前互聯(lián)網(wǎng)的搜索接口的Suggest功能,存在性檢查以及<key,value>類(lèi)型的查詢(xún)功能。文檔編號(hào)G06F17/30GK101499094SQ20091002581公開(kāi)日2009年8月5日申請(qǐng)日期2009年3月10日優(yōu)先權(quán)日2009年3月10日發(fā)明者成俊杰,李仁勇申請(qǐng)人:焦點(diǎn)科技股份有限公司