演算法導論 9 中位數和順序統計量

2021-10-03 18:05:37 字數 3829 閱讀 3746

乙個中位數是它所屬集合的中點元素

9.1.1 在乙個有n個元素的集合中,需要做多少次比較才能確定其最小元素呢

9.1.2 同時找到最小值和最大值

**實現: 同時求解最大值和最小值

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

26

def minimum_and_maximum(arr):

arr_len = len(arr)

print(arr_len)

if arr_len == 0:

raise indexerror("param: arr is empty")

if arr_len % 2:

max_val, min_val = arr[0], arr[0]

start = 1

else:

max_val, min_val = (arr[0], arr[1]) if (arr[0] > arr[1]) else (arr[1], arr[0])

start = 2

for i in range(start, arr_len, 2):

temp_max, temp_min = (arr[i], arr[i + 1]) if (arr[i] > arr[i + 1]) else (arr[i + 1], arr[i])

if temp_max > max_val:

max_val = temp_max

if temp_min < min_val:

min_val = temp_min

return max_val, min_val

if __name__ == '__main__':

arr = [-3, 19, -2, 4, 1, 3, 2, 16, 9, 10, 14, 8, 7, 17, 0, -1, 18]

max_val, min_val = minimum_and_maximum(arr)

print(max_val, min_val)

平均情況

9.3.1 簡介

9.3.2 演算法步驟

將輸入陣列的n個元素劃分為floor(n / 5)組,每組有5個元素,且至多只有一組由剩下的n % 5個元素組成

尋找這ceil(n / 5)組中每一組的中位數: 首先對每組元素進行插入排序, 然後確定每組有序元素的中位數

對第二步中找到的ceil(n / 5)個中位數,遞迴呼叫select以找出其中位數x

通過partition函式按照x對輸入陣列進行劃分, 假設x是陣列的第k個順序統計量

如果i=k,則返回x; 如果ik,則在高區遞迴查詢第i-k小的元素

9.3.3 演算法實現:python

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

72

import math

import random

def divide_arr(arr, start, end):

labels = [i for i in range(start, end, 5)]

if end != start[-1]:

return labels

def find_median(arr, labels):

for i in range(0, len(labels) - 1):

insertion_sort(arr, labels[i], labels[i + 1])

medians =

for i in range(0, len(labels) - 1):

return medians

def insertion_sort(arr, start, end):

if start >= end + 1:

return

for i in range(start + 1, end):

key = arr[i]

j = i - 1

while j > start - 1 and arr[j] > key:

arr[j + 1] = arr[j]

j -= 1

arr[j + 1] = key

def select(arr, start, end, i):

if start == end - 1:

return arr[start]

elif start > end - 1:

return arr[end - 1]

else:

labels = divide_arr(arr, start, end)

medians = find_median(arr, labels)

x = select(medians, 0, len(medians), math.floor((len(medians)-1) / 2))

o = partition(arr, start, end, x)

if o + 1 - start == i:

return arr[o]

elif o + 1 - start < i:

return select(arr, o + 1, end, i - (o + 1 - start))

else:

return select(arr, start, o, i)

def partition(arr, p, r, x):

i = p - 1

n = i

for j in range(p, r):

if arr[j] <= x:

i += 1

arr[i], arr[j] = arr[j], arr[i]

if arr[i] == x:

n = i

arr[i], arr[n] = arr[n], arr[i]

return i

if __name__ == "__main__":

for i in range(1, 11):

print()

arr = [8, 9, 3, 5, 4, 1, 7, 2, 0, 6]

print(arr)

o = select(arr, 0, len(arr), i)

print(arr)

print(o)

9.3.4 時間複雜度

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

在乙個由n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。乙個中位數是它所屬集合的 中點元素 當n為奇數時,中位數是唯一的,位於i n 1 2處 當n為偶數時,存在兩個中位數,分別位於i n 2和i n 2 1處。如果不考慮n的奇偶性,中位數總是出現在i n 1 2 處 下中位數 和i ...

《演算法導論》學習分享 9 中位數和順序統計量

順序統計量,第i個順序統計量指n個元素集合中第i小的元素。最小值,第1個順序統計量。最大值,第n個順序統計量。中位數,第n 2個順序統計量。若n為偶數,取n 2 1 我們可以通過一次遍歷陣列,取得最大值或者最小值。但是若要取得中位數或者其他順序統計量,則沒辦法通過一次遍歷陣列得到。如果將陣列排序,將...

演算法導論筆記 09中位數和順序統計量

1 n個元素組成的集合,第 i個順序統計量,就是該集合中第 i小的元素。所以,集合中的最小值就是第1個順序統計量,最大值就是第n個順序統計量。中位數是所屬集合的 中點元素 當n是奇數的時候,中位數唯一,位於 n 1 2處。如果n是偶數,中位數有兩個,分別位於n 2和 n 2 1。2 選擇問題,就是選...