隨即演算法找第K大數

2021-06-17 18:03:26 字數 908 閱讀 7959

#!/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 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...