在進入迴圈前,先將在整個陣列中隨機選擇乙個數至於a[
1]即可:
permute-in-place(a)
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)]
第二步其概率為1n
,後面一樣
不能。雖然這個演算法確實不會產生恒等排列,但是不能產生除恒等排列外的任意排列。因為演算法第三步使所有a[
i]不能至於原來的位置。例如,當n=
3 時,除恒等排列外一共應該有n!
−1=5
個排列,但該演算法只能產生3個排列。
不會。。。對於a
中每個元素a[
i]來說,當of
fset
確定了,則a[
i]將出現在i+
offs
et位置(超過了
n 就減去
n),這樣由於of
fset
=ran
dom(
1,n)
,off
set 取1−
n 中任意乙個的概率都為1/
n ,所以a[
i]出現在
b 中任何替丁位置的概率都為1/
n。 但是因為該演算法只是在1−
n 之間取了乙個數,然後將整個陣列
a 向右平移了of
fset
個位置,所以一共只能產生
n 個排列,而均勻隨機排列一共應該有n!
個,所以aemstrong教授錯了
在過程permute-by-sorting中,我們是在1到n3
這n3 個數中隨機選擇
n 個出來放在陣列p中,所以對於p,其中每乙個元素都唯一的概率為 pr
=n3⋅
(n3−
1)⋅⋯
⋅(n3
−n+1
)n3n
由於 n3−
n+1>n3
−n2=
n2(n
−1)
所以 pr≥
[n2(
n−1)
]nn3
n 也即 pr≥
n−1n
=1−1
n 可以對於相同的幾個優先順序的繼續使用permute-by-sorting演算法將其再次進行排序
演算法實際執行的第一步為 s=
random-sample(0,n-m)=∅
第二步中取第乙個元素i=
rand
om(1
,n−m
+1) ,相當於在總集和的前n−
m+1 個元素中任選乙個元素,概率為1n
−m+1
之後娶第二個元素時,總集和中的前n−
m+2 個元素中,第一次已經取得了乙個元素,故還剩n−
m+1 個元素,在這n−
m+1 個元素中在任取乙個作為第二個元素,其概率也為1n
−m+1
對於所有取得的
m 個元素,概率都為1n
−m+1
故每個m子集是等可能的,且一共只取
m 次,故值呼叫ramdom函式m次
演算法導論第三版習題5 2
正好僱傭一次說明第一次僱傭的就是所有應聘者中最好的,所以概率為1n 正好僱傭 n 次說明所有應聘者按優秀從低到高依次出現,第一位是最差的,概率為1n 第二位其次,概率為1n 1,所以整體概率為1n 正好僱傭兩次,說明第乙個應聘者不是最好的,概率為n 1n,第二個應聘者是最好的,概率為1n 1,所以概...
演算法導論第三版習題6 3
a a.leng th 9 故從i a.l engt h 2 4開始呼叫max heapify a,i a 4 9 8 故交換a 4 和a 8 得到新的序列a1 b 接下來呼叫max heapify a,3 a 7 3 6 故交換a 3 和a 6 得到a2 c 第三步呼叫max heapify a,...
演算法導論第三版習題8 1
最小深度為n 1 就像插入排序最好的情況一樣,對已經排序好的序列排列的情況。k 1nl gk k 1n lgn nlgn 所以,lg n o n lgn k 1nlg k k 1n 2lgk k n 2 1nlg k k n 2 1nl gk k n 2 1n lg n 2 n2lg n2 n 2l...