当前位置 博文首页 > L_add的博客:TOP-K问题

    L_add的博客:TOP-K问题

    作者:[db:作者] 时间:2021-08-27 10:01

    TOP-K在题中的应用
    题目描述:(题目来源:力扣)
    在这里插入图片描述
    思路1:排序0(N*logN)

    int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize){
        HP hp;
        HeapInit(&hp,arr,arrsize);
        int* retarr = (int*)malloc(sizeof(int)*k);
        for(int i = 0;i < k;i++)
        {
            retarr[i] = HeapTop(&hp);
            HeapPop(&hp);
        }
        HeapDestory(&hp);
        *returnSize = k;
        return retarr;
    }
    int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize)
    

    要求再提高效率
    思路二(TOP-K):
    把N个数建成小堆,选一个删一个,不断选出前K个最小的
    **时间复杂度:O(N+O(logN*K)) **
    空间复杂度 O(N)
    在这里插入图片描述

    int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize)
    {
        if(k == 0)
        {
            *returnSize = 0;
            return NULL;
        }
        int* arrRet = (int*)malloc(sizeof(int)*k);
        //前K个数建立大堆
        for(int i = 0;i < k;i++)
        {
            arrRet[i] = arr[i];
        }
        for(int j = (k-1-1)/2;j >= 0;j--)
        {
            AdjusDown(arrRet,k,j);
        }
        //剩下的N-K个数,比堆顶小,就替换堆顶数,进堆
        for(int i = k;i< arrSize;i++)
        {
            if(arr[i] < arrRet[0])
            {
                arrRet[0] = arr[i];
                AdjusDown(arrRet,k,0);
            }
        }
        *returnSize = k;
        return arrRet;
    }
    

    衍生问题:假设N是100亿,K是100
    100亿个整数需要多少空间?

    1KB = 1024byte
    1MB = 1024KB
    1GB = 1024MB
    1GB = 2^30
    大概40GB左右
    (注:代码中的函数在另一篇文章中实现:建堆)

    cs
    下一篇:没有了