堆--一種可被視為完全二叉樹的結構,實現有多種方法
(一) c++ stl - 優先佇列實現
1.首先寫好佇列標頭檔案
#include
2.定義乙個int型、值小的數優先順序高(先出佇列)的佇列-----小根堆
*最後的'' 與『>』間注意留空格
priority_queue, greater> a;
大根堆的定義:
priority_queue> a;
//priority_queue, less> a;
3.操作:
往堆中加乙個元素:
a.push(x);
彈出堆頂元素:
a.pop();
訪問堆頂元素:
a.top();
堆的大小:a.size()
判斷堆是否為空:a.empty();
4.乙個經典的栗子:合併果子
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。
每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n-1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。
因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為1,並且已知果子的種類數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。
例如有3種果子,數目依次為1,2,9。可以先將1、2堆合併,新堆數目為3,耗費體力為3。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為12。所以多多總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。
輸入格式:
輸入包括兩行,第一行是乙個整數n(1<=n<=10000),表示果子的種類數。第二行包含n個整數,用空格分隔,第i個整數ai(1<=ai<=20000)是第i種果子的數目。
輸出格式:
輸出包括一行,這一行只包含乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於2^31。
輸入樣例:
31 2 9
輸出樣例:
15
我的**:
#include #include using namespace std;
priority_queue, greater> a;
int n, t, ans, x, y;
int main()
for(int i=1; i<=n-1; i++)
cout << ans << endl;
return 0;
}
(二)自定義結構體-陣列實現
在寫堆之前,首先要了解堆的性質:
設(從1儲存的)陣列heap,元素個數為heap_size;
- heap[1]表示堆頂;
- 如果乙個有中間結點是i,那麼它的左孩子的下標就是2*i,右孩子的下標就是2*i+1,父親是2*i
- 如果乙個結點i,1 <= i <= heap_size/2 那麼它有孩子; heap_size/2 < i <= heap_size 則結點i為葉子結點
小根堆:heap[i/2] <= heap[i];
大根堆:heap[i/2] >=heap[i];
下面以小根堆討論:
put()函式:在最後乙個位置加入元素,迴圈與父結點比較,若小於父結點則互換,直到大於等於父結點或到了根結點
get()函式:取走堆頂端元素,將最後乙個元素覆蓋根,迴圈與孩子比較,與左右(二或乙個)孩子中較小的互換,直到小於等於孩子或到了葉子結點
合併果子用這種方法
**(覺得不夠簡潔):
#include #include //int_max
using namespace std;
struct heap
void put(int x) else break;
} }int get(void) else if(a[index] > tmpy) else break;
} else else if(a[index] > tmpx) else break;
}} return rtn;
}};heap a;
int n, t;
int ans;
int main()
for(int i=1; i<=n-1; i++)
cout << ans << endl;
return 0;
}
2023年2月重構**-小根堆:
#include #include using namespace std;
struct heap
int top()
void down(int x) else
} }void up(int k)
} int insert(int v)
int pop()
}; int main()
for(int i=1; i<=n; i++)
return 0;
}
重構×3
struct priorityqueue
void push(int x)
a[i] = x;
} int top()
int pop()
a[i] = x;
return res;
}} heap;
(%二叉堆-binary_heap%!)
資料結構 堆 C
二叉堆堆排序 堆 heap 分為二叉堆 二項式堆 斐波那契堆,堆是非線性資料結構,相當於一維陣列,有兩個直接後繼。堆又被稱為優先佇列,儘管名為優先佇列,但堆並不是佇列。因為佇列遵循first in,first out,但是堆是按照元素的優先順序取出元素。所以 堆 是實現排程器的理想資料結構。堆排序與...
C 資料結構 18 堆
堆的實現通過構造二叉堆 binary heap 實為二叉樹的一種 由於其應用的普遍性,當不加限定時,均指該資料結構的這種實現。這種資料結構具有以下性質。任意節點小於 或大於 它的所有後裔,最小元 或最大元 在堆的根上 堆序性 堆總是一棵完全樹。即除了最底層,其他層的節點都被元素填滿,且最底層盡可能地...
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...