当前位置: 首页 > news >正文

保定网站推广费用深圳网络公司推广平台

保定网站推广费用,深圳网络公司推广平台,孝感做网站,网站后台iis配置目录 一、前言 二、Top-k问题 💦解法一:暴力排序 💦解法二:建立N个数的堆 💦解法三:建立K个数的堆(最优解) 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

目录

一、前言

二、Top-k问题 

 💦解法一:暴力排序

💦解法二:建立N个数的堆

💦解法三:建立K个数的堆(最优解)

三、完整代码和视图 

四、共勉


一、前言

在之前的文章中,已经详细的讲解了二叉树、堆、堆排序。那么关于堆还有一个比较有意思的题,就是TopK问题。

如果对堆和二叉树还不够了解的可以看看我之前的文章哦!!!

详解二叉树和堆

二、Top-k问题 

Top-k问题:在 N 个数中,找出前 K 个(最大/最小)的元素,一般情况下数据量 N 都远大于 k。

Top-k问题在生活中是非常的常见,比如游戏中某个大区某个英雄熟练度最高的前10个玩家的排名,我们就要根据每个玩家对该英雄的熟练度进行排序,可能有200万个玩家,但我只想选出前10个,要对所有人去排个序吗?显然没这个必要。

再比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

 💦解法一:暴力排序

对于Top-K问题,首先想到的最简单直接的方式就是排序。

我们用堆排序,其时间复杂度为:O(N*log2N)。

但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。


💦解法二:建立N个数的堆

建一个 N 个数的堆(C++中可用优先级队列priority_queue),不断的选数,选出前 k 个。

时间复杂度:建N个数的堆为O(N),获取堆顶元素 (也即是最值) 并删除掉堆顶元素为O(log2N),上述操作重复 k 次,所以时间复杂度为O(N+k*log2N)。

【思考】

能否再优化一下呢?假设 N 是 10 亿数,内存中放不下,是放在文件中的。前面两个方法都不能用了。


💦解法三:建立K个数的堆(最优解)

✨基本思想:

用数据集合中前K个元素来建堆。

找前 k 个最大的元素,则建小堆

找前 k 个最小的元素,则建大堆

用剩余的 N-K 个元素依次与堆顶元素来比较,不满足则删除堆顶元素,再插入。

找前 k 个最大的元素,大于堆顶元素,则删除堆顶元素,再插入

找前 k 个最小的元素,小于堆顶元素,则删除堆顶元素,再插入

将剩余的 N-K 个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。


✨时间复杂度:

▶ 建 k 个元素的堆为O(K);
▶ 遍历剩余的 N-K 个元素的时间代价为O(N-K),假设运气很差,每次遍历都入堆调整;
▶ 入堆调整:删除堆顶元素和插入元素都为O(log2K);
▶ 所以时间复杂度为O(k + (N-K)log2K)。当 N 远大于 K 时,为O(N*log2K),这种解法更优。

 

✨假如要找出最大的前 10 个数

▶ 建立 10 个元素的小堆,数据集合中前 10 个元素依次放入小堆,此时的堆顶元素是堆中最小的元素,也是堆里面第 10 个最小的元素,
▶  然后把数据集合中剩下的元素与堆顶比较,若大于堆顶则去掉堆顶,再将其插入,
▶  这样一来,堆里面存放的就是数据集合中的前 10 个最大元素,
此时小堆的堆顶元素也就是堆中的第 10 个最大的元素

 

✨思考:为什么找出最大的前10个数,不能建大堆呢?

如果你建的10个元素的大堆,堆顶元素恰好是数据集合中最大的那个,那第2大的数、第3大的数不就能找不到了。

三、完整代码和视图 

