特定分治策略
作者:互联网
1. 问题
设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。
这里第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。
利用特定分治策略选出第k小的元素。
2. 解析
3. 设计
Select(S,k)
输入:n个数的数组S,正整数k
输出:S中的第k小元素
将S划分成5个一组,共ceil(n/5)个组
每组找一个中位数,把这些中位数放到集合M中
m*<-Select(M,ceil(|M|/2))
把A和D中的每个元素与m*比较,小的构成S1,大的构成S2
S1<-S1∪C;S2<-S2∪B;
if k=|S1|+1 输出m*
else if k<=|S1|
Then Select(S1,k)
else Select(S2,k-|S1|-1)
4. 分析
将输入序列按照每组5个元素进行分组(函数 select_fct()第5行调用函数 get_pivot(),即函数 get_pivot()第3 行~第 10行)
找出每一组的中位数(函数 get_pivot()第 14行~第16 行)
递归调用select_fct(),求出这些中位数的中位数作为支点数x(函数get_pivot)第17 行)
根据x将输入序列进行划分(函数 select_fct()第6行,即调用函数 patition_array())
根据x与k的关系,递归调用 select_fct()函数,求出第k大的数(函数 select_fct( )第 7行~第10 行)
算法的第一步分组执行时间为O(n)
第二步找出每一组5 个元素的中位数的时间复杂度也是O(n)
第三步递归调用select fct()函数,此时函数参数的个数为【5/n】,因此这一步时间复杂度为T(【5/n】)
第四步中函数patition_array()含有一个n 次的循环,每一次循环执行时间为常数,因此函数patition_array()的时间复杂度为O(n)
第五步函数执行时间复杂度为T(7n/10)
5. 源码
[github源码地址]
标签:元素,fct,函数,S1,分治,中位数,特定,select,策略 来源: https://www.cnblogs.com/zs0618/p/14700047.html