寫在前面trie,又稱字典樹,是一種用於實現字串快速檢索的多叉樹結構。trie的每個結點都擁有若干字元指標,若在插入或檢索字串時掃瞄到乙個字元c,就沿著當前節點的c這個字元指標,走向該指標指向的結點。正文:trie樹的基本操作我的沒有指標的版本理解:樹上的每個結點都記錄了兩個資訊,一是這個結點所代表的字元,二是這個字元是否是乙個字串的結尾
一、建立一棵trie樹1.初始化一棵空trie樹僅包含乙個根結點,這個根結點不代表任何字元
2.插入
當需要插入乙個字串s時,我們從根結點開始,掃瞄當前樹上結點的所有子結點,同時與字串中當前這一位的字元匹配,於是就可能出現兩種情況:
<1>匹配成功,當前樹上的這個結點恰好有乙個子結點代表的是字串中當前這一位的字元,則直接開始掃瞄這個子結點的所有子結點,去匹配字串中的下一位字元
<2>匹配失敗,那麼我們就給樹上的這個結點增加乙個子結點代表字串中當前這一位的字元,然後繼續程序
要注意的一點是,如果當前的這個字元是字串中的最後一位,那麼就要在樹上的相應結點處記錄一下。
這樣幹講484有點難懂?讓我來舉個栗子吧qaq
假設我現在要插入的字串是stark(沒錯我就是漫威死忠粉還有我本來想插乙個marvel的但是太長了)
目前的trie數是醬紫的
然後我現在要開始往裡插入啦!當前狀態是掃瞄到樹上的根結點&字串的第1位
如上所述我現在要在根結點的子結點中查詢代表了字元「s」的結點
轉化成圖就是醬紫噠
此時就是我說道的第<1>種情況,我們發現根結點的子結點中恰好有乙個結點可以與字串中的這一位匹配,於是我們繼續操作……
同樣的,「t」也可以匹配,那我們就繼續往下走……
現在掃瞄到代表t的結點,發現它的子結點中沒有能和字串中當前這一位「a」相匹配的,於是我們就給代表t的結點插入乙個子結點代表a
就是醬紫啦!然後我們再繼續往下操作……
中間過程我就省略啦,重複之前的步驟就好qwq
乙個世紀之後……我們的trie樹就變成了這個樣子
最後別忘了在代表字串結尾字元的結點打上標記哦
好啦,到此為止,我們就完成了向trie樹中插入乙個字串的操作啦!^_^
3.**實現
struct應該是對的吧,我也沒有試過呀qaq(瑟瑟發抖的蒟蒻)ttrie[max_point];//
max_point為最大結點數目
void build(string s)
//構建出這個結點
now=trie[now].son[s[i]-'
a'];//
繼續訪問
} trie[now].end=1;//
標記字串結尾
}
二、在trie樹上進行檢索當需要檢索乙個字串s在trie中是否存在時,我們可以像插入操作一樣去掃瞄。
檢索的結果無非就是存在和不存在兩種情況
存在很簡單,而對於不存在,同樣會有兩種情況
1.在匹配字串中的字元和trie樹上的結點時,出現trie樹上不存在代表字串中的某乙個字元的情況,那麼顯然這個字串就不可能存在於trie樹中了
2.匹配時字串中的每乙個字元都按順序存在與trie樹中,但trie樹中代表字串中最後乙個字元的結點沒有被標記為字串結尾,那麼這個字串同樣也是不存在於trie樹中的
就拿我們剛剛建立的trie樹舉個栗子吧
現在我要檢索三個字串是否存在於trie樹中
這三個字串分別是「maya」「soldier」「pet」(字串不包括「」)
我們先來檢索「maya」
字串的每一位都匹配成功並且最後一位在trie樹中也標記了是結尾,所以可知字串「maya」是存在於trie樹中的qwq
接下來檢索「soldier」
可以發現當匹配到字串中的「o」字元時匹配失敗,也就是我上面說到的第1種情況,因此可知「soldier」是不存在於trie樹中的。
最後我們來檢索「pet」
在匹配過程中,「pet」的每乙個字元都匹配成功了,但是匹配到最後一位時我們發現,代表「t」字元的這個結點沒有被標記為字串的結尾,這對應了我上面說到的第2種情況,所以最後可知「pet」也是不存在於trie樹中的。
好啦就是醬紫……我放了乙份**啦!
bool exist(string s)if(trie[now].end) return1;
else
return0;
}
遞迴的二三事
斐波那契數列,大家都很熟悉了,從第三項開始,就是把前面兩項之和加起來等於第三項,很多人也知道這道題目用遞迴來可以解,也很多人可以馬上順利的寫出遞迴 但是如果你多問一句也許他們就懵逼了,叫他們說一下對遞迴的理解,或者說斐波那契數列能有什麼改進的地方。很多人都知道斐波那契數列,漢諾塔問題要用遞迴,也許 ...
與Maxscript的二 三事
基於maxscript編寫3dsmax的工具相對較簡單,語言簡潔。但是在編寫過程中,也出現了一些無法解決的問題。比如現在我遇到的座標的問題 問題 利用maxscript編寫的匯出外掛程式,獲取物件座標時小數點後位數,距離越大越來小。描述 根本原因,官方解釋為 由於數字浮點計算的本質,距離過大或過小都...
我的女兒二三事
突然發覺應該給我的女兒寫點什麼了。其實在女兒出生的時候家裡買了一本厚厚的成長日記,最開始也會在每個月往裡面寫一點東西,記錄一下孩子的成長過程。說是給孩子看,其實是給自己看的,有時候寫著寫著,就想到孩子能夠看懂已經是長大以後了。或者到時候這個筆記本已經不知去處了。目前為止,這個筆記本是承載了非常多的意...