揭秘Top-K问题:算法探索、性能优化与应用场景深度解析

简介: 揭秘Top-K问题:算法探索、性能优化与应用场景深度解析

一、什么是 TOPK 问题?

Top-K 问题是一类常见的算法问题,其中目的是从一组元素中找到排名前K的元素。具体来说,对于给定的一组数据。

  • Top-K 问题要求找到其中最大(或最小)的K个元素。

二、日常生活中的 TOPK 问题

Top-K 问题要求找到其中最大(或最小)的K个元素,这类问题我们的生活中也经常遇到,例如排名问题?

  • 例如找出排名最高的 5 家店铺,这就要根据销量来算了
  • 淘宝效率最高的5个店铺这些都需要用到 TOPK 问题

2.1 美团店面排行

2.2 软件排行榜

2.3 富豪榜

三、TOPK 问题的实现代码

TOPK问题大家第一时间想到的当让当然就是 排序但排序的消耗太大了,我们只需要找到前 100 名但要把整个数据全部排序好。

  • 而我们刚好学了堆这个是数据结构
  • 每次 堆顶要不就是最大或者最小的

而需要前100名的时候就先把,前100 个数据建。然后再和堆顶进行比较进行向下调整,这样整个数据的前100是不就被排出来了。

3.1 TOK问题的核心思想

🔥 前 TOP 个数据建堆,每次拿堆顶和剩下数据进行比较,进行向下调整。

  • 这样我们建的堆就是 最大或最小的前 TOP个数

📚 代码演示:

void PrintTopK(const char* filename, int k)
{
  // 1. 打开数据文件建堆--用a中前k个元素建堆
  FILE* fout = fopen(filename, "r");
  if (fout == NULL)
  {
    perror("fopen fail");
    return;
  }
  //开辟堆空间
  int* minheap = (int*)malloc(sizeof(int) * k);
  if (minheap == NULL)
  {
    perror("malloc fail");
    return;
  }
  //录入数据
  for (int i = 0; i < k; i++)
  {
    fscanf(fout, "%d", &minheap[i]);
  }
  //建堆
  for (int i = (k - 2) / 2; i >= 0; --i)
  {
    adjustdown(minheap, k, i);
  }
  // 2. 将剩余n-k个元素依次与堆顶元素交换,不满则则替换
  int x = 0;
  while (fscanf(fout, "%d", &x) != EOF)
  {
    if (x > minheap[0])
    {
      minheap[0] = x;
      adjustdown(minheap, k, 0);
    }
  }
  free(minheap);
  fclose(fout);
}

🔥 注:这里采用的是文件打开方式有些书上可能给的是一个数组接收原理都是一样的!

3.2 数据文件的创建

📚 代码演示:

void TestTopk()
{
  // 造数据
  int n = 10000000;
  srand(time(0));
  const char* file = "data.txt";
  FILE* fin = fopen(file, "w");
  if (fin == NULL)
  {
    perror("fopen error");
    return;
  }
  for (int i = 0; i < n; ++i)
  {
    int x = (rand() + i) % 10000000;
    fprintf(fin, "%d\n", x);
  }
  fclose(fin);
  //PrintTopK(a, n, 10);
}

3.2 TOK问题的代码测试

这里拿了一千万个数据进行比较可以看到,只需要几秒钟就出来了大家可以去试验一下。

📝文章结语:

☁️ 把本章的内容全部掌握,铁汁们就可以熟练应用switch语句啦!

看到这里了还不给博主扣个:
⛳️ 点赞🍹收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。

目录
相关文章
|
12天前
|
缓存 NoSQL Java
Redis7的10大应用场景和案例解析
你在项目中使用 Redis 实现了什么应用场景,欢迎一起跟 V 哥讨论。同时也做个小调查,朋多少兄弟是需要了解 Redis 核心源码的,人多的话,下一篇 V 哥写 Redis7的源码分析,人少的话就算了,感谢。
|
12天前
|
存储 机器学习/深度学习 算法
|
14天前
|
机器学习/深度学习 数据采集 人工智能
【热门话题】AI作画算法原理解析
本文解析了AI作画算法的原理,介绍了基于机器学习和深度学习的CNNs及GANs在艺术创作中的应用。从数据预处理到模型训练、优化,再到风格迁移、图像合成等实际应用,阐述了AI如何生成艺术作品。同时,文章指出未来发展中面临的版权、伦理等问题,强调理解这些算法对于探索艺术新境地的重要性。
30 3
|
16天前
|
存储 算法 安全
|
16天前
|
消息中间件 存储 缓存
|
17天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
18天前
|
机器学习/深度学习 存储 人工智能
数据结构与算法设计:深度解析与实践
数据结构与算法设计:深度解析与实践
16 0
|
23天前
|
机器学习/深度学习 数据采集 自然语言处理
【热门话题】常见分类算法解析
本文介绍了6种常见分类算法:逻辑回归、朴素贝叶斯、决策树、支持向量机、K近邻和神经网络。逻辑回归适用于线性问题,朴素贝叶斯在高维稀疏数据中有效,决策树适合规则性任务,SVM擅长小样本非线性问题,KNN对大规模数据效率低,神经网络能处理复杂任务。选择算法时需考虑数据特性、任务需求和计算资源。
25 0
|
4天前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
14 0
|
1天前
PandasTA 源码解析(一)(2)
PandasTA 源码解析(一)
7 0

推荐镜像

更多