堆算法

作者: 霹雳解锋镝 | 来源:发表于2020-03-15 17:48 被阅读0次
堆总是满足下列性质:
    1、堆中某个节点的值总是不大于或不小于其父节点的值;
    2、堆总是一棵完全二叉树。
应用:堆排序可以实现时间复杂度为nlogn
堆的基本操作
    上浮 shift_up;
    下沉 shift_down
    插入 push
    弹出 pop
    取顶 top
    堆排序 heap_sort

应用实例
PriorityQueue:优先队列,具备了小根堆的性质

public static int maxPerformance(int n, int[] speed, int[] efficiency, int k) {
    // 构建二维数数组并按照效率降序排序
    int[][] arr = new int[n][2];
    for (int i = 0; i < n; i++) {
        arr[i][0] = speed[i];
        arr[i][1] = efficiency[i];
    }
    // 按效率降排序
    Arrays.sort(arr, (a, b) -> b[1] - a[1]);
    // 小根堆
    PriorityQueue<Integer> priorityQueue = new PriorityQueue();
    long sum = 0;
    long res = 0;
    // 计算效率
    for (int i = 0; i < n; i++) {
        priorityQueue.add(arr[i][0]);
        sum += arr[i][0];
        // 当堆中的数据超过k时,将最小的移除
        if (priorityQueue.size() > k) {
            sum -= priorityQueue.poll();
        }
        res = Math.max(res, sum * arr[i][1]);
    }
    System.out.println("res:" + res);
    return (int)(res % ((int)1e9 + 7));
}

相关文章

  • 堆算法

    示例代码 结果

  • 堆算法

  • 算法之堆算法

    堆的定义如下:n个元素的序列{k0,k1,...,ki,…,k(n-1)}当且仅当满足下关系时,称之为堆。" ki...

  • 堆相关算法

    转发 C 堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。...

  • 堆调整算法

    堆调整算法 思路 算法将获取到一组数据的最大值(针对大顶堆)或最小值(针对小顶堆)。 基本思想 通过堆排序的调整算...

  • heapq : 堆队列算法

    heapq : 堆队列算法 Source code: Lib/heapq.py 介绍 这个模块提供了堆队列算法的实...

  • Linux内存管理---伙伴堆算法(1)

    什么是伙伴堆算法 伙伴堆算法(也叫伙伴系统,buddy system)是Linux系统中的一种动态的内存管理算法 ...

  • [underscore 源码学习] 乱序数组 - 洗牌算法

    洗牌算法 算法思路在宏观上可以概括为:将集合视为牌堆,不停地从牌堆中抽牌构成新的牌堆,直至新牌堆的牌数到达预设数量...

  • 算法系列--堆

    0.引言 堆是一种比较常见的数据结构,堆排序也是面试时会经常遇到的问题,今天就分析一下堆。 1.堆结构 堆是一种类...

  • 拙劣算法:堆建立

    说明 某一个节点i父节点,子节点公式:父节点=(i -1)/2左子节点=2i+1右子节点=2i+1 heapify...

网友评论

      本文标题:堆算法

      本文链接:https://www.haomeiwen.com/subject/desuehtx.html