美文网首页LeetCode
堆的基础知识

堆的基础知识

作者: 徐凯_xp | 来源:发表于2018-03-09 12:50 被阅读7次

二叉堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆。最大堆,树种各个父 节点的值总是大于或等于任何一个子节点的值;最小堆,树种各个父节点的值总是小于或 等于任何一个子节点的值。我们一般使用二叉堆来实现优先级队列,它的内部调整算法复杂 度为log(N),标准STL的优先级队列包括如下5种操作,设堆H:
1.取出堆顶元素:H.top();
2.判断堆是否为空:H.empty();
3.将元素x添加至堆:H.push(x)
4.弹出堆顶:H.pop();
5.求堆存储元素的个数:H.size()

#include<stdio.h>
#include<queue>
int main(){
    std::priority queue<int> big_heap;//默认构造最大堆
    std::priority queue<int,std::vector<int>,std::greater<int>> small_heap;//最小堆构造方法
    std::priority queue<int,std::vector<int>,std::less<int>> big_heap2;//最大堆构造方法
    if(big_heap.empty()){
        printf("big_heap is empty\n");
    }
    int test[] = {6,10,1,7,99,4,33};
    for(int i = 0;i<7;i++){
        big_heap.push(test[i]);
    }
    printf('"big_heap.top = %d\n",big_heap.top());
    big_heap.push(1000);
    printf("big_heap.top = %d\n",big_heap.top());
    for(int i = 0;i<3;i++){
        big_heap.pop();
    }
    printf("big_heap.top = %d\n",big_heap.top());
    printf("big_heap.size = %d\n",big_heap.size());
}

数组中第K大的数

LeetCode 215. Kth Largest Element in an Array
已知一个未排序数组,求这个数组中第K大的数字。思考如何使用堆(优先级队列)解决这个问题。
如,array = [3,2,1,5,6,4] , k = 2,return 5

算法设计

维护一个K大小最小堆,将数组中的元素按顺序push进入堆,push时进行如下操作,堆顶就是第K大的数。堆中存储的元素是前K大的数
堆中元素个数小于K时,新元素直接进入堆;否则,当堆顶小于新元素时,弹出堆顶,将新元 素加入堆。

解释:

由于堆是最小堆,堆顶是堆中最小元素,新元素都会保证比堆顶小(否则新元素替换堆顶),故堆中K个元素是已扫描的元素里最大的K个;堆顶即为第K大的数。

eg array = [3,2,1,5,6,4],K = 2 :

#include<vector>
#include<queue>
class Solution{
public:
    int findKthLargest(std::vector<int> &nums,int k){//最小堆
    std::priority queue<int, std::vector<int>,std::greater<int>>Q;
    for(int i = 0;i<nums.size();i++){
        if(Q.size()<k){//遍历nums数组
            Q.push(noms[i]);//如果堆中元素个数小于k,直接push进入堆
        }
        else if(Q.top() < nums[i] ){//如果堆顶比新元素小,弹出堆顶,push进新元素(替换堆顶)
            Q.pop();
            Q.push(nums[i]);
            
        }
    }
    return Q.top();
}
};
测试与leetcode提交
int main(){
    std::vector<int> nums;
    nums.push_back(3);
    nums.push_back(2);
    nums.push_back(1);
    nums.push_back(5);
    nums.push_back(6);
    nums.push_back(4);
    Solution solve;
    printf("%d\n",solve.findKthLargest(nums,2));
    return 0;
}

相关文章

  • 堆的基础知识

    二叉堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆。最大堆,树种各个父 节点的值总是大于或等于任何一个子节点...

  • 理解Linux堆内存管理

    一、堆的基础知识 1.1 堆的内存布局 1.2 堆和栈的区别 栈主要用来维护函数调用的上下文,由高向低增长; 堆用...

  • 最基本的堆溢出-fastbin

    堆 pwn 基础知识 内存上的空间会被划分为若干个chunk chunk包括以下两种: 已分配的堆块: 未分配的堆...

  • 面试知识点总结

    Java基础知识 1、堆,栈,方法区 堆:JAVA堆在虚拟机启动时创建,用来存放由new创建的对象实例和数组。Ja...

  • Java架构—JVM调优

    1. JVM Tuning基础知识 1.1 Java堆结构 Java堆可以处于物理上不连续的内存空间上,只要逻辑上...

  • 堆和堆排序

    1. 堆的基础知识 1.1 什么是堆 堆是一种特殊的二叉树,它需要满足如下两个条件 堆是一颗完全二叉树 堆中每个节...

  • 数据结构-树-堆-堆排序

    在了解过堆的基础知识之后,我们看下堆排序堆排序是指将给定的一串数据通过建堆之后再排序输出的过程。可以大致分为建堆和...

  • b00ks writeup

    混子pwn手,最近在看堆的知识点,刚看完CTF-WiKi上的堆的基础知识,开始学习offbyone的利用先介绍一下...

  • 排序 - 堆排序

    文章转自这里传送门,写的太棒了,值得学习和推广 1.基础知识 堆排序,就是以堆的形式去排序。关于堆 则需要先了解 ...

  • 堆的一些基础知识一

    堆几种常见的数据结构 _heap_info malloc_state malloc_chunk _heap_inf...

网友评论

    本文标题:堆的基础知识

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