我們首先看看鍵樹是怎麼回事:
鍵樹又稱為數字查詢樹(digital search tree)或trie樹(trie為retrieve中間4個字元),其結構受啟發於一部大型字典的「書邊標目」。字典中標出首字母是a,b,c,....z的單詞所在頁,再對各部分標出第二字母為a,b,c,...z的單詞所在的頁, ....等等。
1:鍵樹的定義
鍵樹是一種特殊的查詢樹,它與其它查詢樹不同在於鍵樹中某個節點不是包含乙個或多個關鍵字,而是只包含組成關鍵字的一部分(字元或數字),比如:如果關鍵字是數值,則節點中只包含乙個數字;如果關鍵字是單詞,則節點中只包含乙個字母字元。
2:鍵樹的儲存
鍵樹的儲存通常有兩種方式:
(1)雙鏈樹表示
如果以樹的孩子兄弟表示,則每個節點包含3個域。
a: symbol域: 儲存關鍵字的乙個字元
b: son域: 儲存指向第一棵子樹的根的指標,葉子節點的son域指向該關鍵字記錄的指標
c: brother域: 儲存指向右兄弟的指標.
這時的鍵樹又稱為雙鏈樹.
//雙鏈樹的儲存表示
typedef struct dulnodedulnode ,*dltree;
(2) 多重鍊錶表示
如果以樹的多重鍊錶表示鍵樹, 則樹的每個結點中應包含d個(d為關鍵字元的基,如:字符集由英文大寫字母構成時,則d=26+1=27)指標域,此時的鍵樹又稱為trie樹。如果從鍵樹中某個結點到葉子結點的路徑上每個結點都只有乙個孩子,則可以將該路徑上的所有結點壓縮為乙個「葉子結點」,且在該葉子結點中儲存關鍵字及指向記錄的指標等資訊。
以上資料結構很容易讓人聯想到**號碼,如果關鍵字的取值為[0,9],則很容易用來處理像**號碼這類的資料。如果目前固定**的長度算8位的話,那查詢的的時間複雜度為常數8。
計費系統中的使用者資料在計費過程中使用非常頻繁,如果id作為關鍵字的鍵樹演算法的話,將大大的提高查詢速度。
下次再具體談談鍵樹演算法的實現,以及在共享記憶體中的實現。
SVD在推薦系統中的應用
其實說參考也不準確,準確地說應該是半翻譯半學習筆記。仔細整理一遍,感覺還是收穫很大的。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘機 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非負 3.v n n的正交矩陣的倒置 即a u s v 注意矩陣v需要倒置 直...
SVD在推薦系統中的應用
其實說參考也不準確,準確地說應該是半翻譯半學習筆記。仔細整理一遍,感覺還是收穫很大的。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘積 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非負 3.v n n的正交矩陣的倒置 即a u s v 注意矩陣v需要倒置 直...
SVD在推薦系統中的應用
mahout中有svd的推薦策略,今天查了一下資料了解了一下演算法原理,本質上是使用svd方法做特徵降維,然後再計算相似度。下面這篇文章寫的不錯,和大家分享一下。任意乙個m n的矩陣a m行 n列,m n 可以被寫成三個矩陣的乘積 1.u m行m列的列正交矩陣 2.s m n的對角線矩陣,矩陣元素非...