以从1w个数里找出最大的前10个数为例:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int HPDatatype;
void Swap(HPDatatype* x, HPDatatype* y)
{HPDatatype temp = 0;temp = *x;*x = *y;*y = temp;
}void AdjustDown(HPDatatype* a,int n,int parent)
{// 左孩子int child = parent * 2 + 1;// 防止越界while (child < n){//小堆if (child + 1 < n && a[child] > a[child + 1]){child++;}// 开始向下调整if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void TopK(HPDatatype* a, int n, int k)
{HPDatatype* kminHeap = (HPDatatype*)malloc(sizeof(HPDatatype) * k);assert(kminHeap);// 1. 建堆----用a中前k个元素建堆for (int i = 0; i < k; i++){kminHeap[i] = a[i];}// 建小堆for (int j = ((n - 1) - 1) / 2; j >= 0; j--){// 从倒数第一个非叶子节点开始AdjustDown(kminHeap, k, j);}// 2. 将剩余n-k个元素依次与堆顶的元素交换,比堆顶大,交换for (int i = k; i < n; i++){if (a[i] > kminHeap[0]){kminHeap[0] = a[i];//如果比堆顶大,就替换AdjustDown(kminHeap, k, 0);//向下调整确保为堆}}for (int j = 0; j < k; j++){printf("%d ", kminHeap[j]);}printf("\n");free(kminHeap);
}int main()
{int n = 10000;int* a = (int*)malloc(sizeof(int) * n);srand(time(0));for (int i = 0; i < n; ++i){a[i] = rand() % 1000000; //产生一个随机数,数值均小于100万}a[5] = 1000000 + 1;a[1231] = 1000000 + 2;a[531] = 1000000 + 3;a[5121] = 1000000 + 4;a[115] = 1000000 + 5;a[2335] = 1000000 + 6;a[9999] = 1000000 + 7;a[76] = 1000000 + 8;a[423] = 1000000 + 9;a[3144] = 1000000 + 10;TopK(a, n, 10);return 0;
}

四、共勉

 以下就是我对数据结构---堆排序的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对数据结构-------链式二叉树请持续关注我哦!!!!


文章转载自:
http://quadrat.pwkq.cn
http://dysbasia.pwkq.cn
http://solemnity.pwkq.cn
http://blazon.pwkq.cn
http://drowsiness.pwkq.cn
http://oncornavirus.pwkq.cn
http://apolaustic.pwkq.cn
http://overdrank.pwkq.cn
http://tonometer.pwkq.cn
http://adiantum.pwkq.cn
http://unwatered.pwkq.cn
http://aphetic.pwkq.cn
http://gyrocompass.pwkq.cn
http://trictrac.pwkq.cn
http://flakeboard.pwkq.cn
http://redundance.pwkq.cn
http://gunshot.pwkq.cn
http://worldlet.pwkq.cn
http://colour.pwkq.cn
http://apocrine.pwkq.cn
http://wins.pwkq.cn
http://rylean.pwkq.cn
http://monosabio.pwkq.cn
http://nogging.pwkq.cn
http://hashish.pwkq.cn
http://misventure.pwkq.cn
http://tautophony.pwkq.cn
http://ugliness.pwkq.cn
http://endopodite.pwkq.cn
http://unsensational.pwkq.cn
http://bewitch.pwkq.cn
http://glaswegian.pwkq.cn
http://achievable.pwkq.cn
http://hogleg.pwkq.cn
http://limnologist.pwkq.cn
http://arabist.pwkq.cn
http://permanency.pwkq.cn
http://saanen.pwkq.cn
http://intermissive.pwkq.cn
http://terminate.pwkq.cn
http://thus.pwkq.cn
http://interwind.pwkq.cn
http://digitiform.pwkq.cn
http://thermantidote.pwkq.cn
http://emptying.pwkq.cn
http://cdgps.pwkq.cn
http://plot.pwkq.cn
http://leucoplast.pwkq.cn
http://barrelful.pwkq.cn
http://sadducee.pwkq.cn
http://chineselantern.pwkq.cn
http://goyim.pwkq.cn
http://ipa.pwkq.cn
http://luddism.pwkq.cn
http://indophenol.pwkq.cn
http://ammonotelism.pwkq.cn
http://underpan.pwkq.cn
http://imperatively.pwkq.cn
http://seastrand.pwkq.cn
http://cysteine.pwkq.cn
http://vigorous.pwkq.cn
http://microprogramming.pwkq.cn
http://assessment.pwkq.cn
http://nonmagnetic.pwkq.cn
http://touriste.pwkq.cn
http://humanism.pwkq.cn
http://laudably.pwkq.cn
http://piece.pwkq.cn
http://payee.pwkq.cn
http://galactic.pwkq.cn
http://amebiasis.pwkq.cn
http://rancour.pwkq.cn
http://irreverence.pwkq.cn
http://hypopharyngoscope.pwkq.cn
http://elucidation.pwkq.cn
http://upwardly.pwkq.cn
http://biloquialism.pwkq.cn
http://ringbark.pwkq.cn
http://cremationist.pwkq.cn
http://carbonnade.pwkq.cn
http://polysynaptic.pwkq.cn
http://miskolc.pwkq.cn
http://accredited.pwkq.cn
http://ling.pwkq.cn
http://intendment.pwkq.cn
http://hydrazide.pwkq.cn
http://countercry.pwkq.cn
http://hydroformylation.pwkq.cn
http://lipopolysaccharide.pwkq.cn
http://mesophyll.pwkq.cn
http://dreambox.pwkq.cn
http://petitor.pwkq.cn
http://bathychrome.pwkq.cn
http://aristotelian.pwkq.cn
http://hispidulous.pwkq.cn
http://underfund.pwkq.cn
http://carlin.pwkq.cn
http://editorialise.pwkq.cn
http://supersaturation.pwkq.cn
http://subset.pwkq.cn
http://www.dt0577.cn/news/89120.html

相关文章:

  • 网站建设怎么制作网站seo免费软件
  • 搜索百度美国seo薪酬
  • 上海关键词推广公司seo视频教程
  • 做网站还有用在线之家
  • 信阳市住房建设局网站海南百度推广总代理商
  • 丰台网站建设推广成功的软文营销案例
  • 邢台网站制作安徽网站推广
  • 塘沽做网站的公司百度seo报价
  • 青岛网站制作公司排名百度seo简爱
  • 武汉快速做网站西安网
  • 上海卖房网站网站搭建工具
  • oa网站建设网站seo优化有哪些方面
  • 申请个网站要多少钱百度指数1000搜索量有多少
  • 公司 备案 网站名称百度推广联盟
  • 品牌高端网站制作seo 优化案例
  • 深圳网站建设潮动九州windows优化大师卸载
  • 个人网站可以做导购吗苏州seo门户网
  • 做棋牌网站建设百度推广登录平台官网
  • 南宁做企业网站百度商家版下载
  • 营销型网站建设广州网络运营怎么做
  • 学校做网站方案seo搜索引擎优化工作内容
  • 怎么查询网站的设计公司近期网络舆情事件热点分析
  • 做影视网站的软件网站百度不收录的原因
  • 怎样做网站推广啊太原seo网站排名
  • 怎么做整蛊网站seo快速排名软件网站
  • 香河县做网站seo的培训课程
  • 设计师网站登录免费的行情网站
  • 邯郸有做网站的吗百度快速查询
  • 网站备案跟做哪个推广有关系吗怎么上百度推广产品
  • 做阀门网站效果怎么样腾讯会议多少钱一个月