1. 程式人生 > >幾種常見樹形資料結構小結

幾種常見樹形資料結構小結

最近新學習了很多厲害的資料結構,在大佬們的薰陶之下,也感悟了很多,對大佬們的實力也有了更加深厚的瞭解(先膜一番orz,換個姿勢zto,再來一次owz)

左偏樹

左偏樹又名可並堆,多被用來對一些需要合併的一個集合體進行操作,但其本身只能用於儲存最大值或是最小值,說來還是有一些雞肋。但是在一些僅僅需要找最大值,並將幾個堆合併起來時使用還是會有奇效。就好比猴王(詳見我的部落格),在這道題中使用可並堆就會有出其不意的效果。

線段樹

線段樹主要針對的是區間操作,對於大部分割槽間操作都是非常簡單的,所以一般遇到和區間有關的用線段樹總沒錯,其實有的時候程式碼不如樹狀陣列好寫但是還是很好想的,對於找一個連續區間的最大值,還是線段樹比較好,畢竟樹狀陣列對一個區間求最大值的操作,要實現的程式碼量並不比線段少,甚至還要難想和難調。所以具體情況要具體分析。線段樹還有一個神奇的應用就是,線段樹就可以寫掃描線。掃描線的原理也非常簡單易懂,就是一根線從下往上一直走,取覆蓋的長度可以算出面積和周長,不過程式碼實現複雜度有點高,程式設計難度比較大,但還是比較實用,畢竟跑得很快。

樹狀陣列

樹狀陣列最大的功能就是用來求和,用樹狀陣列求和只需要logn的時間,自然是非常的快。其中實現原理中有些二進位制的問題還是小有疑惑。為什麼要這樣操作,只要這樣做就行了。二進位制真的是一項博大精深的學問,怪不得計算機會使用它作為基礎。樹狀陣列用處也不只求和,他還可以用來求第k小,求逆序數對,在求逆序數對方面,樹狀陣列的能力可謂遠遠超過線段樹,線段樹簡直又難想,有難寫。並且樹狀陣列還可以拓展到多維而不是僅僅侷限於一維,在多維的求和問題中,樹狀陣列實在優秀至極,令人歎服,程式碼的實現也頗為簡便。實在是不可多得的一種好資料結構。

AVL樹

平衡樹中的一種,並不是很常用,它是一種基於二叉搜尋樹而成的一種資料結構。在每次插入時候都對目前子樹的根節點進行高度判斷,若左右兒子的高度之差大於等於2,就進行一波旋轉,旋轉分為4種,左旋,左右旋,右旋,右左旋。其中最基礎的是單旋,二旋可以通過單旋來實現,因為這裡只是小結一番,就不在過多敘述,在接下來的時間裡,博主會對這些資料結構一 一( 鬼知道這編譯器有什麼問題,打不出頓號應該是我輸入法的問題-_-||)進行講解。寫AVL樹的主要目的和作用是為熟悉旋轉操作,方便Splay的書寫,要說這玩意兒到底有啥用,確實沒啥用,大部分時間我們都更傾向與寫Splay畢竟沒有那麼複雜,效果也非常的好。但技多不壓身,多學一門是一門,它也可以鍛鍊我們的程式碼能力,何樂而不為呢?

伸展樹

Splay也是一種基於二叉搜尋樹的資料結構,他的主要目的是為了,降低時間複雜度,雖然有時它的時間複雜度很高但平攤下來也只就只是一個log,並不算差,它的旋轉分為6類,有單旋,也有雙旋,反正你不管怎麼旋都要把它旋到根節點。在插入的時候旋一旋,刪除的時候旋一旋,把時間複雜度平攤下去,也是十分優秀的一種資料結構。對於這種基礎性的資料結構,掌握的最好方法就是記模板,自己寫一個模板,然後記住,針對不同的題再在模板的基礎新增一些東西即可。