美文网首页
堆的更新/top K问题

堆的更新/top K问题

作者: 盼旺 | 来源:发表于2019-10-08 16:45 被阅读0次

在面老虎集团的时候被问到:已知昨天100万股票的前10名,今天股票更新了,我想知道今天的前10名,当时一脸懵逼。甚至不知道他想让我用堆来处理!

算法描述:

我们首先取10万个元素中的前10个元素来建立由10个元素组成的最小堆。这样堆顶元素便是当前已知元素的第10大的数;然后依次读取剩下的99990个元素,若读取的元素比堆顶元素大,则将堆顶元素和当前元素替换,并自堆顶向下调整堆;这样读取完所有元素后,堆中的10个元素即为这10万个数最大的10个数,同时堆顶元素为这10万个元素第10大元素。再对这10个元素排序就是前10名。
时间复杂度:
设从N个数中找M个最大数
每次重新恢复堆的时间复杂都为O(logM),最多供进行了(N-M)次恢复堆操作,顾时间复杂度为O(NlogM)

从第i个点向下调整堆的过程

//  从i节点开始向下调整,n为节点总数,从i开始计算 i节点的子节点为 2*i+1, 2*i+2
public static void MinHeapDown(int a[], int i, int n)
{
    int j, temp;
    temp = a[i];
    j = 2 * i + 1;
    while (j < n)
    {
        if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的
            j++;

        if (a[j] >= temp)//最小的都大于父节点,说明父节点最小了
            break;

        a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点
        i = j;
        j = 2 * i + 1;
    }
    a[i] = temp;
}

建立最小堆的过程

从最后一个非叶节点开始,依次进行向下调整操作,保证当前节点的所有子节点是满足最小堆的,然后一直到根节点,保证这个堆是满足小顶堆的

//建立最小堆
public static void MakeMinHeap(int a[], int n)
{
    for (int i = n / 2 - 1; i >= 0; i--)
        MinHeapDown(a, i, n);
}

替换堆顶元素

当来一个新数,需要替换堆顶元素时,替换堆顶元素,然后,从堆顶元素向下进行一次调整,即可使新堆重新满足小顶堆

//如果当前值key>堆顶元素,则才进行替换操作,然后进行向下调整
public static void MinHeapReplaceHeader(int a[], int n,int key)
{
        a[0] = key;
        MinHeapDown(a, 0, n);
}

重新排列这10个数据

public static void MinHeapDeleteNumber(int a[], int n)
{  
for(int i=n-1;i>=0;i--){
    //每次输出一个最小值后的调整过程
    int temp = a[0];
    a[0] = a[i];
    a[i] = temp;
    MinHeapDown(a, 0, i);
}
    //进行遍历,输出最终k个值的过程
     System.out.println(Arrays.toString(Arrays.copyOfRange(a,0,10)));
}

主函数

public static void main(String[] args) {
    int arr[] = {7, 3, 845, 545, 145, 2,10,48,65,2,0,51,5,8,2,6,4,2,4,5,1,7,554,156,156,15,123,132,0,23,31,56};
    MakeMinHeap(arr,10);
    for(int i=10;i<arr.length;i++){
        if(arr[i]>arr[0])
        MinHeapReplaceHeader(arr,10,arr[i]);
    }
    MinHeapDeleteNumber(arr,10);
    //[845, 554, 545, 156, 156, 145, 132, 123, 65, 56]
}

相关文章

  • 堆的更新/top K问题

    在面老虎集团的时候被问到:已知昨天100万股票的前10名,今天股票更新了,我想知道今天的前10名,当时一脸懵逼。甚...

  • 《恋上数据结构与算法一》笔记(十六)堆

    目录 问题思考 Top K问题 堆(Heap) 堆的基本接口设计 二叉堆(Binary Heap) 获取最大值 最...

  • 堆--Top K

    求数组中前k大的数据思路:维护一个数据大小为k的小顶堆,循环遍历数组,如果比堆顶元素大,我们就把堆顶元素删除,并且...

  • Python一天一模块: heapq 堆列队方法

    heapq是一个内建模块, 实现了一个堆的数据结构,完美的解决了Top-K问题,以后解决Top-K问题的时候,直接...

  • 2018-05-17

    学习DHT时候的问题 1.peers和nodeid的区别。 2.top k问题用堆解决,查询复杂度为O(k + (...

  • TopK问题的思考

    1、问题 什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这是一...

  • 算法必学:经典的 Top K 问题

    什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这个问题也是十分...

  • 算法必学:经典的 Top K 问题

    什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这个问题也是十分...

  • TOP-K 堆实现

    题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是...

  • top K问题

    问题:海量数据处理 - 10亿个数中找出最大的10000个数。解决方案:先拿10000个数建堆,然后一次添加剩余元...

网友评论

      本文标题:堆的更新/top K问题

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