<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
堆(heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是一個可以被看做一棵樹的陣列物件,即是一種順序儲存結構的完全二元樹。
完全二元樹:對一棵深度為k、有n個結點二元樹編號後,各節點的編號與深度為k的滿二元樹相同位置的結點的編號相同,這顆二元樹就被稱為完全二元樹。[2]
最大堆:根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。
最小堆:根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。
int Heap[1024]; //順序結構的二元樹
若某結點編號為i,且存在左兒子和右兒子,則他們分別對應
Heap[i*2+1]; //左兒子 Heap[i*2+2]; //右兒子
其父節點
Heap[i/2]; //i的父節點
在專案開發中,經常以動態陣列形式出現,在本文主要對這種形式進行介紹
//預設容量 #define DEFAULT_CAPCITY 128 typedef struct _Heap { int *arr; //儲存元素的動態陣列 int size; //元素個數 int capacity; //當前儲存的容量 }Heap;
只使用InitHeap()函數進行初始化即可,AdjustDown()與BuildHeap()僅為堆建立時的內部呼叫
//向下調整,將當前結點與其子結點調整為最大堆 //用static修飾禁止外部呼叫 static void AdjustDown(Heap& heap, int index) { int cur = heap.arr[index]; //當前待調整結點 int parent, child; /* 判斷是否存在子結點大於當前結點。 若不存在,堆是平衡的,則不調整; 若存在,則與最大子結點與之交換,交換後該子節點若還有子結點,則以此方法繼續調整。 */ for (parent = index; (parent * 2 + 1) < heap.size; parent = child) { child = parent * 2 + 1; //左子結點 //取兩個子結點中最大節點,(child+1)<heap.size防止越界 if (((child + 1) < heap.size && (heap.arr[child] < heap.arr[child + 1]))) child++; //判斷最大子結點是否大於當前父結點 if (cur >= heap.arr[child]) //將此處的>=改成<=可構建最小堆 { //不大於,不需要調整 break; } else { //大於,則交換 heap.arr[parent] = heap.arr[child]; heap.arr[child] = cur; } } }
//建立堆,用static修飾禁止外部呼叫 static void BuildHeap(Heap& heap) { int i; //從倒數第二層開始調整(若只有一層則從該層開始) for (i = heap.size / 2 - 1; i >= 0; i--) { AdjustDown(heap, i); } }
//初始化堆 //引數:被初始化的堆,存放初始資料的陣列, 陣列大小 bool InitHeap(Heap &heap, int *orginal, int size) { //若容量大於size,則使用預設量,否則為size int capacity = DEFAULT_CAPCITY>size?DEFAULT_CAPCITY:size; heap.arr = new int[capacity]; //分配記憶體,型別根據實際需要可修改 if(!heap.arr) return false; //記憶體分配失敗則返回False heap.capacity = capacity; //容量 heap.size = 0; //元素個數置為0 //若存在原始陣列則構建堆 if(size>0) { /* 記憶體拷貝,將orginal的元素拷貝到堆陣列arr中 size*sizeof(int)為元素所佔記憶體空間大小 */ memcpy(heap.arr,orginal, size*sizeof(int)); heap.size = size; //調整大小 BuildHeap(heap); //建堆 } return true; }
//以樹狀的形式列印堆 void PrintHeapAsTreeStyle(Heap hp) { queue<int> que; int r = 0; que.push(r); queue<int> temp; while (!que.empty()) { r = que.front(); que.pop(); if (r * 2 + 1 < hp.size) temp.push(r * 2 + 1); if (r * 2 + 2 < hp.size) temp.push(r * 2 + 2); if (que.empty()) { cout << hp.arr[r] << endl; que = temp; temp = queue<int>(); } else cout << hp.arr[r] << " "; } }
int main() { Heap hp; int vals[] = { 1,2,3,87,93,82,92,86,95 }; if (!InitHeap(hp, vals, sizeof(vals) / sizeof(vals[0]))) { fprintf(stderr, "初始化堆失敗!n"); exit(-1); } PrintHeapAsTreeStyle(hp); return 0; }
95 93 92 87 1 82 3 86 2
#include <iostream> #include <queue> using namespace std; //預設容量 #define DEFAULT_CAPCITY 128 typedef struct _Heap { int* arr; int size; int capacity; }Heap; //向下調整,將當前結點與其子結點調整為最大堆 static void AdjustDown(Heap& heap, int index) { int cur = heap.arr[index]; //當前待調整結點 int parent, child; /* 判斷是否存在子結點大於當前結點。 若不存在,堆是平衡的,則不調整; 若存在,則與最大子結點與之交換,交換後該子節點若還有子結點,則以此方法繼續調整。 */ for (parent = index; (parent * 2 + 1) < heap.size; parent = child) { child = parent * 2 + 1; //左子結點 //取兩個子結點中最大節點,(child+1)<heap.size防止越界 if (((child + 1) < heap.size && (heap.arr[child] < heap.arr[child + 1]))) child++; //判斷最大子結點是否大於當前父結點 if (cur >= heap.arr[child]) //將此處的>=改成<=可構建最小堆 { //不大於,不需要調整 break; } else { //大於,則交換 heap.arr[parent] = heap.arr[child]; heap.arr[child] = cur; } } } //建立堆,用static修飾禁止外部呼叫 static void BuildHeap(Heap& heap) { int i; //從倒數第二層開始調整(若只有一層則從該層開始) for (i = heap.size / 2 - 1; i >= 0; i--) { AdjustDown(heap, i); } } //初始化堆 //引數:被初始化的堆,存放初始資料的陣列, 陣列大小 bool InitHeap(Heap& heap, int* orginal, int size) { //若容量大於size,則使用預設量,否則為size int capacity = DEFAULT_CAPCITY > size ? DEFAULT_CAPCITY : size; heap.arr = new int[capacity]; //分配記憶體,型別根據實際需要可修改 if (!heap.arr) return false; //記憶體分配失敗則返回False heap.capacity = capacity; //容量 heap.size = 0; //元素個數置為0 //若存在原始陣列則構建堆 if (size > 0) { /* 記憶體拷貝,將orginal的元素拷貝到堆陣列arr中 size*sizeof(int)為元素所佔記憶體空間大小 */ memcpy(heap.arr, orginal, size * sizeof(int)); heap.size = size; //調整大小 BuildHeap(heap); //建堆 } return true; } //以樹狀的形式列印堆 void PrintHeapAsTreeStyle(Heap hp) { queue<int> que; int r = 0; que.push(r); queue<int> temp; while (!que.empty()) { r = que.front(); que.pop(); if (r * 2 + 1 < hp.size) temp.push(r * 2 + 1); if (r * 2 + 2 < hp.size) temp.push(r * 2 + 2); if (que.empty()) { cout << hp.arr[r] << endl; que = temp; temp = queue<int>(); } else cout << hp.arr[r] << " "; } } int main() { Heap hp; int vals[] = { 1,2,3,87,93,82,92,86,95 }; if (!InitHeap(hp, vals, sizeof(vals) / sizeof(vals[0]))) { fprintf(stderr, "初始化堆失敗!n"); exit(-1); } PrintHeapAsTreeStyle(hp); return 0; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45