演算法導論5.3-1
marceau教授不同意引理5.5證明中使用的迴圈不變式。他對第一次迭代之前迴圈不變式是否為真提出質疑。他的理由是,我們可以很容易宣稱乙個空陣列不包含0排列。因此,乙個空的子陣列包含乙個0排列的概率應是0,從而第一次迭代之前迴圈不變式無效。請重寫過程randomize-in-place,使得相關迴圈不變式適用於第一次迭代之前的非空子陣列,並為你的過程修改引理5.5的證明。
由於需要適應的是第一次迭代之前的非空子陣列,那麼只需要作如下修改
1.將陣列a的第乙個元素的隨機交換單獨列出
2. 迴圈從陣列a的第二個元素開始直至最後
偽**
randomize-in-place(a)引理5.5的證明所需修改的地方是:1 n=a.length
2 swap a[1] with a[random(1,n)]
3 for i=2 to n
4 swap a[i] with a[random(i,n)]
1.在3~4行for迴圈的第i次迭代之前,對每個可能的(i-1)排列,子陣列a[1…i-1]包含這個(i-1)排列的概率是(n-i+1)!/(n-1)!
2.初始化:考慮正好在第一次迴圈迭代前的情況,此時i=2。有迴圈不變式可知,對每個可能的1排列,子陣列a[1]包含這個1排列的概率是(n-i+1)!/(n-1)!=(n-2+1)!/(n-1)!=(n-1)!/(n-1)!=1。子陣列a[1]是乙個單元素陣列,並且1排列也就是乙個單元素排列,因此a[1]包含任意1排列的概率就是1。在第一次迴圈迭代之前迴圈不變式成立。
3.保持:與引理5.5的證明類似只需要把(n-i+1)!/n!改為(n-i+1)!/(n-1)!
4.終止:i=n+1,子陣列a[2…n]是乙個給定(n-1)排列的概率為(n-(n+1)+1)!/(n-1)!=1/(n-1)!
明顯地,修改完之後,我們證明出了子陣列a[2…n]是給定n-1排列的概率是1/(n-1)!,再由第二行可知a[1]是給定1排列的概率為1/n,由此將兩部分相乘合併,可以推知a[1…n]是給定n排列的概率是
(1/n)*(1/(n-1)!)=1/n!
5 31考試總結
8知8覺 又到了月底了這個月低保還沒打呢 然後這次在學校集訓 連著兩天都要考試 有點難受 t1 給出乙個正整數 n,現在問存在多少個 x,使得 x在十進位制下的每一位之和加上 x 等於 n 說實話剛看到這題感覺蠻簡單的 老劉也說是簽到題 但資料有10 9啊 然後我想到了乙個奇奇怪怪的思路 就是利用前...
演算法導論 隨機演算法
一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...
《演算法導論》 演算法導論2 2 1插入排序
2.1 插入排序。我們分析的第乙個演算法是插入排序演算法,輸入 n個數 a1,a2,a3,a4,a5,a6,a7 an 輸出 序列的乙個排列 即重新排序 a1 a2 a3 使a1 a2 a3 插入排序演算法的偽 是以乙個過程的形式給出的,稱為insertion sort,它的引數是乙個陣列。包括了n...