`
Kingson_Wu
  • 浏览: 123695 次
文章分类
社区版块
存档分类
最新评论

Top K问题(求前k个最大的数)

 
阅读更多

最近在笔试的时候经常会遇到求前k个最大的数的算法,查阅了一些资料,总结如下:

在数据不多的情况下采用快速排序,在海量数据下则采用堆排序。

以下将针对这两种方法给出详细的实现代码,希望能帮到大家,顺便替自己复习一下,如果发现有错的,欢迎指正。


一、快速实现前k个最大数据的排序,总数据为n个


1、以下的partition函数对线性表从low到high进行一趟快速排序


int partition(SqList &L,int low,int high){
//交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大(小)于它。
 temp=L.r[low];//记录子表的第一个记录作枢轴记录
int pivotkey=L.r[low].key;//枢轴记录关键字
while(low<high){//从表的两端交替地向中间扫描
       while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low]=L.r[high];
      while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high]=L.r[low];
}
L.r[low]=temp;//枢轴记录到位
//只有在一趟排序结束时,即low=high的位置才是枢轴记录的最后位置
return low;//返回枢轴位置
}

2、以下的QSort函数对从low到high进行快速排序


void QSort(SqList &L,int low,int high){
//对顺序表L中的子序列L.r[low..high]作快速排序
if(low<high){
pivotloc =partition(L,low,high);
Qsort(L,low,pivotloc-1);
Qsort(L,pivotloc+1,high);
}
}

3、KSort对线性表的前k个最大数进行排序

void KSort(SqList &L,int low,int high,int k){

int pi=partition(L,low,high);

while(pi>=k+1)
pi=partition(L,low,pi-1);
//找出小于k的分界点,对低值表进行快排,对高值表继续递归
if(pi==k)
QSort(L,low,k-1);
if(pi==k+1)
Qsort(L,low,k);
else{
QSort(L,low,pi-1);
KSort(L,pi+1,high,k);
}
}

4、对线性表前k个的则表示为

KSort(L,0,n,k);


二、堆排序实现前k个最大数据的排序,总数据为n个


堆排序其实就是对一个最大(小)堆”反复筛选“的过程

大顶堆排序后变成从小到大


1、以下HeapAdjust函数实现筛选算法


typedef SqList HeapType;//采用顺序表存储堆

void HeapAdjust(HeapType &H,int s,int m){
//已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义(即堆出元素之后的状况)

temp=H.r[s];
for(int j=2*s; j<=m;j*=2){//沿key较大的孩子结点向下筛选
if(j<m&&H.r[j].key<H.r[j+1].key) ++j;//j为较大 的孩子结点下标
if(temp>=H.r[j].key) break;//不变
//否则
H.r[s]=H.r[j]; s=j;
}
H.r[s]=temp;//插入
}


2、HeapSort函数实现堆排序算法


void HeapSort(HeapType &H){

for(int i=H.length/2;i>0;--i)
HeapAdjust(H,i,H.length);//把H.r[1..H.length]建成大顶堆,从非终端结点开始

for(int i=H.length;i>1;--i)
H.r[1]<——>H.r[i];//将堆顶元素和当前未经排序子序列H[1..i]中最后一个记录相互交换

HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆
}
}


3、堆排序算法实现前k个最大的数

void KHeapSort(HeapType &H){

for(int i=H.length/2;i>0;--i)
HeapAdjust(H,i,H.length);//把H.r[1..H.length]建成大顶堆,从非终端结点开始

for(int i=H.length;i>H.length-k;--i)
H.r[1]<——>H.r[i];//将堆顶元素和当前未经排序子序列H[1..i]中最后一个记录相互交换

HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆
}
}


该线性表的最后k个数即为最大的k个数



分享到:
评论

相关推荐

    典型的Top K算法 找出一个数组里面前K个最大数.doc

    Top K算法是解决一个经典的问题,即在一个大规模的数组中找到前K个最大数的问题。在这个问题中,我们需要在一个数组中找到前K个最大数,例如在搜索引擎中,需要找出最热门的10个查询串。下面我们将详细地介绍Top K...

    topK 问题的5种解决方案

    在计算机科学与数据处理领域中,TopK 问题是一种常见的需求场景,其核心任务是从一个数组或列表中找到最大的 K 个元素。这类问题广泛应用于各种场合,比如搜索引擎返回最相关的 K 条搜索结果、推荐系统提供最热门的 ...

    C语言TOP-K问题(从一堆数据中找出最大的k个数或者最小的k个数)

    通过这样的方式,我们可以有效地解决C语言中的TOP-K问题,即使在大量数据中也能高效地找出最大的k个数或最小的k个数。在压缩包中的"Heap"文件中,可能包含了具体的代码实现和其他相关示例,进一步详细展示了如何在...

    top k 算法

    Top K 算法是一种在大数据集或者无序数据中寻找前K个最大或最小元素的高效算法。在数据分析、机器学习和搜索引擎优化等领域,这种算法有着广泛的应用。本篇文章主要探讨的是利用二分法实现Top K算法。 **一、二分法...

    基于二分查找的有序表在做topK算法的给力实现

    TopK算法的主要目标是从大量数据中找出前K个最大的(或最小的)元素。这里的“给力实现”可能意味着这种方法在性能和效率上有显著优势。 **描述分析:** 描述简洁地重申了标题中的主题,表明我们将专注于如何使用...

    java一亿数字取前100个(3秒钟获取)

    每读取一个数字,只需与TopK队列中的最大元素比较,如果小于该元素则替换之,始终保持队列大小不超过100。 通过以上策略,可以实现3秒内从一亿个数字中找出前100个最小值的目标。`Top100.java`这个文件很可能是实现...

    Finding Top-k Shortest Simple Paths with Diversity.pptx

    在计算机科学和信息技术领域中,寻找 Top-k 最短简单路径问题是一个经典的问题。该问题的应用非常广泛,例如在路线规划、交通导航、物流等领域都有重要的实践价值。本文档介绍了寻找 Top-k 最短简单路径问题的解决...

    数据结构:堆排序(升序排序建大堆),TOP-K问题

    而TOP-K问题通过堆实现,可以在O(k log k)的时间内找出前K个最大值,相比全排序整个数据集,大大提高了效率。 总的来说,掌握堆排序和如何解决TOP-K问题对于理解和优化算法性能至关重要。这两个概念不仅在理论上有...

    TOP,K算法.pdf

    文档通过之前的寻找最小k个数的问题作为铺垫,探讨了Top K算法的实现,特别是寻找最大k个数的情况。文章强调,虽然寻找最大k个数和最小k个数在原理上相似,但Top K算法在搜索引擎和大数据处理等领域有更广泛的应用。...

    topk_K._python_

    在一个非降序排列的数组中,最大的数是第1大的数,次之是第2大的数,依此类推。因此,第k大的数就是数组中排名k的元素,k通常小于等于数组的长度。 `topk.py` 文件很可能包含了实现这一功能的Python代码。它可能...

    TOP,K算法.docx

    它主要用于找出一个列表或数组中的前K个最大(或最小)的元素。在面试中,这是一个经常被问到的算法问题,因为它涉及到排序、搜索和优化等核心编程概念。 在上述文档中,提到了三种不同的Top K算法实现: 1. **...

    一亿取100数字Top100

    标题中的“一亿取100数字Top100”是指在给定的一亿个数字中,找出出现频率最高的前100个数字。这个任务是数据处理和算法优化的一个典型场景,通常涉及到大规模数据的排序和统计。下面将详细讨论相关知识点。 首先,...

    PHP利用二叉堆实现TopK-算法的方法详解

    在处理海量数据时,我们经常会遇到需要从大量数据中快速找出最大或最小的Top K个数的问题。这类问题在数据挖掘、搜索引擎以及各种推荐系统中非常常见。传统的排序方法在数据量较小的时候是可行的,但在数据量达到亿...

    python 的topk算法实例

    Python中的TopK算法是一种在数据集中查找最大或最小K个元素的高效算法。在这个实例中,我们看到一个基于快速选择(Quick Select)的TopK实现,这是一个简化版的快速排序算法,专门用于寻找数组中的第K小(或大)的...

    Finding Top-k Min-Cost Connected Trees in Databases2007

    标题 "Finding Top-k Min-Cost Connected Trees in Databases 2007" 指出了这篇论文的核心研究问题,即在数据库中寻找最小成本的前k个连通树。从标题可以推导出以下几点: 1. **数据库**:数据库技术是现代信息系统...

    top-K-code.zip

    求第k大的数 c++实现

    基于数11据流的Top-K频繁闭项集挖掘算法研究.docx

    。。基于数11据流的Top-K频繁闭项集挖掘算法研究.docx

Global site tag (gtag.js) - Google Analytics