《演算法導論》讀書筆記6 中位數和順序統計學

2021-08-30 09:56:20 字數 2364 閱讀 1683

這一章《中位數和順序統計學》很短,也是本書第二部分的最後一章

寫幾段**吧。

求陣列最小值

int minimum(int a) 

} return min;

}

這個不用寫測試,就當沒寫過。 這個方法需要做 n-1 次比較

同時找出最大值,最小值

如果用上面的方法,那麼這個問題使用 2(n-1) 次比較肯定能解決。 當然可以更少一些。

int minandmax(int a) 

if (min > max)

// 下面從 i 開始,直到結束,共有偶數個數, 每次處理兩個

for (; i < a.length; i += 2)

// now m <= n

if (min > m)

if (max < n)

} int b = ;

return b;

}

現在 每次迴圈 進行3 次比較, 共進行 3((n - 1) / 2) 次比較, 加上迴圈前的一次比較,共進行 3(n / 2) 次比較

選擇第 i 小的數

我們可以進行一次排序,然後再輸出第 i 小的數, 但這樣複雜度會和排序一樣

可以有更好的方法:

int randselect(int ary, int left, int right, int index) 

if (left == right)

int mid = partition(ary, left, right); // 對陣列進行一次劃分,[left, mid - 1] [mid] [mid + 1, right]

int len = mid - left;

if (index == len) else if (index < len) else

}

其中 partition 在快速排序中遇到過

int partition(int a, int low, int high) 

} swap(a, low, m);

return m; }

void swap(int a, int i, int j)

不忙, 寫個測試先。

@test

public void testrandselect()

}

可以看到,執行是通過的:)

下面我們看分析其複雜度。

首先重構 randselect 將其修改為求比較次數

int randselect2(int ary, int left, int right, int index) 

if (left == right)

int times = right - left; // 下面的partition要作 right - left 次比較, 見快速排序(筆記4)

int mid = partition(ary, left, right);

int len = mid - left;

if (index == len) else if (index < len) else

}

然後對上面的方法進行簡化

1.  引數檢查不需要

2. left == right 測試 ---> n == 0

3. 把left 和 right 等表示成 n 相關, 並去掉 a, index

3. 在一般情況下,partition 分得很平均, 並且我們假設**路徑都只經過 index < len 這個分支

上面的方法即可簡化成求平均比較次數

int randselect2(int n) 

int times = n - 1; // partition比較次數

return times + randselect2(n / 2); // 每次分割後n 減半

}

寫成遞迴式就是 t(n) = t(n / 2) + (n - 1) 

上面這個寫成數列就是: (n - 1) + (n - 1) / 2 + (n - 1) / 4 + (n - 1) / 8 + ...

即 (n - 1)( 1 + 1/2 + 1/4 + 1/8 + ..) ---> 差不多的 2(n-1) 

所以randselect演算法複雜度是線性的

當然也可以使用演算法筆記2中的工具進行繪製, 看其複雜度

和2(n-1)相符!

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

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

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

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

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

乙個中位數是它所屬集合的中點元素 9.1.1 在乙個有n個元素的集合中,需要做多少次比較才能確定其最小元素呢 9.1.2 同時找到最小值和最大值 實現 同時求解最大值和最小值 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 26 def mini...