為什麼用樹不用鏈表?

肖湖樂

樹和鏈表都是數據結構中比較常見的存儲模型,使用什麼作為存儲的數據結構根據場景,需求而定。

鏈表是什麼?想象一根自行車鏈條,從中間折斷,從一端到另一端剛好就是單向鏈表結構,在JAVA中每個鏈表節點作為一個類,屬性為自身的數據和下一個節點的引用,一扣接一扣成為一張連續的鏈表!


鏈表的查找和刪除,修改都需要從頭部一個一個比較節點數據,直到找到匹配的那個數為止,很明顯這樣的查找次數大概為N/2(N為鏈表節點總數),也就是查詢的效率使用大O表示法表示為O(N),線性級別;一個總數為N=1024的鏈表需要平均比較512次才能做後面的增刪改操作,而修改和刪除只需要改變節點引用,效率很高!

再來看樹結構(以紅黑樹為例),就是生活中的樹倒過來,所有的數據掛在根節點上,通過一定的策略(紅黑樹通過旋轉,變色等,二叉搜索樹通過比較父節點)放置在合適的位置上,通常樹的深度都是常數級;

紅黑樹的查詢速度是非常快的,因為查詢效率為O(log2n),比如上面的1024的數據,最大的查詢比較次數為10,效率非常驚人!刪除節點也只需要最多三次旋轉就可以實現平衡;


以上樹結構舉例使用紅黑樹,是因為紅黑樹是一種性能良好的平衡樹,如果是二叉搜索樹(規則為比父節點小的放在左子節點,大的放右子節點),如果插入的數據為順序的,則二叉搜索樹就退變為一個鏈表結構,效率降低!換句話說不是說樹結構的查詢效率一定比鏈表好!

在數據量很低的時候,推薦使用鏈表,因為數據結構簡單,開發成本低,效率也不差!

在數據為順序插入時,不應該使用二叉搜索樹,在刪除操作頻繁的時候,不應該使用二叉搜索樹(因為數據重新平衡需要很大的代價),而應該使用紅黑樹等有保證平衡的策略的樹結構;


在數據量大的時候,使用平衡樹結構的效率提升是顯而易見的,從O(N)到O(log2n)的提升。

在JAVA8中,當hashMap的衝突(某個數組元素中的鏈表結構很長)達到一定值的時候,將會從鏈表結構轉變為紅黑樹,提高hashMap的查找性能。

關於更多數據結構的問題,請持續關注,會有其他更多的分享提供,謝謝!


分享到:


相關文章: