資料結構之堆

2021-07-06 01:14:17 字數 1531 閱讀 1442

之所以把堆放在二叉樹之後介紹,是因為堆跟二叉樹的關係太大了,前面說了:乙個大小為n的堆是一顆有n個節點的完全二叉樹。若該樹中每個結點的關鍵字值大於等於其雙親結點的關鍵字值。完全二叉樹的根稱為

堆頂,它的關鍵字值是整棵樹上最小的。這樣定義的堆稱為

最小堆。同理,若樹中每個節點的鍵值小於等於其雙親節點的鍵值,即根/堆頂的鍵值是最大的,這樣的樹就是

最大堆。

堆是n個元素的序列(k0

,k1,...

,kn-1

),當且僅當滿足ki

<= 

k(2i+1)且k

i <=

k(2i+2),(i

=0,1,

…,(n-2)/2

)時稱為堆

(最小堆

)。堆頂元素是序列的第乙個元素。

void adjustdown (theap, intr,int j):設(heap[r+1],…,heap[j]) 這j-r個位置上的元素已滿足特性:heap[i] <= heap[2i+1]且heap[i] <= heap[2i+2] (i=r+1,2,…,(j-1)/2)的條件,執行此函式將使得增加乙個元素heap[r],(heap[r], heap[r+1],…,heap[j])這j-r+1個元素也滿足堆的特性。

template void adjustdown (t heap, int r, int j)

heap[(child-1)/2]=temp;

}

則建立最小堆

void createheap(t heap,int n)

建堆的時間複雜度為o(n)。

由最小堆的完全二叉樹也可以構造一種有優先順序別的佇列,我們稱之為優先權佇列。其抽象資料型別如下:

adt prioqueue
void  adjustup (int j):設(q[0],…,q[j-1])這j位置上的元素已滿足特性:q[i] <= q[2i+1]且q[i] <= q[2i+2](i=0,1,l,(j-2)/2),執行此函式將使得增加乙個元素q[j],(q[0],q[1],…,q[j])這j+1個元素也滿足堆的特性。

template void prioqueue::adjustup (int j)

x=q[0];q[0]=q[--n];

adjustdown (0, n-1);//取走乙個元素則向上重新排一遍最小堆

}

既然棧和堆都學習過了,那麼把他們比較下有何異同(又是一道面試題有木有!)  首先,棧是線性結構(雖然也有鏈式表示,但程式中申請的棧都是順序表示的),而堆是二叉樹結構的非線性結構;棧是由高位址向下增長,受限於系統,一般棧的大小較小,而

堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大;棧在我們使用過之後會自動銷毀資料單元,而堆在申請完之後必須使用者手動free。

資料結構之堆

原帖 對於堆的資料結構的介紹,在網上搜了下,具體講的不是很多。發現比較好的一篇介紹堆的部落格是在此感謝他。通過對上面那篇部落格的學習,然後自己也去翻了下 演算法導論 裡面關於堆排序 heapsort 的介紹。這樣就對堆有了更加深刻的認識,在此,我結合自己的一點點理解,主要還是基於上面那篇部落格的內容...

資料結構之堆

堆 我們這裡指二叉堆 是一棵完全二叉樹,並且祖先節點的所有子孫節點都不小於 或不大於 祖先節點的值。通常我們把根節點作為第一層的話,那麼深度為h的堆就有2 h 1 2 h 1個節點,顯然擁有n個節點的堆,其高度為lgn。也就是說對堆進行插入語刪除操作我們都需要lgn的時間。由於堆的完全樹的性質,因此...

資料結構之堆

1.概述 堆 也叫優先佇列 是一棵完全二叉樹,它的特點是父節點的值大於 小於 兩個子節點的值 分別稱為大頂堆和小頂堆 它常用於管理演算法執行過程中的資訊,應用場景包括堆排序,優先佇列等。2.堆的基本操作 堆是一棵完全二叉樹,高度為o lg n 其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,...