1. 字首樹
字首樹又稱為單詞查詢樹,是一種樹形的結構,用於儲存大量的字串,它的優點是:利用字串的公共字首來節約儲存空間
trie樹主要是利用詞的公共字首縮小查詞範圍、通過狀態間的對映關係避免了字元的遍歷,從而達到高效檢索的目的
2. 可以先宣告乙個節點trienode,節點包括以下幾個屬性:
trienode children = new trienode[26];
trienode parent;
int level;
//islast未賦值的時候預設值是false
public boolean islast;
public int fre = 1;
我們在插入的時候可以將字串先轉化為字元陣列,然後逐個進行插入,乙個字元下面可能有許多個相同的字元,所以宣告trienode類陣列是為了更好地表示上乙個字元與下乙個字元之間的關係,可以節省儲存空間,而且我們在查詢的時候知道當前的字首那麼就可以知道字首後面的字元是什麼了,islast用來記錄當前節點對應的字元是否是最後乙個字元,fre用來計算當前節點對應的字元出現的次數
對於節點主要有插入和查詢這兩個操作,先插入後進行查詢:
① 插入的時候可以傳進需要插入的字串,並將其轉化為字元陣列,通過迴圈將對應的類陣列的位置標記一下(其實就是宣告乙個trienode節點賦值到這個類陣列對應的位置),這裡需要宣告乙個trienode型別的指標進行移動,方便儲存下乙個字元,這裡的上乙個字元與下乙個字元是父子之間的關係,通過物件的引用將它們聯絡起來
②搜尋的時候可以傳進來需要搜尋的字串,先將其轉化為字元陣列,通過迴圈來檢視當前字元對應的位置上是否有過標記,假如為空說明字典中不存在這個字首直接退出函式即可,假如迴圈之後都不為空說明在插入的時候字首是插入到字典中的,此時trienode指標指向字首最後乙個字元的類陣列的節點
③在完成了②之後我們還可以進行列印操作,可以對插入的所有字串進行列印出來,這個時候需要使用到dfs演算法來進行列印,因為我們知道在插入的時候這些節點通過引用連線起來就是一棵樹,通過dfs可以按照字典序的順序將全部插入的字串列印出來
此外因為在②中我們是將trienode指標指向字首最後乙個字元的類陣列的節點,這個時候呼叫列印函式列印出字首字串對應的所有字尾,在輸出函式中傳入trienode指標,表示指向的是當前類陣列中某乙個的位置,通過dfs即可列印出全部的字尾
3. **如下:
①trienode**:
public class trienode
trie**:
public class trie
public void insert(string str)else
}p.islast = true;
}public void print(string prefix, trienode p)
for(int i = 0; i < 26; i++)}}
public void search(string prefix)else
}print("", p);
}public void printall()
}
③ junited單元測試**:
import org.junit.before;
import org.junit.test;
public class trietest
//字首為空的所有字尾
@test
public void dfs() throws exception
@test
public void search() throws exception
}
Trie字首樹簡單實現
trie樹,字首樹,字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構。典型應用是用於統計和排序大量的字串 但不僅限於字串 可以用於搜尋引擎系統,用於文字詞頻統計。trie利用字串的公共字首來避免無謂的查詢,從而降低查詢時間的開銷以達到提高效率的目的。1.根節點不包含字元,除根節點外每乙個節點都只包含乙個...
字典樹 字首樹 簡單實現
又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。查詢 插入 刪除 此段 沒有實現刪除 在每...
字首樹 java實現)
package class 07 字首樹 例子 乙個字串型別的陣列arr1,另乙個字串型別的陣列arr2。arr2中有哪些字元,是arr1中出現的?請列印 arr2中有哪些字元,是作為arr1中某個字串字首出現的?請列印 arr2中有哪些字元,是作為arr1中某個字串字首出現的?請列印arr2中出現...