這一章《中位數和順序統計學》很短,也是本書第二部分的最後一章
寫幾段**吧。
求陣列最小值
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...