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