演算法導論 第九章 中位數和順序統計量

2021-07-05 02:47:02 字數 3500 閱讀 7966

def:第i個順序統計量,是該集合中第i小的元素。

def:選擇問題:輸入,乙個包含n個數的集合a,和乙個整數i, 1<=i<=n。輸出,元素x屬於a,且a中恰好有i-1個其他元素小於它。

9.1 最大值和最小值

尋找乙個陣列中的最大值和最小值需要經過n-1次比較找到

def minimum(a):

mini = a[0]

for i in range(1, len(a)):

if mini > a[i]:

mini = a[i]

return mini

def maximum(a):

maxi = a[0]

for i in range(1, len(a)):

if maxi < a[i]:

maxi = a[i]

return maxi

而同時尋找最大值與最小值則可以通過同時取兩個數進行比較得到3*(n//2)次比較得到

def minimum_maximum(a):

n = len(a)

start = 0

if n % 2 == 0:

start = 2

s = a[ : start]

mini = minimum(s)

maxi = maximum(s)

else:

start = 3

s = a[ : start]

mini = minimum(s)

maxi = maximum(s)

for i in range(start, len(a), 2):

if a[i] > a[i + 1]:

mn = a[i + 1]

mx = a[i]

else:

mn = a[i]

mx = a[i + 1]

if mn < mini:

mini = mn

if mx > maxi:

maxi = mx

return mini, maxi

9.2 期望為線性時間的選擇演算法

期望為線性時間的選擇演算法,利用parttion將陣列分組,最壞情況為n^2,期望執行時間為n

def partition(a, p, r):  

x = a[r]

i = p

for j in range(p, r):

if a[j] <= x:

temp = a[i]

a[i] = a[j]

a[j] = temp

i = i + 1

temp = a[i]

a[i] = a[r]

a[r] = temp

return i

def randomized_partition(a, p, r):

i = random.randint(p, r)

temp = a[i]

a[i] = a[r]

a[r] = temp

return partition(a, p, r)

def randomized_select(a, p, r, i):

if p == r:

return a[p]

q = randomized_partition(a, p, r)

k = q-p+1

if i == k:

return a[q]

elif i < k:

return randomized_select(a, p, q-1, i)

else:

return randomized_select(a, q+1, r, i-k)

演算法效率的證明過程與快速排序一樣,利用隨機變數指示器證明其期望執行時間。

9.3 最壞情況為線性時間的選擇演算法

找到陣列的第k位數,然後根據這個數對陣列做劃分,再在相對應的子陣列中尋找第i位數。有t(n) = t(n) + t(max(k, n-k)) + o(n),t(n) = t(n) and t(n) >= t(max(k, n-k))。所有問題的關鍵在於縮小問題的規模使得等式右邊的第乙個t(n)變為t(x),xt(x) + t(max(k, n-k)) + o(n),

習題解答

演算法導論第九章 中位數和順序統計量

9.1 最小值和最大值 遍歷陣列,線性時間求最小值 int minimun int a 兩兩相比,3n 2次比較即可求最小值和最大值 void minandmax int a,int min,int max 如果n是偶數 else 成對地處理餘下的元素 for i length a i i 2 9....

《演算法導論》筆記系列之第九章中位數和順序統計量

在乙個由n個元素組成的集合中,第i個順序統計量,是該集合中第i小的元素。9.1討論了陣列的最小值和最大值。如果要找出陣列的最小值,可以通過至多n 1次比較得出。最大值相同。但若要求同時找出最大值和最小值呢?可以採用9.1介紹的方法。就是不是將元素與最小值或最大值相比,而是將陣列的元素成對處理,先將兩...

演算法導論學習筆記 第九章 中位數和順序統計學

總結 這一章講了找最大值 最小值的方法,介紹了以期望線性時間找第 i小的數的方法,以及以最壞情況線性時間找第 i小的數的方法。1.最大值和最小值 找最小值,遍歷一遍即可 偽 minimum a min a 1 for i 2 to length a do if min a i then min a ...