`
superhack
  • 浏览: 32061 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个简单的堆...

阅读更多

主要是支持对优先队列中某元素属性值的修改(通过equals查找, 并替换新的引用), 可以用于A*算法框架...

import java.util.*;

@SuppressWarnings("unchecked")
public class Heap<E extends Comparable<E>>{

	private E[] heap; // E[0] is not used...
	private int num;
	private Comparator<E> cmp;
	
	public Heap() {
		heap = (E[]) new Comparable[16];
	}
	
	public Heap(int n) {
		heap = (E[]) new Comparable[n];
	}
	
	public Heap(Comparator<E> cmp) {
		this();
		this.cmp = cmp;
	}
	
	public Heap(int n, Comparator<E> cmp) {
		this(n);
		this.cmp = cmp;
	}
	
	private int compare(E e1, E e2) {
		return (cmp == null) ? e1.compareTo(e2) : cmp.compare(e1, e2);
	}
	
	public void add(E e) {
		if (num == heap.length - 1) {
			E[] newHeap = (E[]) new Comparable[2 * heap.length];
			System.arraycopy(heap, 0, newHeap, 0, heap.length);
			heap = newHeap;
		}
		heap[++num] = e;
		raise(num);
	}
	
	public E peek() {
		if (num == 0)
			throw new NoSuchElementException();
		return heap[1];
	}
	
	public E poll() {
		if (num == 0)
			throw new NoSuchElementException();
		E e = heap[1];
		heap[1] = heap[num--];
		sink(1);
		return e;
	}
	
	private void raise(int hole) {
		E e = heap[hole];
		for ( ; hole > 1 && compare(e, heap[hole/2]) < 0; hole /= 2)
			heap[hole] = heap[hole/2];
		heap[hole] = e;
	}

	private void sink(int hole) {
		int child;
		E e = heap[hole];
		for ( ; hole * 2 < num; hole = child) {
			child = hole * 2;
			if (child < num && compare(heap[child+1], heap[child]) < 0)
				child++;
			if (compare(heap[child], e) < 0)
				heap[hole] = heap[child];
			else
				break;
		}
		heap[hole] = e;
	}
	
	public int indexOf(E e) {
		for (int i = 1; i <= num; i++)
			if (heap[i].equals(e))
				return i;
		return -1;
	}
	
	public void changeTo(E e1, E e2) {
		int i = indexOf(e1);
		if (i == -1)
			return;
		heap[i] = e2;
		if (compare(e2, e1) < 0)
			raise(i);
		else if (compare(e2, e1) > 0)
			sink(i);
	}
	
	public boolean isEmpty() {
		return num == 0;
	}
	
	public String toString() {
		StringBuilder sb = new StringBuilder();
		for (int i = 1; i <= num; i++)
			sb.append(heap[i] + " ");
		return sb.toString();
	}

	public static void main(String[] args) {
		Heap<Integer> heap = new Heap<Integer>();
		int[] nums = new int[10];
		Random r = new Random();
		for (int i = 0; i < nums.length; i++) {
			nums[i] = r.nextInt(100);
			heap.add(nums[i]);
		}
		System.out.println("----- Original -----");
		System.out.println(Arrays.toString(nums));
		System.out.println("-- Priority Queue --");
		System.out.println(heap);
		int x = nums[r.nextInt(nums.length)];
		int y = 33;
		heap.changeTo(x, y);
		System.out.format("change %d to %d in heap.\n", x, y);
		System.out.println(heap);
	}

}

 

分享到:
评论

相关推荐

    精通WindowsAPI.pdf

    1.1 第一个实例程序............................................................................................................16 1.1.1 sta rt.exe..........................................................

    Python实现的简单二叉堆(最小堆)示例.rar

    Python实现的简单二叉堆(最小堆)示例.rar Python实现的简单二叉堆(最小堆)示例.rar Python实现的简单二叉堆(最小堆)示例.rar Python实现的简单二叉堆(最小堆)示例.rar Python实现的简单二叉堆(最小堆)示例...

    使用C语言实现堆排序.docx

    下面是一个使用 C 语言实现堆排序的简单示例,并带有注释以解释每个部分的作用。 在堆排序算法中,首先需要构建一个最大堆,然后逐步取出堆顶元素(最大值),并调整堆,最终得到有序数组。堆排序的时间复杂度为 O...

    华为杯木块堆积问题.zip

    这个项目主要聚焦于解决一个名为“木块堆积”的问题,它可能是一个竞赛题目或挑战,如华为杯竞赛中的一个环节。在这个问题中,参与者需要用各种形状的木块堆叠起来,目标可能是达到一定的高度、稳定性或者满足特定的...

    Java实现堆排序.rar

    以下是一个简单的Java堆排序算法实现的伪代码: ```java class HeapSort { void heapify(int arr[], int n, int i) { // 代码实现下沉操作 } void swap(int arr[], int i, int j) { // 代码实现元素交换 } ...

    易语言二叉堆源码.rar

    4. **堆排序**:利用二叉堆的特性进行排序,先将待排序序列构造成一个大顶堆,然后每次将堆顶元素与末尾元素交换,再调整堆,重复此过程直到整个序列有序。 在易语言中实现二叉堆,还需要注意以下几个关键点: - *...

    vuenotifyme一个Vue的可堆叠通知警报

    【Vue Notify Me:一个强大的可堆叠通知警报系统】 Vue Notify Me是专门为Vue.js框架设计的一个组件库,它提供了一种优雅的方式来实现通知和警告系统。这个库的核心功能是创建可堆叠的通知,允许用户在应用的不同...

    假如我是一堆泥作文.doc

    【描述理解】:“假如我是一堆泥作文.doc”表明这是一篇以“假如我是一堆泥”为主题的作文文档,可能是一个学生的作业或创作,主要探讨的是自我牺牲和无私奉献的价值观。 【标签分析】:“范文”标签意味着这篇作文...

    用Java实现一个简单的JVM.zip

    "用Java实现一个简单的JVM"是一个深入理解Java运行机制的好项目,通过这个过程,我们可以学习到JVM的工作原理、内存管理以及指令解析等多个方面的知识。 首先,我们要理解JVM的基本结构。一个简单的JVM通常包含以下...

    Delphi 枚举内存堆的实例.rar

    Delphi 枚举内存堆的源码,一个简单的Delphi7 Windows相关编程实例,内存堆枚举的例子。源代码如下:ListView1.Items.BeginUpdate;  ListItem:=ListView1.Items.add;  ListItem.Caption:=IntTostr(HeapList.th32...

    一个简单的python实现的堆排序程序.zip

    一个简单的python实现的堆排序程序,实现了堆排序的全过程,不需要导入任何模块。

    简单的堆叠卡片样式jQuery轮播图插件.zip

    只需引入必要的CSS和JavaScript文件,加上简单的HTML结构和必要的初始化脚本,即可快速创建一个具有堆叠卡片效果的轮播图。 总结来说,MxSlider.js是一款强大的jQuery轮播图插件,其堆叠卡片样式和出色的响应式设计...

    重磅推荐-嵌入式开发常用算法工具类源码&规范合集(100+份).zip

    左倾堆.zip 最小生成树.zip 最短路径算法.zip 最大子段和问题的简单算法.zip 最大访客数.zip 最大m子段问题.zip 最长公共子序列问题.zip 资料.zip 重叠子问题的递归最优解.zip 约束满足搜索.zip 循环队列.zip 选择...

    最新版linux apache-tomcat-8.5.58.tar.gz

    Apache Tomcat 8.5.58是一个成熟的Java应用服务器,它支持Servlet、JSP和JavaServer Pages (JSP) 规范,使得开发Java Web应用变得更加简单。通过了解和掌握上述知识点,你可以在Linux环境中高效地管理和部署基于...

    SG11全平台扩展插件.rar

    简单解决PHP加密问题服务器安装SG11扩展多版本详细教程说明,解压都得到一堆文件,对应你自己的服务器,windows,Linux等,这里我们以windows为例,打开Windows 64-bi t我们找到对应我们服务器配置的文件夹....

    SciTech.NET.Memory.Profiler.v4.0.114.安装_注册机

    2. 捕获快照:在关键操作前后捕获内存快照,通过比较两个快照之间的差异,可以发现对象数量和大小的变化,从而找出可能导致内存泄漏的部分。 3. 分析结果:Profiler会显示内存中的对象类型、数量、大小等信息,以及...

    Rust语言实现冒泡、快排及堆排序.docx

    首先构建一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,缩小堆的大小并重新调整堆,重复这个过程直到堆为空。 #### 3.2 Rust 实现 在Rust中,可以通过以下方式来实现堆排序: ```rust fn heap_sort(arr: &mut...

    堆叠技术文档-交换机堆叠技术.doc

    堆叠的主要特点在于其将多个物理交换机视为一个逻辑单元进行操作。在堆叠中,一台交换机作为主交换机,负责控制和管理整个堆叠,而其他交换机则作为堆叠成员。主交换机是堆叠的单一管理点,所有配置和管理活动都通过...

Global site tag (gtag.js) - Google Analytics