请大虾帮我看看这段伪码,谢谢!

mcmib 2003-10-18 12:15:41
select(L,k)
{
if (L has 10 or fewer elements)
{
sort L
return the element in the kth position
}

partition L into subsets S[i] of five elements each
(there will be n/5 subsets total).

for (i = 1 to n/5) do
x[i] = select(S[i],3)

M = select({x[i]}, n/10)

partition L into L1<M, L2=M, L3>M
if (k <= length(L1))
return select(L1,k)
else if (k > length(L1)+length(L2))
return select(L3,k-length(L1)-length(L2))
else return M
}
小弟找到上面这段关于deterministic linear time selection algorithm(Median-of-medians algorithm)的伪码,但是下面两句看不太懂。
for (i = 1 to n/5) do
x[i] = select(S[i],3)<----这里为什么要用3来再分组?

M = select({x[i]}, n/10)<-----这里为什么是n/10而不是n/5?
还请哪位大虾讲解一下,如有可能还麻烦能不能帮小弟把伪码换成java的代码,小弟对看伪码实在没有心得。万分感谢!
...全文
83 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
levinjoe 2003-10-18
  • 打赏
  • 举报
回复
买吧,24元!不算太贵,还值!
mcmib 2003-10-18
  • 打赏
  • 举报
回复
谢谢!再问一句这本书,哪里可以下?再次感谢!
levinjoe 2003-10-18
  • 打赏
  • 举报
回复
建议看看《计算机算法分析与设计》p22-24,里面有详细的分析;

具体思路如下:
1》先将n 个数分成 n/5组(如不为整数,则舍去小数并加1);用任意一种简单排序方法,将数排好,并去中位数;(如想最少比较次数7次,请到南大搜starfish的贴);

2》递归调用select来找出这n/5个分组中的中位数,也就是5中选3(明白了吗,5个数当然排第3的为中位数);(注意最后不完全是5个情况,单独处理);

再对n/5中选中位数,则为n/5/2=n/10;(具体实现注意奇偶问题,偶数找两个中最大的(或最小的))

3》采用快速排序中方法,将数组分成3块,l1<M<l2,判断是调用l1还是l2,根据如上分析有,
显然,
该数有n/4以上的数比他小(因为中位比她小的分组中小于等于中位数的数均比它小,同样也有
n/4以上的数比它大;也就是说L1.length<n*3/4,L2.length<n*3/4;

从而有
T(n)<=cn(第三步分块)+T(n/5)(第二步递归调用)+T(n*3/4)
用归纳法可证T(n)=0(n);

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