堆的定义:有如下性质的完全二叉树:任意节点X所处的项的关键字大于或等于以X为根的子数中的所有节点出的项的关键字。
意义在于,在数据结构中,其常常被用作优先级队列的结构,其意义是每次从队列中获取的元素,总是最满足某个条件的;比如最大的元素;再例如先进先出队列所满足的特定条件就是,具备放入队列时间最早的那个元素。
堆实现的主要操作就是 插入和 删除(移除并获取那个最符合条件的元素)。先简单描述下逻辑
插入:1. 将新插入的元素,放置到队列的尾部。
2. 若该元素大于其父节点,两个元素互换。(上移操作)
3. 循环第2步,直至该元素没有父节点或小于其父节点。
删除:1. 移掉顶部的节点。
2. 将队末的元素放置到顶部。
3. 该节点与其子节点中较大的那个比较,若小于它,则交换位置,(下移操作)
4. 循环第3步,直到叶节点或不再比其子节点中较大那个小。
若是最小堆,比较都反过来。
在实现的中,用ArrayList作为其内部容器,首先因为ArrayList基于数组,方便快速定位,父节点与子节点的关系只需要计算下就可以得出: 【2*index + 1 】或【 (index -1)/2】, 其次ArrayList以及自动实现了写基础操作,扩容、判空、容器大小等。
public class Heap<T extends Comparable<T>> { ArrayList<T> items; int cursor; //用于计数 public Heap(int size){ items = new ArrayList<T>(size); cursor = -1; } public Heap(){ items = new ArrayList<T>(); cursor = -1; } /** * 上移操作 * @param index 被上移元素的起始位置。 */ void siftUp(int index){ T intent = items.get(index); while(index > 0){ int pindex = (index - 1)/2; T parent = items.get(pindex); if(intent.compareTo(parent) > 0){//上移的条件,比父节点大 items.set(index, parent); index = pindex; }else break; } items.set(index, intent); } /** * 下移操作 * @param index 被下移的元素的起始位置 */ void siftDown(int index){ T intent = items.get(index); int l_index = 2*index +1; while(l_index < items.size()){ T maxChild = items.get(l_index); int max_index = l_index; int r_index = l_index + 1; if(r_index < items.size()){ T rightChild = items.get(r_index); if(rightChild.compareTo(maxChild) > 0){ maxChild = rightChild; max_index = r_index; } } if(maxChild.compareTo(intent) > 0){ items.set(index, maxChild); index = max_index; l_index = index * 2 + 1 ; }else break; } items.set(index, intent); } public void add (T item){ //先添加到最后 items.add(item); //循环上移,以完成重构 siftUp(items.size() -1); } public T deleteTop(){ if(items.isEmpty()){ throw new NoSuchElementException(); } //先获取顶部节点 T maxItem = items.get(0); T lastItem = items.remove(items.size() -1 ); if(items.isEmpty()){ return lastItem; } //将尾部的节点放置顶部,下移,完成重构 items.set(0, lastItem); siftDown(0); return maxItem; } public T next(){ if(cursor < 0 || cursor == (items.size() -1)){ return null; } cursor++; return items.get(cursor); } public T first(){ if (items.size() == 0 ) return null; cursor = 0; return items.get(0); } public boolean isEmpty(){ return items.isEmpty(); } public int size(){ return items.size(); } public void clear(){ items.clear(); } }
转载
相关推荐
数据结构-java实现一个简单的最小堆结构SimpleHeap,展示了如何使用数组来实现最小堆,实现了最小堆的基本操作:插入和删除。insert 方法将元素添加到堆中,并调用 siftUp 方法来维护堆的性质。remove 方法删除堆顶...
这本书深入浅出地讲解了各种数据结构的理论基础和实现方法,涵盖了数组、链表、栈、队列、树、图等基本概念,以及排序和查找算法。 1. **数组**:数组是最基础的数据结构,它提供了一种在内存中连续存储相同类型...
5. **堆**:堆是一种部分有序的树形数据结构,通常用于实现优先队列。C++标准库中的`std::priority_queue`提供了堆的功能。 6. **散列表(哈希表)**:散列表通过散列函数将键映射到数组的索引,提供快速查找、插入...
数据结构中的堆是一种特殊的树形数据结构,通常用于实现优先队列。堆有两种主要类型:大根堆和小根堆。在大根堆中,每个父节点的值都大于或等于其子节点的值,而在小根堆中,每个父节点的值都小于或等于其子节点的值...
堆是一种特殊的数据结构,通常被用作优先队列的底层实现。在本主题中,我们将深入探讨堆的实现,特别是标准大学课程中教授的方法。 堆通常是一个完全二叉树,分为两种类型:最大堆和最小堆。在最大堆中,每个节点的...
堆是一种特殊的树形数据结构,常用于优先队列的实现,其特点是父节点的值总是大于或等于其子节点的值(最大堆)或小于或等于其子节点的值(最小堆)。 在C语言中,由于没有内置的动态内存管理机制来直接处理大字符...
相关链接 二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客二叉树的链式存储结构 #include...
在本话题中,我们关注的是“数据结构-利用堆分配方式实现串的操作”,这涉及到C++编程语言中的字符串处理以及堆内存管理。 首先,让我们了解“堆”是什么。在计算机科学中,堆通常指的是一个特殊的树形数据结构,它...
比较详细地讲述了堆排序的思路和代码实现,适合初学者
主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例,递归详解,二叉查找树和AVL树,堆、散列表和排序以及图论等。对于每一种数据结构的性质和用途,《计算机...
数据结构 NOTONLLY的SBT模板.cpp NOTONLLY的划分树模板.cpp NOTONLLY的后缀数组模板.cpp RMQ-ST算法.cpp RMQ线段树.cpp SBT.cpp SBT2.cpp splay伸展树.cpp ST表.cpp Treap.cpp Trie树.cpp 二叉堆.cpp 二维线段树.cpp...
堆是一种可以轻松实现最大值或最小值优先队列的数据结构;散列表则是通过散列函数将键映射到数组索引,用于快速查找。 在“5天数据结构从入门到精通”的学习过程中,你可能会逐步了解这些数据结构的原理,通过C语言...
3. **二叉堆实现**: 类似于优先队列,但更具体地使用二叉堆结构,可以快速地进行插入、删除和查找最大值操作。二叉堆是一种自平衡的数据结构,可以确保在O(log n)的时间内完成操作,对于大数据集尤其有效。 4. **...
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在数据结构中,树是一种非线性的数据结构,它模拟了自然界中树的概念,具有分层和父子关系的特点。在本压缩包中,我们...
在“数据结构-huffman”这个项目中,你可能会学习到如何使用编程语言实现上述步骤,例如使用Python的heapq库来构建最小堆。同时,你还会涉及到如何读取和写入哈夫曼编码文件,以及如何对原始文本进行编码和解码。 ...
哈希表则是通过哈希函数实现快速查找的数据结构,它提供了近乎常数时间的查找、插入和删除操作,是实现关联数组的关键。哈希冲突的解决方法,如开放寻址法和链地址法,也是学习的重点。 排序和查找是数据结构课程中...
这些代码可能包括了链表、数组、堆、栈、队列、二叉树、图等的实现,同时也可能包含了动态内存分配、数据结构的遍历、插入、删除等操作。 学习这套资料,你将能够: 1. 理解基本数据结构的逻辑构造,如线性结构、...
此外,数据结构的高级主题可能也会在源代码中有所体现,比如堆(用于优先队列和堆排序)、散列表(提供快速的存取和查找)、图的遍历算法(深度优先搜索和广度优先搜索)等。这些高级数据结构和算法在实际问题中有着...
堆(Heap)是一种特殊类型的数据结构,通常用于实现优先队列。在这个基于Python的数据结构实现中,我们将深入探讨堆的概念、用途以及如何用Python来实现。 堆是一个完全二叉树,其中每个父节点的值都大于或等于...
7. **堆**:堆是一种特殊的树形数据结构,满足堆性质(最大堆或最小堆)。堆常用于实现优先队列,并在排序算法(如堆排序)中有重要作用。 8. **散列表(哈希表)**:散列表通过哈希函数将数据映射到固定大小的数组...