线性时间选择算法中,最坏情况仍然可以保持O(n). 原因是通过对中位数的中位数的寻找,保证每次分组后,任意一组包含元素的数量不会大于某个值. 普通的Partition最坏情况下,每次只能排除一个元素,所以会造成O(n2)的复杂度. 具体证明可以参考: 王云鹏论文<线性时间选择算法时间复杂度深入研究>…
一种最坏情况线性运行时间的选择算法 - The missing worst-case linear-time Select algorithm in CLRS. 选择算法也就是求一个无序数组中第K大(小)的元素的值的算法,同通常的Top K等算法密切相关. 在CLRS中提到了一种最坏情况线性运行时间的选择算法,在书中给出了如下的文字描述(没有直接给出伪代码). 1.Divide n elements into groups of 5 2.Find median of each group (Ho…
#include <ctime> #include <iostream> using namespace std; template <class Type> void Swap(Type &x,Type &y); inline int Random(int x, int y); template <class Type> void BubbleSort(Type a[],int p,int r); template <class Ty…
Description 给定线性序集中n个元素和一个整数k,n<=2000000,1<=k<=n,要求找出这n个元素中第k小的数. Input 第一行有两个正整数n,k. 接下来是n个整数(0<=ai<=1e9). Output 输出第k小的数 Sample Input 6 3 1 3 5 2 4 6 Sample Output 3 利用快速排序可以找出第k小的,加上随机函数改进一下: #include <cstdio> #include <cstdlib&…
Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 907   Accepted: 598 Description The classic Two Glass Balls brain-teaser is often posed as: "Given two identical glass spheres, you would like to determine the lowest floor in a 100-s…
在系统平时使用中 ,最重要的三个方面  内存使用 硬盘使用  CPU负载 这些 自己觉得 比较重要 1.内存使用情况   首先就是内存查看 命令free -m  -m 表示单位是M 主要看第一行Mem  总共3758M 使用了275M 剩余空闲3482M 这个shared 8M 也不知道用在哪里~.... 第二行 -/+ buffers/cache 使用中的used 151M  计算方法 (275M)used - buffers(1M) -cached(123M) = 151M free空闲的…
题目 k个鸡蛋从N楼层摔,如果确定刚好摔碎的那个楼层,最坏情况下最少要试验x次? 换个说法: k个鸡蛋试验x次最多可以检测N层楼.计算出N? 逆向思维和数学公式解. 分析 定义N(k,x) 如果第k个鸡蛋碎了,则 还剩k-1块鸡蛋. 下一次只需检查下面的楼层. 还剩x-1次机会. 如果第k个鸡蛋没有碎,则 还剩k块鸡蛋. 下一次只需检查上面的楼层. 还剩x-1次机会. 即N(k,x) = 1 + N(k-1,x-1) + N(k,x-1) 初始值N(k,1)=1 N(1,x)=x 代码如下: 空…
问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供了一种方法,可以在O(n)线性时间内解决Top k问题.关于时间复杂度的证明,不再解释,读者可以查阅相关资料.具体的算法描述如下: 算法:LinearSelect(S,k) 输入:数组S[1:n]和正整数k,其中1<=k<=n: 输出:S中第k小的元素 1. If  n<20  Then  …
问题描述: 给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,即如果将这n个元素依其线性序排列时,排在第k个的元素即为要找到元素. 细节须知:(与之前的随笔相比) (1)设置了对于程序运行次数的手动输入设定 (2)取消了文件的读入,直接生成随机数进行排序查找 (3)扩大了随机数的范围.数组的可申请大小 (4)时间统计精确到了微秒级 (5)运行结束后一次性写入提升了程序稳定性,写入的数据可用于数据分析图表 算法原理: 将n个输入元素划分成⌈n/5⌉个组,每组5个元素…
找任意第k个小的元素 #include <stdio.h> #include <stdlib.h> #include <ctime> #include <iostream> using namespace std; template <class Type> void Swap(Type &x,Type &y); inline int Random(int x, int y); template <class Type>…