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

昆明高端网站建设腾讯企业qq官网

昆明高端网站建设,腾讯企业qq官网,政务门户网站建设的意义,北京网站建设 公司目录 一.堆排序 二.topk问题 一.堆排序 我们知道冒泡算法的时间复杂度是O(N^2),在数据量很多的时候,N^2是个很可怕的数字,二分算法的时间复杂度是O(logn),但是二分算法有限制条件,实用性并不高…

目录

一.堆排序

二.topk问题


一.堆排序

我们知道冒泡算法的时间复杂度是O(N^2),在数据量很多的时候,N^2是个很可怕的数字,二分算法的时间复杂度是O(logn),但是二分算法有限制条件,实用性并不高,那怎样才能高效实用的排序呢?

堆排序就能很好解决上述问题,堆排序的时间复杂度是O(logn),也没啥限制条件,可以实现高效排序。

这里要注意,排升序要建大堆,排降序要建小堆;

1.假设排升序,所以建大堆;

2.堆建好后,定义一个 end 变量,令其 =n-1(数组最后一个元素的下标是n-1)

3.堆建好后,数组第一个元素就是最大的,将其与最后一个数据交换,然后这个数据就不需要动了,为了保持它是个大堆,让它的前 end-1 个元素向下调整,然后end--,当 end<=0 时就结束循环。

 

堆排序不需要手搓个堆,只需要用到向下调整这个函数,所以使用堆排序时,只需写个向下调整就行了。

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustDown(int* arr, int parent, int n)
{assert(arr);int child = 2 * parent + 1;while (child < n){if ((child + 1) < n&& arr[child + 1] > arr[child]){child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}elsebreak;}
}
void Heapsort(int* arr, int n)
{assert(arr);int i = 0;for (i = (n - 2) / 2; i >= 0; i--)   //建堆{AdjustDown(arr, i, n);}int end = n - 1;while (end){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}for (i = 0; i < n; i++){printf("%d  ", arr[i]);}printf("\n");
}

二.topk问题

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

基本思路如下:
1. 用数据集合中前K个元素来建堆,注意:
   前k个最大的元素,则建小堆;
   前k个最小的元素,则建大堆;
2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素;
3.将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。

我们可以从文件中读取数据,这样的实用性更高些;

假设找的是最大的前k个数据,所以建小堆;

具体:

1.创建一个k个元素的数组,模拟建堆,从文件中读取k个数据存入数组中;

2.从文件中取数据与数组的第一个元素比较,也就是堆顶的数据,因为是小堆,如果该数据比堆顶数据大,则将值赋给堆顶,成为新的堆顶,不用担心会出什么问题,因为是小堆,所以那些大的数据会往下沉,如果不大于堆顶的数据,则继续从文件中取数据出来比较;

3.当读取文件结束时就结束循环

如果对文件操作不太熟悉的话,可参考->文件的基础操作

如要想检验你写的代码是否能解决topk问题时,可以在数据创建完成后,手动修改文件中的k个数据,如果是找最大的k个数据,那么只需要修改k个数据,且每个都大于原来文件的最大值,这样在测试代码时,输出的就是你修改的k个数据。

void Createdata(const char file,int n)   //创建数据
{int i = 0;int x = 0;FILE* fin = fopen("file", "w");  //打开文件if (fin == NULL){perror("fopen fail");exit(-1);}for (i = 0; i < n; i++){x = rand() % 100 + 1;   //利用随机数生成函数,创建k个范围在1~100之间的数据fprintf(fin, "%d\n", x);  //将数据写入文件中}fclose(fin);  //关闭文件fin = NULL;
}void topk(const char file, int k)
{FILE* fout = fopen("file", "r");if (fout == NULL){perror("fopen fail");exit(-1);}HPdatatype* arr = (HPdatatype*)malloc(sizeof(HPdatatype) * k);if (arr == NULL){perror("malloc fail");exit(-1);}int i = 0;for (i = 0; i < k; i++){fscanf(fout, "%d", &arr[i]);  //从文件中写入k个数据到数组中,模拟堆的创建}int val = 0, ret = 0;ret = fscanf(fout, "%d", &val);   //从文件中取数据while (ret != EOF){if (val > arr[0])  //将取出的数据与堆顶数据比较,若大于,则其成为新的堆顶{arr[0] = val;AdjustDown(arr, 0, k);   //向下调整,保持小堆或是大堆}ret = fscanf(fout, "%d", &val);  //从文件中取数据}free(arr);fclose(fout);arr = NULL;fout = NULL;}int main()
{srand((unsigned int)time(NULL));const char file = "data.txt";int n = 1000;int k = 10;//Createdata(file,n);topk(file, k);return 0;
}

🐬🤖本篇文章到此就结束了,若有错我或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼

 

http://www.lbrq.cn/news/2498221.html

相关文章:

  • 哈尔滨网站提升排名seo技术交流论坛
  • 做网站之类的毕业论文海外广告优化师
  • 如何做展示型网站百度公司
  • 自建网站营销今日十大头条新闻
  • 房地产网站广告销售怎么做怎样弄一个自己的平台
  • 做模板网站怎么放视频深圳网络优化seo
  • 网站换dns网络营销策划方案怎么做
  • 郑州移动网站建设交易平台官网
  • 关于做情侣的网站的图片电脑培训班速成班
  • 郑州做网站排名公司哪家好网站推广的方式有哪些?
  • 类似源码之家的网站长沙seo行者seo09
  • 旧域名新网站品牌策划方案范文
  • 网站建站视频教程国际新闻稿件
  • 新开传奇网站首区律师推广网站排名
  • 18.ppt网站是谁做的关键词排名查询网站
  • 网站开发教学视频教程提升神马关键词排名报价
  • 网站空间购买注意事项seo三人行网站
  • 网站搭建是哪个岗位做的事儿网络营销的职能有哪些
  • 宁波网站制作一句话宣传自己的产品
  • 建设网站主机免费的怎么下载精准营销及推广
  • 怎么做国外的网站企业营销培训课程
  • axure直接做网站万物识别扫一扫
  • 刷单平台网站建设长春网站建设方案报价
  • 山东嘉邦家居用品公司网站 加盟做经销商多少钱 有人做过吗信息流广告代理商排名
  • asp网站 会员注册口碑营销的案例及分析
  • 用vs2010做免费网站模板下载个人推广网站
  • 网站开发技术 包括市场调研数据网站
  • 域名可以做网站网络建站流程
  • 中企动力官网电话优化关键词规则
  • 建设部网站有建筑施工分包sem与seo的区别
  • Linux应用程序架构与软件包管理
  • 微信小程序——早餐小程序
  • 知识图谱的初步探索
  • 嵌入式硬件篇---有线串口通信问题
  • Redis 缓存机制详解:原理、问题与最佳实践
  • 主要分布在腹侧海马体(vHPC)CA1区域(vCA1)的混合调谐细胞(mixed-tuning cells)对NLP中的深层语义分析的积极影响和启示