`

数据结构-堆实现

    博客分类:
  • Java
 
阅读更多

 堆的定义:有如下性质的完全二叉树:任意节点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();
	}
}

 转载 

http://my.oschina.net/BreathL/blog/71602

分享到:
评论

相关推荐

    数据结构-java实现一个简单的最小堆结构SimpleHeap

    数据结构-java实现一个简单的最小堆结构SimpleHeap,展示了如何使用数组来实现最小堆,实现了最小堆的基本操作:插入和删除。insert 方法将元素添加到堆中,并调用 siftUp 方法来维护堆的性质。remove 方法删除堆顶...

    数据结构--严蔚敏--实现程序

    这本书深入浅出地讲解了各种数据结构的理论基础和实现方法,涵盖了数组、链表、栈、队列、树、图等基本概念,以及排序和查找算法。 1. **数组**:数组是最基础的数据结构,它提供了一种在内存中连续存储相同类型...

    数据结构-C++实现.zip

    5. **堆**:堆是一种部分有序的树形数据结构,通常用于实现优先队列。C++标准库中的`std::priority_queue`提供了堆的功能。 6. **散列表(哈希表)**:散列表通过散列函数将键映射到数组的索引,提供快速查找、插入...

    数据结构-堆及其应用PPT

    数据结构中的堆是一种特殊的树形数据结构,通常用于实现优先队列。堆有两种主要类型:大根堆和小根堆。在大根堆中,每个父节点的值都大于或等于其子节点的值,而在小根堆中,每个父节点的值都小于或等于其子节点的值...

    数据结构 堆的实现

    堆是一种特殊的数据结构,通常被用作优先队列的底层实现。在本主题中,我们将深入探讨堆的实现,特别是标准大学课程中教授的方法。 堆通常是一个完全二叉树,分为两种类型:最大堆和最小堆。在最大堆中,每个节点的...

    数据结构-利用堆分配方式实现串的操作C语言

    堆是一种特殊的树形数据结构,常用于优先队列的实现,其特点是父节点的值总是大于或等于其子节点的值(最大堆)或小于或等于其子节点的值(最小堆)。 在C语言中,由于没有内置的动态内存管理机制来直接处理大字符...

    数据结构-二叉树的创建与遍历方法实现方式.docx

    相关链接 二叉树的基础知识点:数据结构-----树和二叉树的定义与性质_Gretel Tade的博客-CSDN博客堆的相关方法代码实现:数据结构-----堆(完全二叉树)_Gretel Tade的博客-CSDN博客二叉树的链式存储结构 #include...

    数据结构-利用堆分配方式实现串的操作

    在本话题中,我们关注的是“数据结构-利用堆分配方式实现串的操作”,这涉及到C++编程语言中的字符串处理以及堆内存管理。 首先,让我们了解“堆”是什么。在计算机科学中,堆通常指的是一个特殊的树形数据结构,它...

    数据结构---堆排序

    比较详细地讲述了堆排序的思路和代码实现,适合初学者

    数据结构-从应用到实现 (java版)

    主要内容包括:算法效率的输入规模、阶和大O,数据结构的无序和有序列表,队列和栈基于数组和链表的设计实例,递归详解,二叉查找树和AVL树,堆、散列表和排序以及图论等。对于每一种数据结构的性质和用途,《计算机...

    常用数据结构 - C语言实现

    数据结构 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...

    数据结构-C源码实现

    堆是一种可以轻松实现最大值或最小值优先队列的数据结构;散列表则是通过散列函数将键映射到数组索引,用于快速查找。 在“5天数据结构从入门到精通”的学习过程中,你可能会逐步了解这些数据结构的原理,通过C语言...

    数据结构-------敢死队问题的4中实现方法

    3. **二叉堆实现**: 类似于优先队列,但更具体地使用二叉堆结构,可以快速地进行插入、删除和查找最大值操作。二叉堆是一种自平衡的数据结构,可以确保在O(log n)的时间内完成操作,对于大数据集尤其有效。 4. **...

    数据结构-抽象数据类型-树

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和组织数据,以便于执行各种操作。在数据结构中,树是一种非线性的数据结构,它模拟了自然界中树的概念,具有分层和父子关系的特点。在本压缩包中,我们...

    华科数据结构课程设计 数据结构-huffman

    在“数据结构-huffman”这个项目中,你可能会学习到如何使用编程语言实现上述步骤,例如使用Python的heapq库来构建最小堆。同时,你还会涉及到如何读取和写入哈夫曼编码文件,以及如何对原始文本进行编码和解码。 ...

    数据结构--课件.rar----帮您搞定数据结构

    哈希表则是通过哈希函数实现快速查找的数据结构,它提供了近乎常数时间的查找、插入和删除操作,是实现关联数组的关键。哈希冲突的解决方法,如开放寻址法和链地址法,也是学习的重点。 排序和查找是数据结构课程中...

    《数据结构》算法实现及解析--高一凡

    这些代码可能包括了链表、数组、堆、栈、队列、二叉树、图等的实现,同时也可能包含了动态内存分配、数据结构的遍历、插入、删除等操作。 学习这套资料,你将能够: 1. 理解基本数据结构的逻辑构造,如线性结构、...

    数据结构-郝斌-源代码-C

    此外,数据结构的高级主题可能也会在源代码中有所体现,比如堆(用于优先队列和堆排序)、散列表(提供快速的存取和查找)、图的遍历算法(深度优先搜索和广度优先搜索)等。这些高级数据结构和算法在实际问题中有着...

    基于python的数据结构代码实现-堆Heap

    堆(Heap)是一种特殊类型的数据结构,通常用于实现优先队列。在这个基于Python的数据结构实现中,我们将深入探讨堆的概念、用途以及如何用Python来实现。 堆是一个完全二叉树,其中每个父节点的值都大于或等于...

    数据结构----清华殷人昆数据结构笔记(C++版,ppt格式)

    7. **堆**:堆是一种特殊的树形数据结构,满足堆性质(最大堆或最小堆)。堆常用于实现优先队列,并在排序算法(如堆排序)中有重要作用。 8. **散列表(哈希表)**:散列表通过哈希函数将数据映射到固定大小的数组...

Global site tag (gtag.js) - Google Analytics