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 ...