数据结构 d-堆

d-堆

二叉堆因为实现简单,因此在需要优先队列的时候几乎总是使用二叉堆。d-堆是二叉堆的简单推广,它恰像一个二叉堆,只是所有的节点都有d个儿子(因此,二叉堆又叫2-堆)。下图表示的是一个3-堆。注意,d-堆要比二叉堆浅得多,它将Insert操作的运行时间改进为。然而,对于大的d,DeleteMin操作费时得多,因为虽然树浅了,但是d个儿子中的最小者是必须找到的,如果使用标准算法,将使用d-1次比较,于是将此操作的时间提高到 。如果d是常数,那么当然两种操作的运行时间都为 O(logN)。虽然仍可以使用一个数组,但是,现在找出儿子和父亲的乘法和除法都有个因子d,除非d是2的幂,否则会大大增加运行时间,因为我们不能再通过二进制移位来实现除法和乘法了。D-堆在理论上很有趣,因为存在许多算法,其插入次数比删除次数多得多,而且,当优先队列太大不能完全装入内存的时候,d-堆也是很有用的,在这种情况下,d-堆能够以与B-树大致相同的方式发挥作用。

除了不能执行Find操作外(指以对数执行),堆的实现最明显的两个缺点是:将两个堆合并成一个堆是很困难的。这种附加的操作叫做Merge。存在许多实现堆的方法使得Merge操作的运行时间为O(logN),如下篇介绍的左式堆。

二叉堆

时间: 2024-08-02 11:03:24

数据结构 d-堆的相关文章

数据结构学习——堆

1 基本介绍 堆数据结构是一种数组对象,它可以被视为一颗完全二叉树.堆的访问可以通过三个函数来进行即, parent(i) return floor(i/2); left(i) return 2i; right(i) return 2i + 1; left操作可以通过一步左移操作完成,right操作可以通过左移并在地位+1实现,parent操作则可以通过把i右移一位得到.在实现中通常会使用宏或者内联函数来实现这三个操作. 二叉堆有两种,最大堆和最小堆.对于最大堆有 A[i] >= A[left(

数据结构之堆的插入、取值、排序(细致讲解+图片演示)

数据结构之堆(Heap):插入.取值.排序. 堆是一种数据结构,分为最小堆和最大堆,可以用二叉树来表示. 在二叉树的任意的一个三角结构中(一个父节点,两个子节点),需要满足以下两个条件: 1.父节点要是最小的,就是最小堆(或最大的,就是最大堆),两个子节点之间没有要求 2.数据插入的顺序是一层一层的,只有上一层存满,才会有下一层 下面我们以图片的形式演示最小堆的插入.取值.和排序操作,只要知道最小堆的原理,那么最大堆也就明白了. 假设我们有一个原始的最小堆如下: 插入操作: 当插入一个新值时,首

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

【数据结构】堆的实现(包括:默认成员函数,插元素push,删元素pop,访问根节点top,判空,大小)

在数据结构里,堆是一类很重要的结构.堆结构是一组数组对象,我们可以把它当作是一颗完全二叉树. 最大堆:堆里每一个父亲节点大于它的子女节点. 最小堆:堆里每一个父亲节点小于它的子女节点. 如图就是一个最大堆: 实现代码时我的测试序列是:int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 }; 我们把它的图画出来,便于分析. 实现代码如下: 建立头文件heap.hpp #define _CRT_SECURE_NO_WARNINGS 1 #includ

数据结构之堆(Heap)的实现

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构,所以堆也叫做二叉堆. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于   任何一个子节点的键值时为最小堆. 最大堆和最小堆是堆数据结构的重点.堆排序中使用特别的多. 堆的存储一般是用一个数组实现的,当然也可以用链式存储,但是特别麻烦. 如下我

【数据结构】堆

堆 这种数据结构.一般堆用来实现优先级队列.优先级队列:和通常的栈和队列一样,只不过里面的每个元素都有一个"优先级",在处理的时候,首先处理优先级最高的.通常包含三个操作getMax/delMax/insert 栈和队列算是优先级队列的特例. 使用其他数据结构均不能同时在O(lgn)的复杂度下完成.至少有一种操作要耗时O(nlgn).比如链表的插入操作O(1),但是获取最大值必须遍历链表. 可以使用BBST以上三个操作达到最好的时间复杂度O(lgn).事实上没必要用那么高端的数据结构来

[数据结构]最小堆的类模板实现

堆数据结构是一种数组对象,它可以被视为一科完全二叉树结构. 它的特点是父节点的值大于(小于)两个子节点的值(分别称为最大堆和最小堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 1.根结点若有子树,则子树一定也是堆. 2.根结点一定大于(或小于)子结点. 因为要求堆必须是完全二叉树,所以可以用线性的数据结构,比如数组,来实现堆. 利用数组实现,则对于长为N的堆中的元素从0到N-1排列,有: i的父结点:Parent(i)=(i+1)/2-1 i的左叶子:Left(i)=(

【数据结构】堆的删除

题目 实现在最小堆中删除给定序号为pos的元素,并由x返回,删除成功返回true,失败返回false.(注意:删除后要保持数据结构是最小堆.) 算法实现 在最小堆中删除给定序号为pos的元素,我们可以先删除该元素后将堆中最后一个元素补到该位子,然后向下调整为堆,在从该位置向上调整为堆. 1 如果堆空返回false 2 x = heap[pos]; // 返回元素 3 heap[pos] = heap[currentSize - 1]; //最后元素填补到pos结点 4 currentSize--

01玩转数据结构_08_堆和优先队列

堆: 树这种结构 本身在计算机科学领域 占有很重要的地位,这种数据结构之所以占有重要的地位,不仅仅是因为二分搜索树这样的一种结构, 是树本身这种形状可以产生很多拓展,对于不同的问题 ,我们可以稍微改变 或者 限制树这种数据结构的性质,从而产生不同的数据结构,高效的解决不同的问题, 从节开始,将会有四个章节介绍 四个不同的例子,它们分别是堆,线段树,字典树 以及 并查集 ,通过这些不同的树的结构,我们可以领会到 数据结构的灵活之处, 什么是优先队列: 优先队列(相对 高层的数据结构) 是 出队,入

基本数据结构之堆

堆的定义 堆是一个完全二叉树或者近似的完全二叉树 堆的性质 父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2.它的左右子结点下标分别为2 * i + 1和2 * i + 2 堆的特点 插入元素和弹出堆顶元素的时间复杂度lg(n) 判断序列是不是堆 根据性质判断 比如输入序列15,30,22,93,52,71,89,15是根节点,可以看出满足性