function foo(n)
if n = 1 then
return 1
else
return foo(rand(1, n))
end if
end function
如果foo最初是以m作爲參數調用的,那麼rand()將被調用的預期次數是多少?遞歸隨機數
BTW,rand(1,n)返回1到n範圍內的均勻分佈的隨機整數。
function foo(n)
if n = 1 then
return 1
else
return foo(rand(1, n))
end if
end function
如果foo最初是以m作爲參數調用的,那麼rand()將被調用的預期次數是多少?遞歸隨機數
BTW,rand(1,n)返回1到n範圍內的均勻分佈的隨機整數。
一個簡單的例子是計算f(2)
需要多少次調用。說這次是x
,然後x = 1 + 0/2 + x/2
,因爲我們做了實際的電話1
,然後以1/2
的概率,我們去f(1)
和1/2
我們停留在f(2)
。求解方程給出了我們x = 2
。
與大多數遞歸運行時分析一樣,我們試圖獲得運行時間的遞歸公式。我們可以用預期的線性度通過隨機電話進行:
E[T(1)] = 0
E[T(2)] = 1 + (E[T(1)] + E[T(2)])/2 = 2
E[T(n)] = 1 + (E[T(1)] + E[T(2)] + ... E[T(n)])/n
= 1 + (E[T(1)] + E[T(2)] + ... E[T(n-1)])/n + E[T(n)]/n
= 1 + (E[T(n-1)] - 1)(n-1)/n + E[T(n)]/n
因此
E[T(n)](n-1) = n + (E[T(n-1)] - 1)(n-1)
,因此對於n
> 1:
E[T(n)] = 1/(n-1) + E[T(n-1)]
= 1/(n-1) + 1/(n-2) + ... + 1/2 + 2
= Harmonic(n-1) + 1
= O(log n)
這也是我們直觀地可能有預計,因爲n
應該在每個電話f
大約一半。
我們也可以考慮'高概率的最差情況'。爲此,可以很容易地使用馬爾科夫的不等式,其中說P[X <= a*E[X]] >= 1-1/a
。設置a = 100
我們得到99%的可能性,該算法使得調用小於100 * log n
。
因爲rand並沒有被調用,所以n = 1 0時的期望值不是?在這種情況下,這是否重要? – Kolichikov
那麼,你必須做一個電話,其中'如果n = 1然後'分支被採取。 –
@ThomasAhle該問題要求預期的rand()調用次數。我認爲你的分析是正確的(我upvoted),除了細節略有不對 - E(T(1))= 0. –
這功課嗎? –
你提到的是什麼'm'變量? – Matt
這是http://math.stackexchange.com/questions/633459/recursion-with-random-number的完全重複請使用搜索功能或谷歌來查看您的問題是否已在提問之前得到解答。 – m69