`
shenyu
  • 浏览: 122584 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Heap 堆

阅读更多

这里的堆不是java中内存分配的堆。只是一种数据结构。

堆是二叉满树,满足条件:父节点的键值大于两个子节点的键值,这不同于二叉搜索树(见Tree),堆对于实现优先级队列是一种好的方式,相对于利用数组的优先级队列利用链表的优先级队列 来说,其插入与删除的效率都是O(log n)

此堆的实现使选择数组作为内部数据结构,使得此堆能容纳的数据有限,但找到最下一层的作右子节点比交方便。用数组存储树时,求当前节点的父节点和左右子节点的公式如下:假设当前节点坐标为x:

父节点:(x-1)/2

左子节点:2 * x + 1

右子节点:2 * x + 2

API如下:

    Heap:构造并指定需要的空间大小

    add:添加数据

    remove:删除最大的数据

    isEmpty:堆是否为空

    其余的都是辅助方法,其中最有用的是:

    trickleDown:将指定位置的节点,按照堆的约定规则向下调整到合适的位置

    trickleUp:将指定位置的节点,按照堆的约定规则向上调整到合适的位置

    print:测试辅助方法

Node为辅助类,表示要存取的键值与数值。

Heap.main:提供简短的测试。

class Node {//表示装数据的节点
    private int key; //排序的关键字
    private Object value;	//数据
    Node(int key, Object value) {
        this.key =  key;
        this.value = value;
    }
    int key() { return key; }
    Object value() { return value; }
}

class Heap {
    private Node[] array;	//序排序的数组
    private int pos;	//当前有效数据的个数
    Heap(int size) {
        array = new Node[size];
    }
   
    void add(Node node) {	//将新数据插入数组
        assert pos < array.length;
        array[pos] = node;	//将新数据插入数组的最后(堆的最后一个元素之后)
        trickleUp(pos++);	//将数据提升致恰当的位置
    }

    Node remove() {	//删除堆的顶
        Node result = array[0];	//将最后一个元素提至堆定
        array[0] = array[--pos];	//将堆顶下降为恰当位置
        trickleDown(0);
        return result;
    }

    boolean isEmpty() {
        return pos == 0;
    }

    private void trickleUp(int index) {
        Node bottom = array[index];		//暂存要提升的数据
        int parent = getParent(index);	//得到父节点的位置
        //如果节点存在,且父节点的关键字的值小于要提升数据的关键字
        while (index > 0 && array[parent].key() < bottom.key()) {
            array[index] = array[parent];	//将父节点下降,留出空位
            index = parent;	//重复以上过程
            parent = getParent(index);
        }
        array[index] = bottom;	//将暂存的数据放入恰当的位置
    }

    private void trickleDown(int index) {
        Node top = array[index];	//存放要下降的数据
        int left = getLeft(index);	//得到左子的位置
        int right = getRight(index);	//得到右子的位置
        int current;	//当前可能要下降的位置

        if(left < pos && right < pos)	//左右子节点有效,当前的位置设置为左右子节点中小的那个
            current = array[left].key() > array[right].key() ? left : right;	
        else if (left < pos) current = left;	//如果左子节点有效,则当前位置设置为左子节点
        else current = -1;	//没有可以下降的位置
        while(current != -1 && array[current].key() > top.key()) {	/当前节点有效且大于要下降的数据
            array[index] = array[current];	//将当前节点向上提升,留出空位
            index = current;	//重复以上过程
            left = getLeft(index);
            right = getRight(index);
            if(left < pos && right < pos)
                current = array[left].key() > array[right].key() ? left : right;
            else if (left < pos) current = left;
            else current = -1;
        }
        array[index] = top;	//将暂存的数据放入恰当的位置
    }

    private int getParent(int index) {
        return (index-1)/2;
    }

    private int getLeft(int index) {
        return 2 * index + 1;
    }

    private int getRight(int index) {
        return 2 * index + 2;
    }

    void print() {
        for(int i=0; i<pos; i++) {
            System.out.print(array[i].key() + ",");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        Heap heap = new Heap(100);
        heap.add(new Node(50,"hello"));
        heap.add(new Node(20,"jason"));
        heap.add(new Node(60,"peter"));
        heap.add(new Node(50,"orange"));
        heap.add(new Node(30,"temp"));
        heap.add(new Node(40,"hello"));
        heap.add(new Node(90,"jason"));
        heap.add(new Node(10,"peter"));
        heap.add(new Node(5,"orange"));
        heap.add(new Node(300,"temp"));
        heap.print();
        while(!heap.isEmpty()) {
            Node node = heap.remove();
            System.out.println(node.key() + " = " + node.value());
        }
    }
}

 

分享到:
评论

相关推荐

    Java VM Heap 堆分析(节选)

    ### Java VM Heap 堆分析知识点详解 #### JVM内的内存管理 Java虚拟机(JVM)在执行Java程序的过程中,会负责内存的分配与回收。内存管理主要包括对象的创建、存储以及垃圾回收等过程。 - **Root Set 和对象的...

    MaxHeap堆排序建堆类

    总结起来,"MaxHeap堆排序建堆类"是一个实现了最大堆概念的类,它可能包含了建堆、下沉、交换和排序等关键操作。通过测试类如"TinyTest",我们可以验证这个实现是否正确并符合预期。理解和掌握堆排序及其相关算法...

    Heap堆解题套路【LeetCode刷题套路教程6】

    Heap堆解题套路【LeetCode刷题套路教程6】

    sort_heap push_heap pop_heap 堆的各种算法

    最近在学习STL的源代码,看到这么多优秀的代码,心里痒痒的,于是自己实现了一遍,当然,有自己的特色,都是模块函数,稍稍用了一些traits特性。相互学习,呵呵

    MaxHeap 最大堆

    最大堆是一种特殊的树形数据结构,它满足堆的特性:每个节点的值都大于或等于其子节点的值。在最大堆中,根节点总是所有元素中的最大值。这种数据结构在计算机科学中有广泛的应用,比如优先队列、排序算法(如...

    heapdump-tool工具

    Heapdump-tool工具是专为Java开发者设计的,用于生成和分析堆转储(Heap Dump)文件的强大工具。堆转储文件记录了Java虚拟机(JVM)在某一时刻的内存状态,包括对象、类、垃圾收集器信息等,这对于诊断内存泄漏、...

    weblogic优化指南.pdf

    垃圾收集(GC)是指JVM释放Java堆中不再使用的对象所占用...为了获取理想的Heap堆大小,需要使用-verbosegc参数(Sun jdk: -Xloggc:)以打开详细的GC输出。分析GC的频度和时间,结合应用最大负载所需内存情况,得出堆的大小。

    IBM的HeapAnalyzer

    它能帮助开发者深入理解Java虚拟机(JVM)的堆内存状态,通过分析heap dump文件,找出那些占用内存过大的对象,以及这些对象的引用路径,从而定位可能导致问题的代码。 Heap dump是在JVM运行时捕获的一份内存快照,...

    c语言stack(栈)和heap(堆)的使用详解

    2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块...

    heapdump分析工具

    当遇到应用程序运行缓慢,频繁出现Full GC,甚至出现OutOfMemoryError等问题时,我们通常需要对堆内存进行深入分析,这就是heapdump工具的作用所在。heapdump工具可以帮助开发者诊断Java应用的内存泄漏、过度对象...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    ibm-java-堆内存分析工具-heapanalyzer

    IBM Java堆内存分析工具——HeapAnalyzer,是一款专为IBM J9 VM设计的强大内存分析工具,它可以帮助开发者深入理解Java应用程序的内存使用情况,检测并解决内存泄漏问题,从而提升应用性能。本文将详细介绍Heap...

    android项目内存泄露排查实用.pdf

    Dalvik VM 负责管理堆内存,与应用产生的垃圾对象的 GC,所以 DDMS 上只能看到 Dalvik 虚拟机使用的 heap 堆内存,看不到虚拟机宿主的 Linux 进程所使用的 native 堆的情况。Native 所用的空间由 Linux 统一管理,...

    斐波那契堆(Fibonacci Heap)

    斐波那契堆(Fibonacci Heap)是一种高级的数据结构,主要用于解决图的最短路径问题、优先队列等需要高效插入、删除和查找最小元素的操作。它由计算机科学家Michael L. Fredman和Robert E. Tarjan在1984年提出,其...

    java堆heapdump分析工具Heap Analzer V4

    15年7月最新版的工具Heap Analzer V4。 分析java内存堆快照的利器,拥有直觉性的判断溢出对象是什么,一目了然。支持上下左右键,免去鼠标点击的痛苦。 对象显示也比较详细,数量,大小都包含,支持对象树的复制。

    c语言实现 小根堆heap

    小根堆(Minimum Heap)是一种特殊的树形数据结构,它满足堆的性质:每个节点的值都小于或等于其子节点的值。在C语言中实现小根堆,主要是为了支持一些高效的操作,如插入元素、删除最小元素(pop操作)以及对整个堆...

    ibm的heap analyzer.zip

    标签"IBMheapanalyze"是对工具功能的简短概括,表明这是与IBM相关的内存分析工具,主要功能是分析heap(堆内存)。 在压缩包内的文件"ibm的heap analyzer"可能是该工具的主程序或者启动脚本,用户运行这个文件就...

    大堆的应用,MAXheap,删除与插入

    标题中的“大堆的应用,MAXheap,删除与插入”指的是在计算机科学中处理大量数据时常用的优先队列数据结构——最大堆(Max Heap)。最大堆是一种完全二叉树,其中每个父节点的值都大于或等于其子节点的值,确保了堆...

    解决Java_heap_space问题

    2. **最大堆大小限制**:如果应用程序的内存需求超过JVM的最大堆大小设置,也会导致heap space问题。 3. **内存泄漏**:程序中存在未被及时回收的不再使用的对象,长期占用内存资源,最终导致可用堆内存耗尽。 ####...

    IBM HeapAnalyzer.docx

    通过使用 IBM HeapAnalyzer,开发者可以快速地分析 Java 堆转储,检测可能的 Java 堆泄漏,并找到泄漏嫌疑人的位置。 IBM HeapAnalyzer 提供了多种功能,包括: * 查看内存溢出的占比和大小 * 明确显示代码内存...

Global site tag (gtag.js) - Google Analytics