实现1:

#include <iostream>using namespace std;int partition(int a[], int left, int right)
{//从左、中、右3个元素中取中间值放在最右边int mid = (right - left)/2;if (a[left] > a[mid])swap(a[left], a[mid]);if (a[right] < a[left])swap(a[right], a[left]);if (a[right] > a[mid])swap(a[right], a[mid]);int i = left - 1;for(int j = left; j < right; j++)if (a[j] <= a[right])swap(a[++i], a[j]);swap(a[++i], a[right]);return i;
}int topk(int a[], int left, int right, int k)
{if (left == right)return a[left];int mid = partition(a, left, right);int cur = mid - left + 1;if (cur == k)return a[k - 1];else if (k < cur)return topk(a, left, mid - 1, k);elsereturn topk(a, mid+1, right, k-cur);
}int main()
{int a[] = {1,2,3,4,5,6,7};cout << topk(a, 0, 6, 3) << endl;
}

实现2:BFPRT

#include <iostream>
using namespace std;void insertionSort(int a[], int left, int right)
{int i, j;for(i = left; i < right; i++){int tmp = a[i+1];for(j = i; j >= 0; j--){if (a[j] > tmp)a[j+1] = a[j];elsebreak;}a[j+1] = tmp;}
}int partition(int a[], int l, int r, int pivotId) //对数组a下标从l到r的元素进行划分
{//以pivotId所在元素为划分主元swap(a[pivotId],a[r]);int j = l - 1; //左边数字最右的下标for (int i = l; i < r; i++)if (a[i] <= a[r])swap(a[++j], a[i]);swap(a[++j], a[r]);return j;
}int BFPRT(int a[], int l, int r, int id) //求数组a下标l到r中的第id个数
{if (r - l + 1 <= 5) //小于等于5个数,直接排序得到结果{insertionSort(a, l, r); return a[l + id - 1];}int t = l - 1; //当前替换到前面的中位数的下标for (int st = l, ed; (ed = st + 4) <= r; st += 5) //每5个进行处理{insertionSort(a, st, ed); //5个数的排序t++; swap(a[t], a[st+2]); //将中位数替换到数组前面,便于递归求取中位数的中位数}int pivotId = (l + t) >> 1; //l到t的中位数的下标,作为主元的下标BFPRT(a, l, t, pivotId-l+1);//不关心中位数的值,保证中位数在正确的位置int m = partition(a, l, r, pivotId), cur = m - l + 1;if (id == cur) return a[m];                   //刚好是第id个数else if(id < cur) return BFPRT(a, l, m-1, id);//第id个数在左边else return BFPRT(a, m+1, r, id-cur);         //第id个数在右边
}int main()
{int a[] = {2, 6, 3, 5, 4, 23, 56, 78};cout << BFPRT(a, 0, 7, 6) << endl;
}

