matlab建立最小堆演算法實現

2021-09-29 09:04:23 字數 3703 閱讀 9772

最小堆是一顆完全二叉樹,他的每乙個節點的值不大於其左右子節點的值。

leaf_name=['a','b','c','d','e','f','g','h'];

leaf_data=[10,1,1,11,1,1,8,5];

my_heap=heap();

my_heap.min_heap_create(leaf_name,leaf_data);

函式定義如下:

function heap = heap()

heap.size=0;

heap.name=;

heap.data=;

endfunction min_heap_create(heap,name,data)

n=length(name);

for n=1:n

heap.name(n)=name(n);

heap.data(n)=data(n);

heap.size=heap.size +1;

endend

執行結果如下:

node 1–>a–>10

node 2–>b–>1

node 3–>c–>1

node 4–>d–>11

node 5–>e–>1

node 6–>f–>1

node 7–>g–>8

node 8–>h–>5

圖狀表示如下:

因為最小堆的子樹也是最小堆,所以可以從底部開始建立,採用節點下沉演算法。如果子節點的值比本身小,將左右子節點中最小的乙個和本身交換,相等的情況下左子節點優先交換。逐步下降,直到本身的節點不大於子節點停止。**如下:

function heap_down_sink(heap,self)  

lchild =self*2;

rchild =self*2+1;

if(lchild <= heap.size && rchild <= heap.size)

if(heap.data(self) > heap.data(lchild) || heap.data(self) > heap.data(rchild))

if(heap.data(lchild) <= heap.data(rchild))%左右子樹相等的情況下,優先往左子樹下沉

heap_swap_node(heap,lchild,self);

heap_down_sink(heap,lchild);

else

heap_swap_node(heap,rchild,self);

heap_down_sink(heap,rchild);

endend

elseif(lchild <= heap.size)%僅僅只存在左葉子樹

if(heap.data(self) > heap.data(lchild))

heap_swap_node(heap,lchild,self);

endend

end

利用上面的節點下降演算法調整二叉堆,使之滿足最小堆的特性。方法是從最後乙個節點開始,逐個執行節點下沉演算法,就可以實現要求。函式如下:

function   min_heap_adjust(heap)                   

n=heap.size;

while(n>=1)

heap_down_sink(heap,n)

n=n-1;

end

end

執行結果如下:

node 1–>b–>1

node 2–>e–>1

node 3–>c–>1

node 4–>h–>5

node 5–>a–>10

node 6–>f–>1

node 7–>g–>8

node 8–>d–>11

圖狀表示如下:

插入節點不能破壞堆的特性,因此首先將堆的長度增加乙個耽誤,然後新增最後乙個元素。因為只有新新增的節點可能不滿足位置要求,因此對該節點執行上浮操作。具體做法是如果他的值小於其父母節點的值,那麼交換兩者的值,直到不滿足條件為止,即可調整好最小堆。**如下:

function min_heap_insert(heap,name,data)

%新增的節點新增的尾部

heap.size=heap.size +1;

heap.name(heap.size)=name;

heap.data(heap.size)=data;

%新增的節點做上浮的動作,達到排序的效果

heap_up_float(heap,heap.size);

endfunction heap_up_float(heap,self)

while(self >=2)

parent=floor(self/2);

if(heap.data(self) < heap.data(parent))

heap_swap_node(heap,parent,self);

endself =parent;

end

end

執行my_heap.min_heap_insert(『n』,3)後,執行結果如下:

node 1–>b–>1

node 2–>e–>1

node 3–>c–>1

node 4–>n–>3

node 5–>a–>10

node 6–>f–>1

node 7–>g–>8

node 8–>d–>11

node 9–>h–>5

圖狀表示如下:

取出最小節點仍然不能破壞最小堆的結構,方法是將根節點和最後乙個節點交換,那麼最後乙個節點就最小的節點。然後將堆的長度減小1個單位,此時只有根節點可能不滿足最小堆的特性,執行節點下沉演算法,就可以滿足要求。**如下:

function min_heap_popup(heap)

heap_swap_node(heap,1,heap.size);%交換根節點和尾結點

heap.size =heap.size -1;

heap_down_sink(heap,1);%根節點下沉

end

執行my_heap.min_heap_popup()後運算結果如下:

node 1–>e–>1

node 2–>n–>3

node 3–>c–>1

node 4–>h–>5

node 5–>a–>10

node 6–>f–>1

node 7–>g–>8

node 8–>d–>11

圖狀表示如下

最小堆建立

題目 實現最小堆兩個功能 1 增加乙個元素 2 輸出並刪除最小堆中的最小的數 輸入 第一行輸入乙個整數t,代表測試資料的組數。對於每組測試資料,第一行輸入乙個整數n,代表操作的次數。每次操作首先輸入乙個整數type。當type 1,增添操作,接著輸入乙個整數u,代表要插入的元素。當type 2,輸出...

最小堆怎麼建立

有乙個面試題,100w個數中找到最大的100個數。解決方式是,用乙個100個容量的最小堆,這100個數總數目前已知的最大的100個,而且 堆頂是小的,在繼續遍歷時候,只和堆定比較,如果這個數,比堆頂的大,就把這個數加入 這個堆。當遍歷完成後,這個最小堆中的數,就是最大的100個數了。當理解了這個,我...

最小堆的實現

這邊實現的是最小堆,最小堆是這樣定義的,首先堆是一棵完全二叉樹,每乙個節點都有乙個權值,滿足的條件是,父節點的權值總是大於等於子節點的權值 include using namespace std 最小堆類的定義如下 template class minheap template void minhe...