order statistics

问题:在a1, a2, ..., an中找到第i小的值。the ith smallest element of array a[1:n]

两种算法:

1. Random-Select

主要思想是利用类似quicksort的partition的方法,不断的化归问题,由于不用排序,问题可以只向一个partition化归,所以其expected running time是n。最坏情况是每次partition出现1,n-1这种分段,概率是1/n!,概率非常小。所以,这个算法是非常实用的简洁的算法。

2. Worst-case Linear-time order statistics

这个算法的目标是在最坏情况下,依然能保证n的运行时间。(我个人认为不实用,因为太复杂,没有random-select好)。

该算法的主要思想是选取足够好的pivot,使得每次分段能保证比较好的分段情况,1/4 3/4分段。

所以,问题就化归成:如何在n运行时间内选取一个足够好的pivot.

主要做法是,将n个元素分成5组,每组取中间值,然后在n/5个中间值再分组,重复以上过程,得到一个差不多是中间值的pivot.当n很大时,自然是很靠近中间的排序了,如果n比较小,自然是O(1)运行时间的。可以推算出分界点可以设为n=50.

当选取到比较好的pivot后,就可以用random-select的类似的方法进行partition并且不断重复该过程直到找到i.

 

你可能感兴趣的:(order statistics)