優先佇列(堆)的基本結構(1)

2021-07-05 01:05:02 字數 1625 閱讀 7088

摘要:優先佇列是指的佇列可以提高最高優先順序的資訊,並且它的刪除與插入操作都可以保證這個結構不被破壞;

(1)基本資料結構:由乙個代表堆大小的變數,堆容量的變數,還有乙個可以動態分配的陣列.

(2)陣列的第乙個元素不用,編號從1開始.,該佇列可以看成一棵二叉樹,父節點總是比子節點要小.。同時堆是乙個被完全填滿的二叉樹,有可能的例外是在最後一層.

(3)可以用乙個陣列來存放堆,因為很容易證明(數學歸納法)如果乙個節點的標號是i,那麼它的左兒子是2i,右兒子是2i+1;

(4)注意第乙個元素存放了乙個比所有實際資料都小的值,這樣在進行後面的例程有一點好處.

#include "stdafx.h"

#include "string.h"

#include "stdlib.h"

#include "malloc.h"

#define mindata -1000;

typedef

struct heapstruct* heap;

struct heapstruct

;int isfull(heap h)

int isempty(heap h)

heap initialize(int size)

h->heapsize = 0;

h->capcity = size;

h->element = (int *)malloc(sizeof(int)*(size+1));

h->element[0] = mindata;

return h;

}

下面是插入例程:

注意到,和二叉平衡樹一樣,我們要保證插入操作不能破壞掉堆的大小關係結構;首先從最後乙個節點往上溯搜尋。當某個節點比要插入的元素大時,那麼可以將該元素放入這個節點.但是被覆蓋掉的元素怎麼辦呢?因此在搜尋的時候我們就要進行移位,使得每乙個搜尋路徑上的元素都往後退一格,(從另乙個角度也是最後的空節點在不停的往上走),直到空穴找到合適插入的位置.這種操作叫做

void insert(heap h,int x)

else

}

下面是刪除的例程:

刪除例程:每次刪除都是刪除最小的.刪除根是很簡單的,難點在於如何安排後面的元素。基本思路是選取根中最小的兒子,將它上移動到空出的根節點.這樣又會空出乙個新的空穴,檢測最後的節點是否適合該空穴(小於該空穴的兩個子女),這樣該空穴將一路下溯,直到滿足條件。

但有一些小細節需要注意.

[1]首先我們要保證不會降至最後一層,因為最後一層的節點沒有兒子.

[2]其次要注意有可能有乙個節點只有乙個兒子,我們必須進行檢測;

void

deletemin(heap

h) h->element[i] = lastelement;

}else

puts("the heap is empty");

}

堆(優先佇列)的基本操作

堆是一棵完全二叉樹,所以可以利用陣列來實現。以1號作為root,則對於陣列中的任意乙個i,其左兒子在 2 i 右兒子在 2 i 1 父親在 i 2 下面以最小堆為例,實現一些基本操作 define inf 0x3f3f3f3f define max 1005 int heap max heap 0 ...

資料結構 堆(優先佇列)

一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...

資料結構 優先佇列(堆)

什麼是堆 堆是一棵具有特定性質的二叉樹 堆的基本要求是堆中所有節點的值必須大於等於 或者小於等於 其孩子節點的值 堆應該是一棵完全二叉樹 堆的表示 由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間 public class heap private int ary private int ...