一个关于线性时间选择(TOP K)的未解之谜

在line19对rand()%(r-p)改成rand()%(r-p+1)陷入了死循环,目前难以理解

 1 int Partition(vector<int> &a, int p, int r)
 2 {
 3     int x = a[p];
 4     int i = p, j = r + 1;
 5     while (1)
 6     {
 7         while (a[++i] < x&&i < r);
 8         while (a[--j] > x);
 9         if (i >= j)
10             break;
11         swap(a[i], a[j]);
12     }
13     a[p] = a[j];
14     a[j] = x;
15     return j;
16 }
17 int RandomizedPartition(vector<int> &a, int p, int r)
18 {
19     int i = rand() % (r - p) + p;
20     cout << i << endl;
21     swap(a[i], a[p]);
22     return Partition(a, p, r);
23 }
24
25 int RandomizedSelect(vector<int> &a, int p, int r, int k)
26 {
27     cout << p << " " << r << " " << k << endl;
28     for (auto e : a)
29         cout << e << " ";
30     cout << endl;
31     if (p == r)
32         return a[p];
33     int i = RandomizedPartition(a, p, r);
34     int j = i - p + 1;
35     cout << i << " " << j << endl;
36     if (k <= j)
37         RandomizedSelect(a, p, i, k);
38     else
39         RandomizedSelect(a, i + 1, r, k - j);
40 }
41
42 int main(void)
43 {
44     vector<int> test = { 12,12,4,55,2,5 };
45     cout << RandomizedSelect(test, 0, test.size() - 1, 4);
46     return 0;
47 }

原文地址:https://www.cnblogs.com/zouma/p/11745370.html

时间: 2024-10-21 14:57:38

一个关于线性时间选择(TOP K)的未解之谜的相关文章

观《西游记未解之谜 》后记

前2周大学的某个课堂练习涉及到<西游记>,由于自己并没有对西游记有太多深刻的解析,所以在网络上搜索和西游记有关的讲解,就遇到了吴闲云写的<西游未解之谜>,简直吸引住了我--一个对西游一知半解的人,花上一个晚上如获珍宝似地看了一半,并在今晚看完了剩下的部分. 对于该文章的内容,基本是持一种"哇,这么高深吗?想想好像也有道理哎"的态度,所以看完这本书(大概10万字)也不是什么难题,也不觉得很累(ps:我要是学习其他也有这股劲就好了).看完一半后的那一段时间,我还经常

世界十大未解之谜

世界十大未解之谜 1.泰坦尼克号沉没 1912年4月12日是个悲惨的日子——这一天,英国豪华客轮泰坦尼克号在驶往北美洲的处女航行中不幸沉没.这次沉船事件致使1 523人葬身鱼腹,是人类航海史上最大的灾难,震惊世界.这么多年来,泰坦尼克号沉没的真正原因,一直是人们探索的焦点. 1985年,人们在纽芬兰附近海域发现了沉没的泰坦尼克号残骸.紧接着,探索者们利用各种先进技术,甚至潜入冰冷黑暗的深海,企图揭示泰坦尼克号沉没的原因.然而,潜入水中的人只能看到泰坦尼克号的外观,却无法探查由于冰山撞击造成的“创

Top K 算法详解

http://xingyunbaijunwei.blog.163.com/blog/static/7653806720111149318357/ 问题描述         百度面试题:         搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节.        假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个.一个查询串的重复度越高,说明查询它的用户越多,也就是越热门.),请你统计最热门的1

Robot Framework中的未解之谜

今天在写测试用例的时候偶然发现了一个问题: 一.看脚本逻辑上没有问题,但是在引用变量的时候不能成功引用,脚本截图如下: 这个是关键字A的截图,没有参数. 此时在case中引用${phonesign}和${data}的时候是无法调用的,报错信息是找不到这个参数 解决办法: 在rf中讲要存的值处理为字典,将要使用的值存入.py文件中,存入形式为"k=v(换行)k=v",在应用的时候引入这个.py文件后直接通过变量名字调用.具体处理方法如下: python写文件代码如下:

循环与括号(上课时的未解之谜)

c语言书P86 数组 上课看到书86上的题 #include<stdio.h>int main(){ int s[10]; int i; for(i=0;i<=9;i++) s[i]=i*i; for(i=0;i<=9;i++) printf("%4d",s[i]); return 0;} 就在纠结为什么要2个循环,不是一个循环就够了,真的是百思不得其解,难道有什么惊艳之出 回寝室后运行了 #include<stdio.h>int main(){ i

南阳理工 55 未解之谜

# include<stdio.h># include<stdlib.h>int cmp(const void *x,const void *y){ return *(int *)x-*(int *)y;}int main(){ int N,i,j,k; scanf("%d",&N); while(N--) { int n; long long sum =0; scanf("%d",&n); long long a[n],t;

IT工作十年后的18个未解之谜

1,怎样跟踪用户所有的浏览.停留.操作记录? 2,用户所属单位切换时其录入的数据怎样划分归属? 3,系统怎样结合不断变化的组织结构? 4,用户在矩阵式组织中怎样表示其多组织的所属关系? 5,需要在操作一条数据后回到原页面的页码记忆功能怎样实现比较简洁? 6,系统维护中怎样实现一个制度及时维护用户信息? 7,系统运行中实现怎样的制度能保证数据的准确率? 8,对于已经批准并被引用的单据怎样纠正其内容中的错误数据? 9,多层次与交并集数据范围怎样与用户操作权限结合? 10,一级.二级管理员权限逐级减少

acm未解之谜-洛谷P1109学生分组

把每一组的学生个数调度到一个给定区间范围内: 看了一圈题解,大佬都对原因避而不答: #include <iostream> #include <algorithm> using namespace std; const int maxn = 55; int sum=0,a[maxn],n,l,r; int main(){ cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; sum+=a[i]; } cin>>

Android开发架构规范,带你解答未解之谜。

前言在开发中,一个良好的开发习惯以及一个开发规范可能会让你少走很多弯路,也会一定程度上的提高代码的可读性,可维护性和可拓展性.当随着需求的不断变更,需要维护项目的时候.当随着项目的代码量的提升,需要重构的时候.你会明白一个好的开发规范多么多么的重要. 这里整理一下自己android开发中的一些规范.希望对各位有帮助. 命名规范包命名规范 包名全部采用小写主包名采用[公司性质].[公司名称].[项目名称]的命名方式如果根据不同情况进行分包的话,可以将包名分别命名为util,view, adapte