topk问题C++实现相关推荐

  1. 关于某日访问次数最多的IP的topK问题的三种解法

    题目描述 在july大神的博客中,看到这样两道题: 1. 海量日志数据,提取出某日访问百度次数最多的那个IP. 2. 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复 ...

  2. PyTorch 笔记(08)— Tensor 比较运算(torch.gt、lt、ge、le、eq、ne、torch.topk、torch.sort、torch.max、torch.min)

    1. 常用函数 比较函数中有一些是逐元素比较,操作类似逐元素操作,还有一些类似归并操作,常用的比较函数如下表所示. 表中第一行的比较操作已经实现了运算符重载,因此可以使用 a>=b,a>b ...

  3. 一文带你了解被 BATJ 问烂的 TopK 问题

    作者:CyC2018 链接:https://www.nowcoder.com/discuss/150681 问题描述 找出一组数最大的 K 个数. 一般解法 Leetcode : 215. Kth L ...

  4. 006 Spark中的wordcount以及TopK的程序编写

    1.启动 启动HDFS 启动spark的local模式./spark-shell 2.知识点 textFile: def textFile( path: String, minPartitions: ...

  5. 【Java】面试高频考题---topK问题详解(堆heap求解)

    目录 1.topK问题概念 2.堆(heap)解决topK具体思路 3.topK问题求解代码实现 4.topK问题典型例题 4.1 LeetCode373 查找和最小的 K 对数字 4.2 LeetC ...

  6. 基于关联规则(Variational Autoencoders)疾病预测系统实战:(pyspark FPGrowth实现频繁项集挖掘、最后给出预测模型topK准确率和召回率)

    基于关联规则(Variational Autoencoders)疾病预测系统实战:(pyspark FPGrowth实现频繁项集挖掘.最后给出预测模型topK准确率和召回率) 目录

  7. 基于变分自动编码器(Variational Autoencoders)疾病预测系统实战:(Keras实现并可视化训练和验证误差、最后给出topK准确率和召回率)

    基于变分自动编码器(Variational Autoencoders)疾病预测系统实战:(Keras实现并可视化训练和验证误差.最后给出topK准确率和召回率) 本文中使用的VAE算法以病人病史为输入 ...

  8. 基于变分自动编码器(Variational Autoencoders)进行推荐系统的实施、Keras实现并可视化训练和验证误差、最后给出topK准确率和召回率

    基于变分自动编码器(Variational Autoencoders)进行推荐系统的实施.Keras实现并可视化训练和验证误差.最后给出topK准确率和召回率 本著作改编自Dawen等人用于协同过滤目 ...

  9. Scala堆的方式进行Spark topK词频查询(根据value进行TreeMap排序)

    本文来自:http://blog.csdn.net/liangyihuai/article/details/54925737 本文使用了两种方法进行spark 的top k词频查询,第一种方法在很多博 ...

  10. classification_report进阶:针对top-k的结果计算precision@k、recall@k、f1-score@k

    sklearn自带的classification_report方法可以针对二分类或多分类问题,计算分类器的precision.recall和f1-score. 示例: from sklearn.met ...

最新文章

  1. 正则表达式限定长度_自己写一个通用的邮箱正则表达式
  2. C语言中positive用法,sprintf - C语言库函数
  3. 什么是 JVM方法区
  4. LeetCode 14. Longest Common Prefix
  5. C++用string 定义字符串数组
  6. (fofa信息收集骚操作)windows查看文件的md5值
  7. 1207.1——C语言 函数
  8. ui设计师就业前景怎么样?
  9. Exchange2003/2010共存模式环境迁移
  10. 华为宣布了,鸿蒙 OS 2.0 开放源代码
  11. 三种新姿势帮你写出精美简历
  12. python算法书籍-推荐 10 本程序员必读的算法书
  13. RC电路 CR电路 理解
  14. 数据库update和alter之间的区别
  15. 怎么把mov格式转换成mp4?
  16. 3GPP TS 23501-g51 中英文对照 | 4.2.10 Architecture Reference Model for ATSSS Support
  17. DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN
  18. Java小白入门200例79之Java类的封装
  19. subline修改html模板,sublime Text 3 emmet自定义HTML模板的方法
  20. 易云维®智慧工业云平台让ChatGPT重新认识一下中国制造业信息化水平

热门文章

  1. 把驱动器变为U盘的方法(非一般性,可以一试
  2. 2021机动车检测站签字授权人仪器设备原理保养及检定考试题库答案
  3. 千万程序员都说完美,成为Java顶尖程序员 ,看这11本书就够了
  4. Linux批量域名查询IP
  5. Oracle-查询重复值
  6. 查询:同一个学校,姓名相同的学生名单。表中包含多个学校学生名单。
  7. 探探php模板下载,C3+H5+jQuery仿探探APP手机滑动切换特效
  8. 中小企业信息化咨询方案
  9. 荷兰计算机科学家Dijkstra
  10. Python问题:SyntaxError: Non-ASCII character '\xe3' in file