二叉堆
容易证明:
一棵高为h的完全二叉树有2^h 到 2^(h+1)-1个结点。
这就意味着,完全二叉树的高是[logN]
特点:
任意位置i:
左儿子在位置2i上,右儿子在位置2i+1上,父亲在i/2上
一个堆数据结构将由一个Comparable数组和一个代表当前堆的大小的整数组成:
优先队列的接口:
1 template <typename Comparable> 2 class BinaryHeap 3 { 4 public: 5 explicit BinaryHeap ( int capacity = 10 ); 6 explicit BinaryHeap ( const Vector<Comparable> & items); 7 8 bool isEmpty() const; 9 const Comparable & findMin() const; 10 11 void insert(const Comparable & x); 12 void deleteMin(); 13 void deleteMin(Coparable & minItem); 14 void makeEmpty(); 15 private: 16 int currentSize; 17 vector<Comparable> array; 18 void buildHeap(); 19 void percolateDown(int hole); 20 }
堆序的性质:如果想要找到一个最小点,最好是把最小值移动到堆的最上方,使用方法: 上滤
应用比如插入一个元素到堆中:
1 void insert(const Comparable & x) 2 { 3 if(currentSize == array.size()-1) 4 array.resize(array.size()*2); 5 6 int hole = ++currentSize; 7 8 for( ; hole > 1 && x < array[hole/2];hole /= 2) 9 array[hole] = array[hole/2]; 10 array[hole] = x; 11 }
想要删除一个堆结点,一般都是要把堆结点移动到最顶端,然后通过 下滤 方法删除:
1 void deletMin() 2 { 3 if(isEmpty()) 4 throw UnderflowException(); 5 6 array[1] = array[currentSize--]; 7 percolateDown(1); 8 } 9 void deleteMin(Comparable & minItem) 10 { 11 if(isEmpty()) 12 throw UnderflowException(); 13 minItem = array[1]; 14 array[1] = array[currentSize--]; 15 percolateDown(1); 16 } 17 void percolateDown(int hole) 18 { 19 int child; 20 Comparable tmp = array[hole]; 21 for( ; hole*2 <= currentSize;hole = child) 22 { 23 child = hole*2; 24 if(child != currentSize && array[child+1] < array[child]) 25 child++; 26 if(array[child] < tmp) 27 array[hole] = array[child]; 28 else 29 break; 30 } 31 array[hole] = tmp; 32 }
堆的其他操作:
decreaseKey(p,@):把p结点的元素减少到p-@
increaseKey (p,@):把p结点的元素增加到p+@
remove (p)一般都是先用decreaseKey(p,无限大),减少到最小,然后移动至堆顶端,用deleteMin方法删除。
buildHeap:构造堆原始集合
1 explicit BinaryHeap( const vector<Comparable> & items): array(item.size()+10),currentSize(items.size()) 2 { 3 for(int i=0;i<items.size();i++) 4 array[i+1] = items[i]; 5 buildHeap(); 6 } 7 void buildHeap() 8 { 9 for( int i = currentSize/2; i>0;i--) 10 percolateDown(i); 11 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?