[理工] 资结 算法 median of medians selection algo.时间复杂度

楼主: JKLee (J.K.Lee)   2017-10-27 02:37:24
老师在上课时说,selection algorithm 中的 median of medians,
若改成3个3个一组,时间复杂度就会超过O(n)。
但我用的第二种方法却无法得到这个结果,我哪里出错了?
====================================================
第一种方法:
原本的递回关系式(5个5个一组)会从
T(n) = T(n/5) + T(3/4*n) + O(n)
变成
T(n) = T(n/3) + T(3/4*n) + O(n)。
新的T(n) = O(n^{1+log_{4/3}(13/12)})。比O(n)大。
================================================
S_1 ˙˙˙˙˙
─────
˙˙˙˙˙
─────
˙˙*˙˙
─────
˙˙˙˙˙
─────
˙˙ S_2
================================================
第二种方法:
以下参考自:林立宇 2006 算法讲义 p.37 【算法 2-5】
The median of medians selection algorithm
Select(A[size n],k)
1. 将input的n个数每5个一组,除了最后一组不足5个数,而是n mod 5个。
总共ceiling(n/5)组。
2. 将每组作sorting,并求得各组之median。
3. 将step 2得到的ceiling(n/5)个median当input,递回去求medians的median,p。
4. 从n个数中,收集小于与大于p的数,分别放入集合S_1与S_2。(见上图)
5. 假设p为第x小的数。
若k=x,则return p;
若k<x,则去掉被S_2包含的数,再递回求剩余数中第k小的数;
若k>x,则去掉被S_1包含的数,再递回求剩余数中第k-|S_1|小的数。
作者: FRAXIS (喔喔)   2017-10-27 08:11:00
这两种方法应该是一样的 都会有两个递回呼叫所以你的递回式有问题..
作者: can18 (18号)   2017-10-27 08:43:00
为什么1~3步可以独立? 就是递回下去做啊还有你第一个的递回式也写错了吧5个: T(n) = T(n/5) + T(7n/10) + O(n)3个: T(n) = T(n/3) + T(2n/3) + O(n)你知道你第二个的问题在哪吗?第三步是把 n/5 个数丢进 "原本" 的算法简单的说 根本不存在你所谓的算法G有的话你直接用G求median就好了 不用那么复杂
作者: nat99up (NAt)   2017-10-27 08:55:00
你漏掉小堆中位数之间的selection分三堆的话S-_1跟S_2的大小为1-(1/2 * 1/3 *2)c大其实7/10跟3/4的版本都有
作者: can18 (18号)   2017-10-27 08:58:00
谢谢n大 抱歉 我不知道这个版本所以你直接用G求就好了啊 但实际上G就是分5堆所以你是想表面上分3堆 骨子用分5堆求然后宣称分3堆可以O(n)吗你有懂了吗 还是我再讲详细一点
作者: nat99up (NAt)   2017-10-27 09:29:00
我误以为你的S1和S2是剩下来的n了 把1-拿掉
作者: gary70812 (1)   2017-10-27 13:18:00
我认为你的G算法如果是分三组“递回”下去的话,找出的数对selected algorithm 是没有帮助的,不管是三个一组或五个一组都一样,假设有十组5个数,共50个,五个一组,你的递回最后会剩两个数 这时候该挑哪个?挑哪个都对原算法没有帮助,以上我的观点,不一定对因为他不一定在中间,没办法保证下次只要算T(3/4*n)嗯...那这样你提出的方法就是O(n)了?还是你还有发现哪里有问题
作者: can18 (18号)   2017-10-27 15:15:00
其实最后一组剩几个都没差 顶多花常数时间BigO下会被去掉原po的问题是 他所谓的G算法必须架构在5个一堆下才能达O(n)所以其实只有主程式是3个一堆 副程式都是5个一堆
作者: FRAXIS (喔喔)   2017-10-27 20:40:00

Links booklink

Contact Us: admin [ a t ] ucptt.com