字典樹原理 利用map實現

2021-09-26 18:46:42 字數 1368 閱讀 8728

字典樹用於統計次數、在一堆字串中查詢特定字串等環境中,效率較高。通常從根節點開始,每個節點存入字元,該字元的下層節點仍然有乙個map,用於存放第二個節點的字元,以此類推。

如圖的字典樹,有兩個字串,abd和ac。當然,可以在每個節點上增加結束標識,用於標識他也是乙個完整的字串。比如,在b節點的表示欄位上標識結束,那麼就有三個字串,ab,ac和abd。

//字典樹

struct stnode

;int main()

; stnode *psthead = new stnode();

for (auto &it : veval)

else

}} std::string strinfo = "aer";

stnode *pstinfo = psthead;

for (int i = 0; i < strinfo.size(); ++i)

if (i == strinfo.size() - 1)

else

}pstinfo = itfind->second;

} return 0;

}

原本專案中的**使用大量if elseif進行判斷,但是當量較大時,if elseif採用依次遍歷的方式比較,效率較低。但是switch天生不支援字串的比較,也確實比較麻煩。關於if else和switch的區別,switch case實際上是維繫了乙個連續的記憶體空間,類似於陣列,每次對比乙個值,先判斷是否超過最大陣列下標,沒有超過就直接用陣列去呼叫。以空間換時間。當然,如果數值中間跨度較大的時候,不建議採用。例如,case 1:    case 100:    case 108,這樣的語句建議使用if else。同理,如果我們一定要比較字串,可以先手工雜湊一次,這樣就可以借助switch case來比較。

優缺點:

if elseif 可能需要遍歷所有的分支查詢,switch case因為生成了查詢表,所以不用遍歷,效率較高。

if elseif 允許任何情況的查詢,switch case在查詢分支相差較大的時候,浪費空間。例如,case 1: case 100:實際生成了101位的跳轉表。

if elseif 允許非常量查詢,switch case不支援。例如,if (10 < x && x < 100)

if elseif在多分支的時候,效率比較低,並且是逐個比較,因為在日常的**編寫過程中應當人為有意的,盡量將可能滿足的分支寫在靠前面的地方。雖然分支較多的時候效率較低,但是if elseif的應用場景更加靈活。switch case內部以空間換時間,在查詢上效率更高。對比看來,在很多情況下,字典樹是一種比較好的方法。

zz 字典樹原理 字典樹(講解 模版)

怕以後還要用到 就先轉了 from 字典樹原理 trie樹就是字典樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更...

字典樹實現

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

字典 順序表 列表 hash樹 實現原理

二.順序表 三.python 列表 list 注 字典型別是python中最常用的資料型別之一,它是乙個鍵值對的集合,字典通過鍵來索引,關聯到相對的值,理論上它的查詢複雜度是 o 1 缺點 特點 順序表增刪改查原理 1 順序表的初始化 順序表的初始化就是把順序表 初始化為空的順序表 只需把順序表的長...