【一】个人资料的最小堆为完全二叉树,非叶节点的值小于等于左儿童和右儿童的值。 本文图解说明最小堆的构建、插入、删除的过程。 知道了最小的山的相应知识后,最大的山与此相似。 最小堆示例:
【2】操作最小堆构建最小堆:
初始数组为9、3、7、6、5、1、10、2
沿着完全二叉树,依次填写数字。
填写完毕后,请填写从最后一个非叶子结点(本示例为数字6的节点)开始调整。
根据性质,小数字会向上移动; 至此,第一次调整完成。
请注意,对于已调整的节点和子节点,需要递归调整。
第二次调整是将数字6的节点排列的下标小1的节点(比数字6的下标小1的节点是数字7的节点)、
此示例的图示如下所示。
注意:数字9的节点将与数字1的节点互换。 更换后,需要递归调整,请注意。
以最小堆的元素插入 【插入到该二叉树的最后一个节点,再调整】以上的最小堆为例,插入数字0。
数字0的节点首先进入该二叉树的最后一个节点,根据最小堆的定义,从底向上递归调整。
插入操作的图示如下所示。
最小堆的节点删除【是把根节点删除,最后一个叶子节点放到根节点上,再调整】对于最小和最大堆,删除操作将发生在根节点上。
对于删除操作,将二叉树的最后一个节点置换为根节点,自上而下递归调整。
以下为图解。
【3】有常见的面试问题。 如何从包含10亿个数字的文档中检索最多10个数字? 计算机的内存只有1米吗?
考虑到10亿个数据很多,无法一次性放入我们的计算存储器
采用常用的排序算法可能也是因为操作不好,数据量大。
这个地方被认为可以用一堆小天花板来解决这个问题。
1、让计算机向io读取文件
2、将读取的数据制作成包含10个要素的小山顶山
3、构建完成后,每次将从文件中读取的一个数字与栈顶元素进行比较,
如果小于堆顶部的元素,请直接丢弃或跳过。 如果读取的数据大于堆上的元素,则为、
那么可以用这个元素代替炉顶元素来调整小炉顶。 所述算法的时间复杂度为o((100亿--1000 ) log )-1000 ),或o )-(n-m ) logM ),且空间复杂度为m
自转: https://blog.csdn.net/wenge 1477/article/details/101797674