避免孤立的學習知識點,要關(guān)聯(lián)學習。
比如實際應用當中,我們經(jīng)常使用的是查找,排序以及增刪改,這在我們的各種管理系統(tǒng)、數(shù)據(jù)庫系統(tǒng)、操作系統(tǒng)等當中,十分常用,我們通過這個線索將知識點串聯(lián)起來:
數(shù)組的下標尋址十分迅速,但計算機的內(nèi)存是有限的,故數(shù)組的長度也是有限的,實際應用當中的數(shù)據(jù)往往十分龐大;而且無序數(shù)組的查找最壞情況需要遍歷整個數(shù)組;后來人們提出了二分查找,二分查找要求數(shù)組的構(gòu)造一定有序,二分法查找解決了普通數(shù)組查找復雜度過高的問題。任何一種數(shù)組無法解決的問題就是插入、刪除操作比較復雜,因此,在一個增刪查改比較頻繁的數(shù)據(jù)結(jié)構(gòu)中,數(shù)組不會被優(yōu)先考慮
普通鏈表由于它的結(jié)構(gòu)特點被證明根本不適合進行查找
哈希表是數(shù)組和鏈表的折中,同時它的設計依賴散列函數(shù)的設計,數(shù)組不能無限長、鏈表也不適合查找,所以也不適合大規(guī)模的查找
二叉查找樹因為可能退化成鏈表,同樣不適合進行查找
AVL樹是為了解決二叉查找樹可能退化成鏈表問題。AVL樹是嚴格的平衡二叉樹,平衡條件必須滿足(所有節(jié)點的左右子樹高度差的絕對值不超過1)。不管我們是執(zhí)行插入還是刪除操作,只要不滿足上面的條件,就要通過旋轉(zhuǎn)來保持平衡,而旋轉(zhuǎn)是非常耗時的,由此我們可以知道AVL樹適合用于插入與刪除次數(shù)比較少,但查找多的情況。
紅黑樹是二叉查找樹和AVL樹的折中。它是一種弱平衡二叉樹,但在每個節(jié)點增加一個存儲位表示節(jié)點的顏色,可以是紅或黑(非紅即黑)。通過對任何一條從根到葉子的路徑上各個節(jié)點著色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,因此,紅黑樹是一種弱平衡二叉樹(由于是弱平衡,可以看到,在相同的節(jié)點情況下,AVL樹的高度低于紅黑樹),相對于要求嚴格的AVL樹來說,它的旋轉(zhuǎn)次數(shù)少,所以對于搜索,插入,刪除操作較多的情況下,我們就用紅黑樹。
多路查找樹是大規(guī)模數(shù)據(jù)存儲中,實現(xiàn)索引查詢這樣一個實際背景下,樹節(jié)點存儲的元素數(shù)量是有限的(如果元素數(shù)量非常多的話,查找就退化成節(jié)點內(nèi)部的線性查找了),這樣導致二叉查找樹結(jié)構(gòu)由于樹的深度過大而造成磁盤I/O讀寫過于頻繁,進而導致查詢效率低下。
B樹與自平衡二叉查找樹不同,B樹適用于讀寫相對大的數(shù)據(jù)塊的存儲系統(tǒng),例如磁盤。它的應用是文件系統(tǒng)及部分非關(guān)系型數(shù)據(jù)庫索引。
B+樹在B樹基礎上,為葉子結(jié)點增加鏈表指針(B樹+葉子有序鏈表),所有關(guān)鍵字都在葉子結(jié)點 中出現(xiàn),非葉子結(jié)點作為葉子結(jié)點的索引;B+樹總是到葉子結(jié)點才命中。通常用于關(guān)系型數(shù)據(jù)庫(如Mysql)和操作系統(tǒng)的文件系統(tǒng)中。
B*樹是B+樹的變體,在B+樹的非根和非葉子結(jié)點再增加指向兄弟的指針, 在B+樹基礎上,為非葉子結(jié)點也增加鏈表指針,將結(jié)點的最低利用率從1/2提高到2/3。
R樹是用來做空間數(shù)據(jù)存儲的樹狀數(shù)據(jù)結(jié)構(gòu)。例如給地理位置,矩形和多邊形這類多維數(shù)據(jù)建立索引。 Trie樹是自然語言處理中最常用的數(shù)據(jù)結(jié)構(gòu),很多字符串處理任務都會用到。
Trie樹本身是一種有限狀態(tài)自動機,還有很多變體。什么模式匹配、正則表達式,都與這有關(guān)。