數據結構拾遺

對於常見數據結構的一個個人容易忘記的重點總結,用於找工作的時候快速複習吧

鏈表

有一個head指針,插入與刪除時候指定位置,

插入:

使用new分配內存,將插入節點執行深考貝。指定位置插入,用插入節點的next指向該位置的next,該位置的next指向插入節點。

刪除:

指點位置刪除,先找出前向節點,前向節點的next指向後向節點,delete刪除節點的分配的內存。

有一個top指針,每次針對秋褲指針進行。實現方式有鏈表實現和循環數組實現。

二叉查找樹

置空、查找、查最大、查最小、插入全部使用遞歸,記得遞歸函數要返回當前查找樹。

刪除:

分情況刪除或者懶惰刪除。分情況刪除如下三點。懶惰刪除是不刪除當前節點,只是給其作上標記,記爲已刪除,此方法適用於刪除不多的情況。
分情況刪除,使用遞歸找到要刪除的節點,按以下三種情況分析:
1、樹葉:直接刪除
2、有唯一子節點:將父節點指向唯一子結點,刪除當前節點。
3、有兩個兒子:將右子樹的最小節點替換到當前位置。而右子樹的最小節點不存在左子節點,故可將最小節點的刪除情況按照情況1、2來處理。
由於總是用右子樹的最小節點來替換要刪除節點,久之將導致左子樹比右子樹深。在沒有刪除和懶惰刪除的情況下,二叉查找樹的所有操作平均運行時間爲log(N)

AVL樹

有平衡條件的二叉樹:每個節點的左子樹與右子樹的高度最多差1。實際高度可由類似斐波那契數推出,比log(N)稍多。除去插入外,其它操作時間爲log(N)。

插入:

由於插入可能破壞AVL樹的特性,可以使用旋轉來修正。對於需要重新平衡的節點a,可能存在四種情況:
1、對a的左子節點的左子樹進行一次插入 插入發生在外部(左-左),可用單旋轉
2、對a的左子節點的右子樹進行一次插入 插入發生在內部(左-右),可用雙旋轉
3、對a的右子節點的左子樹進行一次插入 插入發生在內部(右-左),可用雙旋轉
4、對a的右子節點的右子樹進行一次插入 插入發生在外部(右-右),可用單旋轉

伸展樹

基本思想:當一個節點被訪問後,它就經過一系列AVL樹的旋轉操作被放到根上。因爲一個節點被訪問,它很可能不久後會被再次訪問。這種方法保證從空樹開始任意連續M次對樹的操作最多花費M*log(N)時間,即每次的攤還代價是log(N)。

B樹

M階B樹是滿足下列條件的樹:
1、樹的根或者是一片樹葉,或者其兒子數在2和M之間
2、除根外,所有非樹葉節點的兒子樹在[M/2]和M之間
3、所有的樹葉都在相同的深度上
所有數據都存儲於樹葉上,每一個內部節點上皆含有指向該節點各兒子的指針P1,P2……PM和分別代表在子樹P2,P3……PM中發現的最小關鍵字的值k1,k2……k(M-1)。對於每一個節點,其子樹P1中所有的關鍵字都小於子樹P2的關鍵字。樹葉所包含所有實際數據,這些數據或者是關鍵字本身,或者指向含 有這些關鍵字的記錄的指針。
其最大深度是[log_[M/2]N](即log以[M/2]爲底,N的對數)。查找使用logN時間,插入和刪除使用M時間。
B樹實際用於數據庫,在那裏樹被存儲在物理磁盤上而不是主存中,根節點存於主存中。雖然每次磁盤訪問花費logM來確定分支方向,但執行該操作的時間一般比讀存儲器的區塊(block)所花費的時間少得多。

插入:

困難發生於當前節點已有M個關鍵字時,我們應把它分裂爲兩個節點,而這使得父節點多了一個兒子,因而我們必須檢查這個節點是否可被父節點所接受。如果父節點已有M個節點,則父節點要被分裂成兩個節點。往上重複這個過程。當分裂到根節點時,則應創建一個新根,使它具有兩個子節點。

B+樹

在B-樹基礎上,爲葉子結點增加鏈表指針,非葉子結點的子樹指針與關鍵字個數相同;非葉子結點作爲葉子結點的索引;B+樹總是到葉子結點才命中;

優先隊列(堆)最少可執行兩種操作,插入與刪除最小者。

通過數組來實現,而且通常浪費掉數組的x[0]位置以簡便計算。用數組x[1]~x[n]總計n+1的數組來實現具有n個數據的堆。

二叉堆

底層上的元素從左到右完全填滿的二叉樹,叫完全二叉樹。其可由一個數組、代表最大值的整數、當前堆的大小來實現。
滿足堆序性的二叉樹稱爲二叉堆。堆序性:所有子節點小於父節點,根節點最小。

插入:

採用的策略叫上濾。當前節點p通過反覆的與其父節點位置p/2比較,當小於父節點時則交換,到最終停止。

刪除最小者:

依次找出子節點中最小者補上。(此方法不可行!!!)將破壞完全堆的形式
正確的方法應爲:取出x[1]的值待用,賦值x[1]=x[n],再將x[1](此時爲原x[n]的值)進行下濾。如此可保證是完全堆。
假設當前位置爲i,設c=2*i。if c>n終止,if c+1<n 則比較x[c]與x[c+1],if x[c]>x[c+1]   則 c=c+1。比較x[i]與x[c],若x[i]>x[c]則下濾,否則則終止。

堆排序:
使用一個數組,全部入堆,再swap堆的第一位與最後一位,數組長度固定,左側爲堆,將通過刪除最小者而不數縮減。而刪除的最小者,都依次放於原堆的最後位置上,當所有元素依最小次序出堆,則數組將達到從右至左從小到大排序。
此種排序方法重用了數組空間。如下圖,縱向從上往下爲時間方向,橫向爲數組內容。可見最開始爲空數組,入堆,後一邊出堆一邊排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章