#!/usr/bin/python
import random
def rselect(array,k):
l =
r =
j = random.randrange(0,k)
p = array[j]
for i in array :
if i < p :
elif i > p :
if len(l) == k-1 :
return p
elif len(l) > k-1 :
return rselect(l,k)
else :
return rselect(r,k-len(l)-1)
a = [1,2,3,4,5,6,7,8]
for i in range(1,8):
print rselect(a,i)
演算法流程:
每次隨即找乙個數,然後把其他的數按照比它小放左邊,比它大放右邊的方法,放進兩個列表
然後分情況繼續從左邊或者右邊遞迴。
演算法複雜度分析:
1.我們把乙個資料量為n的問題的資料量為3/4的子問題稱之為乙個層。
2.很容易知道。t(n) = t(3/4*n) + o(n) . 因為a < b**d (1<4/3) ,根據主定理,我們得到這個遞迴式的複雜度為o(n)
3.下面證明我們只需要o(1)的次數就可以把這個演算法從第j層推到第j+1層。因為當隨機數選在25%-75%之間的時候,子問題的上界為3/4*n。而隨機數選在25%-75%的期望為2.所以期望為2次。
4.複雜度計算公式 t = e( sum(c * n * xj * ((3/4) ** j)) ) j = 1 to ??? 因為e(xj)=2,所以為o(n)
分治演算法 尋找第k大數
問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...
分治演算法 尋找第k大數
問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...
分治演算法 尋找第k大數
問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...