Introduction to Algorithm(chapter 5)

這一章主要介紹了概率分析和隨機算法,概率分析就是假設對於不確定的輸入的條件下通過概率分析來得到時間複雜度的一個平均情況。

     對於某些平均情況較好的算法,而對於某些特定輸入條件下時間複雜度較高的情況,可以對輸入進行隨機化來達到平均情況,即對部分地隨機化來達到一個較好的情況。例如對於數組A[1.....n]的輸入,要讓數組中元素隨機排列文中提高兩個方法,1.給A[i]隨機賦予一個優先級R[i],1<R[i]<=n3,然後根據優先級順序來排列數組中各元素,這其中包括一個排序的過程時間爲o(nlogn) 2.是遍歷數組對於A[i],隨機地交換A[i]<->A[i...n]來完成隨機化。

    然後文中介紹了幾種常見的情形:生日悖論,投球等等。

    整體來說就是通過對輸入或其他某些部分進行隨機化來達到一個平均的情況。

    do...while的形式可以應用到很多情況下,例如產生兩個不同的數,往往應用於那麼需要有些不同的情況,例如產生一個集合中尚未包含的數。

    指示器隨機變量的作用在於將一個集合問題平攤到每個個體上,例如對於帽子保管問題,顧客將他的帽子給服務生保管,然後服務生隨機地將帽子還給顧客,那麼顧客得到他原來自己的帽子的人數期望是多少?我們假設最後得到自己帽子的顧客總人數爲X的話,那麼E(X)就是解,對於這個總人數就相當於一個集合或者整體問題,那麼我們利用指示器隨機變量來分解這個問題的話就相當於設Xi =1:顧客i得到自己的帽子,即單獨對每個顧客來討論,這就將一個整體問題分解(平攤)到每個個體上,對個體來討論的話問題往往就容易多了。

    C++中的rand()是一個產生隨機變量的函數,但其實只是僞隨機函數,因爲當seed()設置的值一樣時,產生的隨機數也是一樣的,所以常常可以講當前時間設置成種子值srand(time(NULL))來模擬隨機函數。注意rand()返回的是一個[0,RAND_MAX]間的隨機數,RAND_MAX在機器上是32767,故rand()%number中如果希望返回的值在0~number-1之間的話那麼number是不能大於35527的否則如果利用它來求0-1之間的小數的話例如(rand()%num)/num如果num>32767那麼求的小數就偏小因爲rand()得到的數達不到num-1,舉例來說,num=1000000,那麼rand()返回k=0-32766, k%1000000 仍然等於k, 然後k/1000000那麼就遠小於1了,所以這裏使用rand()時要注意number的值不能大於RAND_MAX(32767)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章