字典樹學習總結

2021-07-16 22:27:59 字數 1947 閱讀 9332

解決問題:主要應對多次查詢,典例就是字典,字典樹就是一本字典,字典的最大好處就是能快速查詢;

主要原理:我們在查某乙個單詞時總會先索引第乙個字母,然後在查第二個字母,以此類推直到查到此單詞為止,那麼字典樹的查詢過程也是如此,先查第乙個字母的節點位置,然後在該節點的子節點之中查詢第二個字母的位置,以此類推,直到查到最後乙個字母,就相當於我們查到了這個單詞;想一想我們在查字典時查到某個字母,這個字母下面還會有很多單詞,而這些單詞都通過這個字母連起來,我們要查到其中某乙個單詞的話必須要經歷這個字母,即單詞具有相同的字首時,有相同的就要合併,計算機優化的就是相同的東西,盡量讓乙個東西只出現一次,根據這個我們可以構建一棵字典樹,具有相同字首的單詞連在同乙個節點上,那麼查詢時我們就可以像查單詞一樣了;

主要操作:

建樹(插入):1。設定三個指標,乙個指向待插入字串(序列),乙個指向樹的根節點,另乙個不做初始化,稱為自由指標;

2、查詢首字母在在樹中的位置,如果當前的數節點的子節點之中沒有此字母,那麼動態分配乙個新節點記憶體使自由指標指向他並初始化方法,然後掛到當前節點之上(父節點),然後將當前節點指標下移,字串指標右移,更新節點中儲存的資料;

3.迴圈進行以上過程,直至待插入·字串指標移動到字串末尾為止;

void insert(char *str)

p1=p1->son[pos];//指標移動

++i;

} p1->flag=true;//更新節點資料(題目不同意義不同)

}

查詢:1.設定兩個指標並初始化: 乙個指向待查詢字串,乙個指向樹的根節點;

2.查詢第乙個字母在樹上的位置,如果為空,返回false(或者不返回,更新其他結果),如果找到,兩個指標移動到下一位,更新結果;

3. 迴圈進行步驟2,直至字串指標移動到末尾,返回結果;

bool find(char str)

return p->flag;//更新結果(題目不同變化不同) 返回結果

}

初始化:將動態申請的新節點中的資料進行初始化;

釋放記憶體:每次測試完之後記得釋放動態申請的記憶體,即字典樹,釋放過程利用遞迴,先將子節點釋放完在釋放父節點;

void init(node *p)//初始化節點p 

void delet(node *root)//釋放root為根的樹

delete(root);//再釋放根節點

}

注意:1.動態記憶體可能時間靜態的要慢,靜態的可能有時候又會超記憶體,所以應該如何選擇或者兩者結合用(用靜態儲存較大的資訊,字典樹用動態來存)具體情況應仔細斟酌;

2.當有多組測試資料時,釋不釋放動態申請的記憶體又是乙個問題,如果釋放,那麼空間複雜度減小,時間複雜度增高;不釋放,空間複雜度增高,時間複雜度減小,這也需要判斷具體哪乙個影響更大,然後選擇取捨;

3.對於各種題目,變形可能利用節點的資料,題目雖變,但利用字典樹的思想未變:查詢,所以確定用字典樹之後就是怎樣將問題轉化成如何查詢的問題了(注意逆向思維的運用);

詳細講解:

字典樹學習總結

字串的多模匹配,kmp,字典樹,ac自動機,現在學習字典樹 字典樹又稱為單詞查詢樹,用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻的統計。優點是利用字串的公共字首來減少查詢時間,最大限度減少無畏字串比較,查詢效率比雜湊樹高。其實字典樹就是dfa!每層是乙個狀態,只...

trie樹學習總結(字典樹模板)

trie樹 演算法簡介 字典樹,也叫trie樹,是一種比較實用的資料結構,無論是在acm競賽的題目中,還是字串相關的某些實際應用領域內,它都能發揮巨大的作用。首先來看看字典樹的本質是什麼。它其實是一棵儲存了很多字串的樹,這棵樹上的每一條邊就是某個或某些字串中的乙個字元,而從根節點到某乙個特定節點所經...

蒟蒻 字典樹學習總結

又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。根節點不包含字元,除根節點外每乙個節點都只...