有一種特殊形式的完全二叉樹——堆,它有兩種基本形式:最大堆和最小堆。
最大堆:如果一顆完全二叉樹的任意乙個非終結結點的元素都不小於其左兒子結點和右兒子結點的元素,則稱此完全二叉樹為最大堆。
最小堆:如果一顆完全二叉樹的任意乙個非終結結點的元素都不大於其左兒子結點和右兒子結點的元素,則稱此完全二叉樹為最小堆。
最大堆的根結點中的元素在整個堆中是最大的;而最小堆的根結點中的元素在整個堆中是最小的。
當把最大堆看做抽象資料型時,有以下幾個基本操作:
由於最大堆是一顆完全二叉樹,所以最大堆可以用一維陣列來表示。
#define maxsize 200
typedef
struct
elementtype;
typedef
struct
heap;
void maxheap(heap *heap)
int heapempty(heap heap)
當要插入乙個元素時,為了保持完全二叉樹的結構性質,新增結點的編號應為i=n+1。同時,為了保持最大堆的性質,還要把結點i的元素與其父結點的元素進行比較。如果結點i的元素大於其父結點的元素,則將結點i的元素與其父結點的元素進行交換,並令結點i的父結點成為新結點i,繼續向上比較,直到結點i的元素不大於其父結點的元素或者i到達根結點為止。
由於堆是一顆完全二叉樹,因此具有n個元素的堆,其高度為[log(n+1)]。這就意味著while迴圈要重複o(logn)次,因此插入函式的時間複雜性為o(logn)。
void
insert(heap *heap,elementtype
element)
heap
->
elements[i]=element;
heap
->
n++;
}
在最大堆中刪除最大元素時,一定是從堆的根結點中刪除元素。為了在刪除結點後保持完全二叉樹的結構性質,把最後乙個結點(編號最大的葉結點n)的元素暫存在根節點i=1中,此時完全二叉樹中元素的個數變為n-1,但可能不符合最大堆的定義。為了保持最大堆的性質,還需要比較結點i的元素預期較大兒子結點的元素。如果結點i的元素小於其較大兒子結點的元素,則將結點i與其較大兒子結點的元素對換,並令結點i的較大兒子結點成為新的結點i,繼續向下比較,直到結點i的元素不小於其較大兒子結點的元素或者i到達葉結點為止。
刪除操作的時間複雜性為o(logn)。
elementtype
deletemax(heap *heap)
heap->elements[parent]=tmp;
return element;}}
int main()
elementtype a[n+1],x;
printf("請依次輸入每個元素的值:");
經常使用堆來實現優先順序佇列。優先順序佇列只對最高(或最低)優先順序的元素進行刪除。但是在任何時候,都可以把任意優先順序的元素插入到優先順序佇列。如果應用程式要求刪除最高優先順序的元素,就使用最大堆。如果應用程式要求刪除最低優先順序的元素,則使用最小堆。
code及其實現
1.what is code?編碼並不是我隨便亂取的名字,其原理在資訊檢索導論第5章第3節有介紹,用於壓縮一連串有序的數字型別的資料非常有用。在mg中將 編碼歸類為全域性模型 mg更推崇區域性模型 其原理是將所有的資料分成兩部分連起來,第一部分為資料長度,第二部分為資料內容。這樣做的好處是對於很小的...
程序及其實現
一 程序的定義 1 程序是可併發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源分配和保護的基本單位 2 可以用來共享資源又能描述程式併發 為什麼要引入程序概念 1 刻畫程式的併發性 程式是併發執行的,這是由於資源共享和競爭問題,程式自身只是計算任務的指令和資料的描述,是靜態的,程序是...
mysql索引及其實現原理筆記
1 mysql索引的型別 mysql主要有以下幾種索引型別 fulltext,hash,btree,rtree。hash 只能用於等值查詢,不能用於範圍查詢。btree,rtree 可用於等值查詢 範圍查詢,btree為mysql的預設索引型別。2 索引種類 普通索引 唯一索引 主鍵索引 組合索引 ...