特定分治策略

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())

根据xk的关系,递归调用 select_fct()函数,求出第k大的数(函数 select_fct( )第 7行~第10 行)

 

算法的第一步分组执行时间为On

第二步找出每一组5 个元素的中位数的时间复杂度也是On

第三步递归调用select fct()函数,此时函数参数的个数为【5/n】,因此这一步时间复杂度为T(【5/n】)

第四步中函数patition_array()含有一个n 次的循环,每一次循环执行时间为常数,因此函数patition_array()的时间复杂度为On

第五步函数执行时间复杂度为T7n/10

5. 源码

[github源码地址]

posted @ 2021-04-25 14:05  starshine0618  阅读(77)  评论(0编辑  收藏  举报