其他分享
首页 > 其他分享> > 特定分治策略

特定分治策略

作者:互联网

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