标题：堆
基本信息
拼音：duī
注音：ㄉㄨㄟˉ  正楷“堆”字
部首：土
五笔输入法：fwyg
笔画数：11
笔顺编号：12132411121
汉字释义
基本解释1、累积在一起的东西：堆栈。堆房。土堆。
2、累积在一起，聚积在一起：堆积。堆放。堆垒。堆摞。堆砌。
3、量词，用于成堆的物或成群的人：一堆人。详细解释【名】
1、形声。字从土，从隹（zhuī），隹亦声。“隹”为“锥”省。“土”与“隹”联合起来表示“锥形土包”。本义：锥形土包。
2、土堆；土墩，沙墩或水中聚集的礁石。
逾陇堆兮渡漠。——《楚辞·疾世》
激堆埼。——司马相如《上林赋》
呼水中沙堆为墠。——《尔雅·释水》注
3、常为排列的整齐有序的叠堆。如：草堆；柴火堆；堆云（形容密集众多）；堆堆（久久不动的样子；形容累积得很多的样子）。
【动】
堆积。堆，聚土。——《说文》
【量】
用来计量成堆的东西。卷起千堆雪。——宋·苏轼《念奴娇·赤壁怀古》
常用词语
1.堆冰 duībīng
[pack ice] 由大小浮冰推挤在一起形成混杂体的海上冰块
2.堆叠 duīdié
[pile up] 一层一层地码起来
案上堆叠着一摞新教材
3.堆垛 duīduò
[rick] 堆积成垛（如干草）
4.堆房 duīfáng
[storeroom;wareroom] 堆放杂物或货物的贮藏室
5.堆放 duīfàng
（1）[pile up]∶把货物放到或扔到堆上
采来的条石堆放在屋檐下
（2）[stack]∶成堆地放置大量的东西，尤其是整整齐齐地存放
把稻草堆放在打谷场上
6.堆肥 duīféi
[stock manure;compost] 一种通常是把粪便、杂草、茎叶泥土等堆起来发酵后制成，其大部分是由腐败的有机物组成的混合物，用作肥料和改良土质
7.堆谷场 duīgǔchǎng
[stackyard] 堆放禾杆或谷物的场地或田地
8.堆焊 duīhàn
[repair welding] 把金属熔化堆在工具或机器零件上的焊接法。用来修复机件的磨损、崩裂部分（常用电焊或气焊法）
9.堆积 duījī
（1）[heap up]∶把事物堆集成堆粮食堆积如山
（2）[store]∶集中成堆放置
林荫路中心常用来堆积冬天从路面上扫出来的雪
10.堆集 duījí
[heap] 成堆地聚在一起；堆积
案头堆集着画轴
11.堆集如山 duījí-rúshān
（1）[lie in a heap;pile up like a mountain] 东西堆积得像山一样。形容极多
每遇冬月，诸乡纳粟秆草，牛车阗塞道路，车尾相衔，数千万辆不绝，场内堆集如山。——宋· 孟元老《东京梦华录·外诸司》
（2）亦作“堆积如山”
12.堆金积玉 duījīn-jīyù
[amass a fortune] 形容财产多，非常富有
13.堆聚 duījù
[heap up] 堆积；聚集
堆聚成山
14.堆垒 duīlěi
[pile up] 堆叠
15.堆内 duīnèi
[in-pile] 表示在反应堆内进行实验或安放设备的术语
16.堆砌 duīqì
[pad;(fig) load one's writing with fancy phrases] 垒积砖石并用泥灰黏合，比喻写文章使用大量华丽而无用的词语，以扩大或加长篇幅（如书籍、杂志的文章、讲话）
17.堆土 duītǔ
[bank] 沿[正在成长的庄稼如芹菜的]埂堆土以保护植物或使之不见阳光而变白
18.堆笑 duīxiào
[showing all smiles] 显露笑容
满脸堆笑
19.堆栈 duīzhàn
[storehouse;warehouse;godown] 临时寄存货物的地方
一种数据结构
堆（英语：heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。 堆总是满足下列性质：
堆中某个节点的值总是不大于或不小于其父节点的值；
堆总是一棵完全树。
将根节点最大的堆叫做最大堆或大根堆，根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。支持的基本操作堆支持以下的基本:
build:建立一个空堆；
insert:向堆中插入一个新元素；
update：将新元素提升使其符合堆的性质；
get：获取当前堆顶元素的值；
delete：删除堆顶元素；
heapify：使删除堆顶元素的堆再次成为堆。
某些堆实现还支持其他的一些操作，如斐波那契堆支持检查一个堆中是否存在某个元素。算法思想不必将值一个个地插入堆中，通过交换形成堆。假设根的左、右子树都已是堆，并且根的元素名为R。这种情况下，有两种可能：
（1） R的值小于或等于其两个子女，此时堆已完成；
（2） R的值大于其某一个或全部两个子女的值，此时R应与两个子女中值较小的一个交换，结果得到一个堆，除非R仍然大于其新子女的一个或全部的两个。这种情况下，我们只需简单地继续这种将R“拉下来”的过程，直至到达某一个层使它小于它的子女，或者它成了叶结点。筛选法首先将要排序的所有关键码放到一棵完全二叉树的各个结点中（这时的完全二叉树并不具备堆的特性）。显然，所有的结点Ki都没有子女结点，因此以这样的Ki为根的子树已经是堆，然后从 的结点Ki开始，逐步把以为根的子树排成堆，直到以K0为根的子树排成堆，就完成了建堆过程。
在考虑将以Ki为根的子树排成堆时，以Ki+1，Ki+2，…，Kn-1为根的子树已经是堆，所以这时如果有Ki≤K2i+1和Ki≤K2i+2，则不必改变任何结点的位置，以Ki为根的子树就已经是堆；否则就要适当调整子树中结点的位置以满足堆的定义。由于Ki的左、右子树都已经是堆，根结点是堆中最小的结点，所以调整后Ki的值必定是原来K2i+1和K2i+2中较小的一个。不妨假定K2+1较小，将Ki与K2i+1交换位置，这样调整后Ki≤K2i，Ki≤K2i+1，并且以K2i+2为根的子树原来已经是堆，不必再作任何调整，只有以K2i+1为根的子树由于K2i+1的值已经发生变化（与Ki交换了），所以有可能不满足堆的定义（当K2i+1的左、右子树已经是堆）。这时可重复上述过程，考虑将K2i+1以为根的子树排成堆。如此一层一层递推下去，最多可以一直进行到树叶。由于每步都保证将子树中最小的结点交换到子树的根部，所以这个过程是不会反馈的。它就像过筛一样，把最小的关键码一层一层选择出来。建堆效率n个结点的堆，高度d =。根为第0层，则第i层结点个数为2i，考虑一个元素在堆中向下移动的距离。大约一半的结点深度为d-1，不移动（叶）。四分之一的结点深度为d-2，而它们至多能向下移动一层。树中每向上一层，结点的数目为前一层的一半，而子树高度加一。
这种算法时间代价为Ο（n)
由于堆有log n层深，插入结点、删除普通元素和删除最小元素的平均时间代价和最差时间代价都是
Ο（log n）。堆操作的具体实现在程序中，堆用于动态分配和释放程序所使用的对象。在以下情况中调用堆操作：
1.事先不知道程序所需对象的数量和大小。
2.对象太大，不适合使用堆栈分配器。
堆使用运行期间分配给代码和堆栈以外的部分内存。
传统上，操作系统和运行时库随附了堆实现。当进程开始时，操作系统创建称为进程堆的默认堆。如果没有使用其他堆，则使用进程堆分配块。语言运行时库也可在一个进程内创建单独的堆。（例如，C 运行时库创建自己的堆。）除这些专用堆外，应用程序或许多加载的动态链接库 (DLL) 之一也可以创建并使用单独的堆。Win32 提供了一组丰富的 API 用于创建和使用专用堆。有关堆函数的优秀教程，请参阅 MSDN 平台 SDK 节点。
当应用程序或 DLL 创建专用堆时，这些堆驻留于进程空间中并且在进程范围内是可访问的。某一给定堆分配的任何数据应为同一堆所释放。（从一个堆分配并释放给另一个堆没有意义。）
在所有虚拟内存系统中，堆位于操作系统的虚拟内存管理器之上。语言运行时堆也驻留在虚拟内存之上。某些情况下，这些堆在操作系统堆的上层，但语言运行时堆通过分配大的块来执行自己的内存管理。绕开操作系统堆来使用虚拟内存函数可使堆更好地分配和使用块。
典型的堆实现由前端分配器和后端分配器组成。前端分配器维护固定大小块的自由列表。当堆收到分配调用后，它尝试从前端列表中查找自由块。如果此操作失败，则堆将被迫从后端（保留和提交虚拟内存）分配一个大块来满足请求。通常的实现具有每个块分配的开销，这花费了执行周期，也减少了可用存储区。
Windows NT 的实现（Windows NT 4.0 版及更高版本）使用 127 个从 8 到 1,024 字节不等的 8 字节对齐块的自由列表和 1 个混合列表。混合列表（自由列表【0】）包含大小超过 1,024 字节的块。自由列表包含在双向链接表中链接在一起的对象。默认情况下，进程堆执行合并操作。（合并操作是组合相邻的自由块以生成更大的块的操作。）合并操作花费了额外的周期，但减少了堆块的内部碎片。
单个全局锁可防止多线程同时使用堆。此锁主要用于保护堆数据结构不受多线程的任意访问。当堆操作过于频繁时，此锁会对性能造成负面影响。
堆 (数据结构)
堆的定义如下：n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时，称之为堆。
" ki<=k2i,ki<=k2i+1;或ki>=k2i,ki>=k2i+1.（i=1,2,…,[n/2])"
若将和此次序列对应的一维数组（即以一维数组作此序列的存储结构）看成是一个完全二叉树，则堆的含义表明，完全二叉树中所有非终端结点的值均不大于（或不小于）其左、右孩子结点的值。由此，若序列{k1,k2,…,kn}是堆，则堆顶元素（或完全二叉树的根）必为序列中n个元素的最小值（或最大值）。[1]