今日複習常用演算法,發現bfprt演算法的python實現很少,所以借鑑書本自己用python實現了一下,**如下,如有bug,懇請指出,謝謝。
#coding: utf-8
# 插入排序
def insertsort(arr, l, r):
for i in range(l,r):
if arr[i] > arr[i+1]:
x = arr[i+1]
j = i
while x < arr[j] and j >= l:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = x
# 尋找中位數
def findmid(arr, l, r):
if l == r:
return l
i = 0
n = 0
while i <= r-5:
insertsort(arr, i, i+4)
n = i - l
arr[l + n/5],arr[i+2] = arr[i+2],arr[l + n/5]
i += 5
res = r - i + 1
if res > 0:
insertsort(arr, i, i+res-1)
n = i - l
arr[l + n / 5], arr[i + res/2] = arr[i + res/2], arr[l + n / 5]
n /= 5
if n==l:
return arr[l]
else:
return findmid(arr,l,l+n)
# 進行劃分
def partion(arr, l, r):
i = l
j = r
pivot = arr[l]
while i < j:
while arr[j] <= pivot and i < j:
j -= 1
arr[i] = arr[j]
while arr[i] >= pivot and i < j:
i += 1
arr[j] = arr[i]
arr[i] = pivot
return i
def bfptr(arr, l, r, k):
findmid(arr, l, r)
i = partion(arr, l, r)
m = i - l + 1
if m == k:
return arr[i]
if m > k:
return bfptr(arr, l, i-1, k)
else:
return bfptr(arr, i+1, r, k - m)
if __name__ == '__main__':
arr = [82, 60, 87, 76, 6, 73, 16, 39, 51, 98, 61, 3, 14]
print "the top-2 num is {}".format(bfptr(arr,0,len(arr)-1, 2))
執行結果:
the top-2 num is 87
BFPTR排序演算法(O n 時間複雜度)
bfptr演算法,又稱為中位數的中位數演算法,它的最壞時間複雜度為o n 它是由blum floyd pratt rivest tarjan提出。該演算法的思想是修改快速選擇演算法的主元選取方法,提高演算法在最壞情況下的時間複雜度。將n個元素劃為 n 5 組,每組5個,至多只有一組由n mod 5個...
Perona Malik 演算法Python實現
最近正好在學習關於影象處理的東西,需要用到pm perona malik 演算法,所以就把自己的一些理解和 貼上來,希望能跟大家一起 pm演算法的具體原理可以網上查閱相關資料或者相關書籍,這裡只是簡要介紹大概的實現思路 一般而言,對乙個影象進行提取特徵之前,需要進行降噪濾波處理。最常用的應該是高斯濾...
Miller Rabin演算法 Python實現
用python實現了miller rabin的素性檢驗演算法 import random deflargeprime generate bit 1024 print generating large prime.i 1while true num random.randrange 2 bit 1 2...