刚刚脱稿:
On Mar 15, 11:29 am, Devymex <devy...@gmail.com> wrote:
> 任意一个长度为数组,可能有正有负,32位范围为界。
>
> 求O(n)算法,将数组整理为前n/2部分都小于后n/2部分,但各部分不要求有序。
>
> 暂时没有思路。
>
> =========程序控 <http://www.cnblogs.com/devymex>=========
>
> 2011/3/14 Chinainvent <chinainvent....@gmail.com>
>
> > 很神奇,此刻居然可以轻松地访问google site而不用翻墙,解禁了?
>
> > 2011/3/14 Larry, LIU Xinyu <liuxiny...@gmail.com>
>
> >> 刚刚脱稿:
>
> >>http://sites.google.com/site/algoxy/introduction
> >> (在墙外)
>
> >> --
> >> LIU
>
> > --
> > Chinainvent
> > Blog:http://blog.csdn.net/chinainvent
> > Work at Alibaba <http://www.alibaba.com>
说一下这个算法的描述:
记序列为xs, length xs = n, 记k=n/2
1. 取xs的第一个元素为pivot
2. partition,将所有小于pivot的元素放在前,记为as,大于的放在后,记为bs,记此时pivot的位置为i;
3. 比较i和k, 若i < k, 则令xs=bs, k = k - i重复1
若i>k则,令xs=as,重复1
复杂度:该算法为线性算法,其中2的实现和quick sort相同。
--
LIU
On Mar 15, 11:56 am, Yi Chao <yichao...@gmail.com> wrote:
> 有O(N)的算法的,请查看算法导论,O(N)找第K大数,常数大点就是了。
>
> 在 2011-3-15,上午11:54, Devymex 写道:
>
> > 嗯,应该是没有,这个问题等价于查找数组中第n/2小的元素,不用哈希的话是没有O(n)的解法的。
>
> > =========程序控=========
>
> > 2011/3/15 Devymex <devy...@gmail.com>
> > 任意一个长度为数组,可能有正有负,32位范围为界。
>
> > 求O(n)算法,将数组整理为前n/2部分都小于后n/2部分,但各部分不要求有序。
>
> > 暂时没有思路。
>
> > =========程序控=========
>
> > 2011/3/14 Chinainvent <chinainvent....@gmail.com>
> > 很神奇,此刻居然可以轻松地访问google site而不用翻墙,解禁了?
>
> > 2011/3/14 Larry, LIU Xinyu <liuxiny...@gmail.com>
吴教V5 :D在 2011-3-15,下午10:29, Wu Yin 写道:这种简单的partition只是expected O(n)而已,worst case是O(nk)的。那个d&c求pivot的方法才是worst case O(n)的
worst case 是O(n^2)的,此时序列为有序序列,每次pivot都是smallest或者biggest。
average情况下,此算法复杂度期望为:O(n)+O(n/2)+O(n/4)+...=O(n).
一个不那么精确的改良:每次处理xs时,取pivot=median(xs[1], xs[n], xs[n/2])。
这在大多数情况下已经足够健壮了。
--
LIU
On Mar 15, 10:29 pm, Wu Yin <wyw...@gmail.com> wrote:
> 这种简单的partition只是expected O(n)而已,worst case是O(nk)的。
> 那个d&c求pivot的方法才是worst case O(n)的
>
> 2011/3/15 Larry, LIU Xinyu <liuxiny...@gmail.com>
> wywcgs<http://www.topcoder.com/tc?module=MemberProfile&cr=22629546>
Worst case analysis比较简单,就不细说了。Expected running time的话,比较复杂,需要一个引理和数学期望的
累加计算。这里不大方便写。
我说说最后的改良,如果大家细看STL quick sort的SGI版本,就会发现实际上就是用这个方法选取的pivot。
可以说理论上无意义,但是它可以在很多情况下的避免前面提到的worst case。保证每次partition后,不会形成一侧为空,一侧为满的情
况。
类似的等价方法为pivot = xs[randint(0, length xs)]。除非精心设计一个序列进行exploit,否则对于很多序列,
这类策略足够强壮了。
--
LIU
On Mar 16, 9:48 am, Wu Yin <wyw...@gmail.com> wrote:
> 1. 确实是O(n^2)不是O(nk),我的问题
> 2. 期望虽然是O(n), 可是 不是你这么个算法. 去找找randomized quicksort期望O(nlgn)的分析法,
> 用那种方法可以分析出O(n)的复杂度.
> 3. 最后的改良理论上无意义.
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> wywcgs<http://www.topcoder.com/tc?module=MemberProfile&cr=22629546>
Hi,
我觉得这里说的事情有偏差。我也举一个例子,就是费马检验,我们知道费马检验是存在漏杀的,但是它给出了一种方法。
也就是说通过费马检验的数字很可能是素数了。如果否定这类方法,那么很多问题无法给出目前水平可接受的解。或者成本可以接受的解。
On Mar 16, 11:01 am, Wu Yin <wyw...@gmail.com> wrote:
> 我见过sgi stl的sort.
> 只是既然是在讨论算法, 那就去讨论算法. 和实用没什么太大的关系. 就像那个d&c的O(n)常数很大, 但是他依然是个好算法; fibonacci
> heap实际应用效率不高, 但是它仍然是非常游泳的数据结构一样.
> 至少在算法本身层面上, 你举出一个方法, 就得分析一下它的效果, 单纯说实际效果不错没什么意义. 因为你也不知道实际数据的分布到底是什么样子,
> 这个算法到底是不是真的就是正好对这个分布有很好的performance.
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> wywcgs<http://www.topcoder.com/tc?module=MemberProfile&cr=22629546>
Hi,
并不矛盾啊,Miller-Rabin primary test也是probabilistic search method. 这个方法也是存在漏
杀的
Miller-Rabin(n, s) 的错误概率为1/(2^s),如果取s足够大,通常我们可以得到一个非常好的结果。
回到前面说的三点中值法,和pivot=xs[randint(0, length xs)]法。也可以计算出出现worst case的可能性很
低。
对于长度为n的序列pivot为max/min的概率为2/n,所以每次pivot都恰好把序列分成一半空,一半满的概率为:
(2^(n-1))/(n!)。
当n=32时,这一概率为:8.16127700206094e-27已经非常小了。
--
LIU
On Mar 16, 11:41 am, Wu Yin <wyw...@gmail.com> wrote:
> 但是你要知道rabin miller给出了一个每次检测的确定下界,所以可以用possibility
> amplify的方法去得到一个正确率无限接近100%的方法.
> 重要的不在idea本身,在于对idea的分析.
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> wywcgs<http://www.topcoder.com/tc?module=MemberProfile&cr=22629546>
Hi,
Hi,
Hi,
我也感觉这么Re来Re去下去不大好了。我贴一段CLRS 7.2.1的一段:
The worst-case behavior for quicksort occurs when the partitioning
routine produces one subproblem with n - 1 elements and one with 0
elements. (This claim is proved in Section 7.4.1.) Let us assume that
this unbalanced partitioning arises in each recursive call. The
partitioning costs Θ(n) time. Since the recursive call on an array of
size 0 just returns, T(0) = Θ(1), and the recurrence for the running
time is
T(n)
=
T(n - 1) + T(0) + Θ(n)
=
T(n - 1) + Θ(n).
On Mar 16, 1:54 pm, Wu Yin <wyw...@gmail.com> wrote:
> 不想再回了,意义不大了.
> 你这个分析显然是错误的. 又不是只有分成一边是空的才会达到worst. 一边是一个一边是n-1个行不行? 一边是2个一边是n-2个行不行?
> 有一半总是常数行不行? 有一半个数不断变化但是上界是o(n)的行不行? 太多了.
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> TopCoder Handle:...
>
> read more >>
的确不那么严格的给个例子,假设算法每次pivot的分割都很不均匀,例如1:99吧,也就是比pivot大的元素个数是比pivot小的元素个数的
99倍。
令K=100
第一次分割后,xs=as++bs 有length as/length xs = K; 此次运行时间T(n), 是令xs = bs,继续分割;
第二次分割后,仍然as只有1/K的xs长,此次运行时间T(n(K-1)/K), 继续分割;
...
总时间是:T(n)+T(n(K-1)/K)+T(n(K-1)^2/(K^2))+...
注意到K-1/K<1,这个等比数列求和收敛到K。
故复杂度是O(nK)=O(100n)=O(n)
事实上,真正悲剧的情形是K=O(n)。每次左右不对称的比例达到n的量级就退化到O(n^2)了,包括:
左侧0, 右侧n-1
左侧1, 右侧n-2
....
左侧O(1)个,右侧O(n)个
--
LIU
On Mar 16, 3:17 pm, Wu Yin <wyw...@gmail.com> wrote:
> 你再好好想想吧. 这个确实是worst case. 但是这难道是唯一的worst case么? 你只考虑了这种情况发生的概率, 你如何证明
> 只要避免了这种情况, 算法的运行时间就不是O(n^2), 嗯?
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> ...
>
> read more >>
Hi,
其实说明一个问题:如果算法分为best case, worst case, 和average case。
partition的average case更加接近best case而远离worst case。(又要被批评不严格了)
这也是为什么quick sort在大多数的场合表现很好,而人们存在相对简单的手段避免被某些特殊情况(属于worst case)
exploit。
另:对于99:1的情况,我可以利用master methods直接从T(n)=T(n/K)+T(n(K-1)/K) + cn 直接给出
O(n),
但是我仍然一步一步列出来,然后用序列求和计算,因为这样比较省力,可以少记忆一些东西。
--
LIU
On Mar 16, 3:47 pm, Wu Yin <wyw...@gmail.com> wrote:
> 你这个例子确实不严格. 不仅不严格, 而且说明不了任何问题. worst case是每次长度减少固定数值,
> 不是减少固定比例。也就是说,是每次从n变成n-k,不是每次从n变成n-n/k。
> 其实我在上面已经说过了。如果每次partition之后总有一个序列的长度是o(n)的,那会如何?注意是o(n)不是O(n)。你这个什么1:XXXX就已经是O(n)量级了,
> 当然能分析出总体O(n)的复杂度。
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> ...
>
> read more >>
On Mar 16, 1:54 pm, Wu Yin <wyw...@gmail.com> wrote:
> 不想再回了,意义不大了.
> 你这个分析显然是错误的. 又不是只有分成一边是空的才会达到worst. 一边是一个一边是n-1个行不行? 一边是2个一边是n-2个行不行?
> 有一半总是常数行不行? 有一半个数不断变化但是上界是o(n)的行不行? 太多了.
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> TopCoder Handle: ...
>
> read more >>
我也感觉这么Re来Re去下去不大好了。我贴一段CLRS 7.2.1的一段:
The worst-case behavior for quicksort occurs when the partitioning
routine produces one subproblem with n - 1 elements and one with 0
elements. (This claim is proved in Section 7.4.1.) Let us assume that
this unbalanced partitioning arises in each recursive call. The
partitioning costs Θ(n) time. Since the recursive call on an array of
size 0 just returns, T(0) = Θ(1), and the recurrence for the running
time is
T(n)
=
T(n - 1) + T(0) + Θ(n)
=
T(n - 1) + Θ(n).
On Mar 16, 1:54 pm, Wu Yin <wyw...@gmail.com> wrote:
> 不想再回了,意义不大了.
> 你这个分析显然是错误的. 又不是只有分成一边是空的才会达到worst. 一边是一个一边是n-1个行不行? 一边是2个一边是n-2个行不行?
> 有一半总是常数行不行? 有一半个数不断变化但是上界是o(n)的行不行? 太多了.
>
> 2011/3/16 Larry, LIU Xinyu <liuxiny...@gmail.com>
> TopCoder Handle:...
>
> read more >>
Wu Yin 已经说了"worst case是每次长度减少固定数值, 不是减少固定比例",不是分成 0 vs. n-1 才叫 worst
case。
> ...
>
> read more >>
http://www.eusoff.nus.edu.sg/~flyfy1/learn/alg/Lecture7.pdf
On Mar 15, 11:29 am, Devymex <devy...@gmail.com> wrote:
> 任意一个长度为数组,可能有正有负,32位范围为界。
>
> 求O(n)算法,将数组整理为前n/2部分都小于后n/2部分,但各部分不要求有序。
>
> 暂时没有思路。
>
> =========程序控 <http://www.cnblogs.com/devymex>=========
>
> 2011/3/14 Chinainvent <chinainvent....@gmail.com>
>
>
>
> > 很神奇,此刻居然可以轻松地访问google site而不用翻墙,解禁了?
>
> > 2011/3/14 Larry, LIU Xinyu <liuxiny...@gmail.com>
>
> >> 刚刚脱稿:
>
> >>http://sites.google.com/site/algoxy/introduction
> >> (在墙外)
>
> >> --
> >> LIU
>
> > --
> > Chinainvent
> > Blog:http://blog.csdn.net/chinainvent
> > Work at Alibaba <http://www.alibaba.com>- Hide quoted text -
>
> - Show quoted text -