分類: 演算法
2012-05-01 11:30
278人閱讀收藏
舉報character
c資料結構
input
演算法儲存
雙數 組 trie(double-arraytrie) 的資料結構是兩個整數陣列,乙個是base,乙個是check
這個演算法的本質就是將trie樹結構簡化為兩個線性陣列,如圖2所示。
base陣列和陣列中的元素是一一對應的,base陣列中的每乙個元素相當於trie樹的乙個節點,其值做狀態轉移的基值,check值相當於校驗值,用於檢查該狀態是否存在。對於從狀態
s到狀態t的乙個轉移,必須滿足如下兩個條件:
1.base[s]+c=t
2.check[ t] =s
其中c是輸入變數。
陣列構造完成之後,要查詢乙個關鍵碼ab是很快,只需要一步加法,即只需判斷check[base[a]+b]是否等於a.狀態a有個基值,為base[a],則ab所在的節點應該為基值+輸入狀態,即base[a]+b,可以這麼認為,ab的節點為base[a]+b,同樣這個節點也存在相應的基值。
同理要查詢abc是否在詞典中,只需判斷check[base[base[a]+b]+c]是否等於base[a]+b
雙陣列trie樹的構造過程,稍微麻煩點,詳細請參考:
假設這樣乙個場景,ab,ac,ae已經放入trie中,這時要插入ad, base[ base[a]+d ] !=0,說明ad節點的位置已經被其他的詞佔了,譬如是ec。這個時候要調整a的基值,即base[a].如果要調節base[a]就要考慮到,ab,ac,ae的值要改變,同時abe的值也會改變。演算法如下:
其中,s就是例子中的a,本來base[a]=t,但是插入ad時,位置已經被其他詞佔了,譬如ec,所以這時要調整base[a]的值,調整為base[a] = b,至於b是如果得到的,請繼續研究。。。。
因為現在base[s]=b,所以詞sb,sc,se所對應的節點下標要改變,如行2所示;本來sb,sc,se對應的下標,即節點為base[s]+b,base[s]+c,base[s]+e,現在要改為b+b,b+c,b+e
因為sb,se,sc移到了新位置,所以check要更新,如行1所示;指示sb,sc,se的新節點為b+b,b+c,b+e,但是他們的上乙個節點還是s
改變sc的值,那scd的節點也要變化,要主要到scd的節點對應的下標沒有變化,base[base[s]+c] +d ,雖然s的基值變為了b,但是sc的基值還是不變,但是ac的下表變了,所以要更新acd上乙個狀態對應的下標,只要更新check[base[ base[s]+c]+d],使其指向下標b+c;如行3 所示
從圖中可以看出,下標s的基值變為b,即虛線所指
對應sc的下標從t變為t',要更新check[t'] = s,check[u] = t'
//筆試題:
請設計乙個字典。以字串為索引,儲存使用者定義的定長結構。要求有增、刪、查、改的功能。已經給定乙個函式,可以由字串對映到乙個簽名,每個簽名由兩個unsigned int型別組成。假設每乙個字串能夠對應唯一的乙個簽名,完全沒有重複(或者重複的概率可以忽略),並且簽名分布足夠均勻。
最直接的想法就是構造乙個兩層的trie樹
還可以用hash來做,用第乙個unsigned int作為hash的key,將key相等的詞的第二個unsigned int安裝順序排序,這樣可以用二分查詢法查詢
map>
雙陣列trie原理
一 基本構造 trie樹是搜尋樹的一種,來自英文單詞 retrieval 的簡寫,可以建立有效的資料檢索組織結構,是中文匹配分詞演算法中詞典的一種常見實現。它本質上是乙個確定的有限狀態自動機 dfa 每個節點代表自動機的乙個狀態。在詞典中這此狀態包括 詞字首 已成詞 等。雙陣列trie double...
雙陣列TRIE樹原理
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!原貼 雙陣列trie樹原理 摘要 本文介紹了一種新的內部 內部排序的內部,也就是在記憶體裡 陣列結構的digital search演算法,叫做雙陣列,結合了陣列訪問的快速和鏈式儲存的壓縮。digital search樹的每一條弧在雙陣列中都可以以o...
雙陣列trie樹
雙陣列trie double arraytrie 是trie樹的乙個簡單而有效的實現,由兩個整數陣列構成,乙個是base,另乙個是check。設陣列下標為i,如果base i check i 均為0,表示該位置為空。如果base i 為負值,表示該狀態為詞語。check i 表示該狀態的前一狀態,t...