大小顶锥动态求解中位数以及如何动态求解TopK

本文探讨如何在动态更新的有序数组中快速求解中位数,通过大小顶堆实现。首先,利用大顶堆和小顶堆分别存储数组中较大的一半和较小的一半元素,以确保小顶堆的堆顶为中位数。接着,讨论了如何动态求解排名前K的元素,如百度文章搜索量的实时Top10,同样利用顶堆结构,以降低时间复杂度。通过代码示例展示大顶堆和小顶堆的实现,并给出添加元素后的中位数变化情况。
摘要由CSDN通过智能技术生成

问题一:一个有序数组(从大到小) 长度为13  中位数为 18 

int arr[] = new int[]{1, 3, 5, 6, 11, 14, 18, 21, 27, 29, 31, 56, 59}

但是我们这个数组是动态的,每次都插入一个数据,这样没插入依次中位数就要破环,而且还要每次排序,这样会很慢。

我们思路是这样维护一个大小,顶堆。 大顶堆存放0-5 元素,小顶堆 存放 6到12 ,这样小顶堆的堆顶就是中位数。

 

为题二:如何求解一个动态数组中,取出排名前k的数据;举一个现实问题,百度文章搜索量如何求动态求排名前10位的文章(文中的搜索量是不断变化的,你买次都遍历求topK是非常耗时间的)

大顶堆:堆顶元素是整个集合中最大的元素,同理 小顶堆是整个集合最小的元素。

这里 我们采用数组形式实现顶锥(另一种实现方式是链表形式)

大顶堆代码:

package com.jxd.test;

public class BigHeap {

    private int heapCont[];

    /**
     * 堆中能存储的最大数据个数
     */
    private int tab;

    /**
     * 堆中已经存在数据的个数
     */
    private int count;

    public BigHeap(int capacity) {
        heapCont = new int[capacity + 1];//因为0号位没法使用
        tab = capacity;
        count = 0;
    }

    /**
     * n表示原数组中有数据个数
     *
     * @param heapCont
     * @param n
     */
    public BigHeap(int[] heapCont, int n) {
        this.heapCont = heapCont;
        tab = heapCont.length;
        count = n;
        blindHeap(count);
    }

    /**
     * 向堆中插入数据
     * 从下往上法
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值