一些資料結構的思想 3

2021-09-06 17:21:07 字數 3345 閱讀 1709

假設你希望以各1/2的概率輸出0和1.你可以自由使用乙個輸出0或1的過程biased-random。它以概率p輸出1,以概率1 - p輸出0,其中 0 < p < 1,但是你並不知道p的值。給出乙個利用biased-random作為子程式的演算法,返回乙個無偏向的結果,即以概率1/2返回0,以概率1/2返回1。作為p的函式,你的演算法的期望執行時間是多少?

演算法分析:

已知biased-random可產生0和1,那麼 1 - biased-random也產生1和0,且以1 - p的概率輸出1,以p的概率輸出0。

如果我們將1 - biased-random看做另外乙個函式發生器,和biased-random組合成對被呼叫,有以下結論:

呼叫結果    00      01     10    11

1的個數     0   1      1     2

出現概率   (1-p)*(1-p)  (1-p)*(1-p)  p*p  p*(1-p)

那麼,進行一次呼叫,出現1的個數的期望值為: 0 * (1-p)*(1-p) + 1 * (1-p)*(1-p) + 1 * p*p + 2 * p*(1-p) = 1。進行4次成對呼叫,則1的期望個數為4。為什麼要呼叫4次呢?因為biased-random產生0的概率和 1 - biased-random產生1的概率相等;biased-random產生1的概率和 1 - biased-random產生0的概率相等,那麼4次剛好覆蓋了所有組合對(00,01,10,11),也可進行8次,16次等呼叫。當進行4次成對呼叫後,統計1出現的個數,若小於4次,則返回0;大於4次,則返回1(這裡相當於將4次呼叫封裝為了乙個函式)。但有個問題,等於4次該返回0還是1呢?(因為1的可能次數為0至8)所以,可進行大量成對呼叫,以使單個現象可被忽略。如,進行1024次呼叫,統計1的個數,小於1024返回0,否則返回1。

題目:已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,現在要你構造乙個發生器,使得它構造0和1的概率均為1/2

解決方案:

這是隨機概率發生器的典型題目。

由於需要產生1/2,而用1位0,或1位1無法產生等概率,因此,考慮將隨機數擴充套件成2位:

00   p*p

01  p*(1-p)

10  (1-p)*p

11 (1-p)*(1-p)

有上述分析知道,01和10是等概率的,因此我們只需要產生01和10就行了。

於是可以,遇到00和11就丟棄,只記錄01和10。可以令,01表示0,10表示1,則等概率1/2產生0和1了。

擴充套件:

已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,現在要你構造乙個發生器,使得它構造0和1的概率均為1/2;構造乙個發生器,使得它構造1、2、3的概率均為1/3;...,構造乙個發生器,使得它構造1、2、3、...n的概率均為1/n,要求複雜度最低。

解答:對n=2,認為01表示0、10表示1,等概率,其他情況放棄

對n=3,認為001表示1、010表示2,100表示3,等概率,其他情況放棄

對n=4,認為0001表示1、0010表示2,0100表示3,1000表示4,等概率,其他情況放棄

首先是1/2的情況,我們一次性生成兩個數值,如果是00或者11丟棄,否則留下,01為1,10為0,他們的概率都是p*(1-p)是相等的,所以等概率了。然後是1/n的情況了,我們以5為例,此時我們取x=2,因為c(2x,x)=c(4,2)=6是比5大的最小的x,此時我們就是一次性生成4位二進位制,把1出現個數不是2的都丟棄,這時候剩下六個:0011,0101,0110,1001,1010,1100,取最小的5個,即丟棄1100,那麼我們對於前5個分別編號1到5,這時候他們的概率都是p*p*(1-p)*(1-p)相等了。

關鍵是找那個最小的x,使得c(2x,x)>=n這樣能提公升查詢效率

數學常數最令人著迷的就是,它們常常出現在一些看似與之毫不相干的場合中。 隨便取乙個 0 到 1 之間的數,再加上另乙個 0 到 1 之間的隨機數,然後再加上乙個 0 到 1 之間的隨機數⋯⋯直到和超過 1 為止。乙個有趣的問題:平均需要加多少次,才能讓和超過 1 呢?答案是 e 次。

為了證明這一點,讓我們先來看乙個更簡單的問題:任取兩個 0 到 1 之間的實數,它們的和小於 1 的概率有多大?容易想到,滿足 x+y<1 的點 (x, y) 佔據了正方形 (0, 1)×(0, 1) 的一半面積,因此這兩個實數之和小於 1 的概率就是 1/2 。類似地,三個數之和小於 1 的概率則是 1/6 ,它是平面 x+y+z=1 在單位立方體中截得的乙個三稜錐。這個 1/6 可以利用截面與底面的相似比關係,通過簡單的積分求得:

可以想到,四個 0 到 1 之間的隨機數之和小於 1 的概率就等於四維立方體一角的「體積」,它的「底面」是乙個體積為 1/6 的三維體,在第四維上對其進行積分便可得到其「體積」

∫(0..1) (x^3)*1/6 dx = 1/24

依此類推, n 個隨機數之和不超過 1 的概率就是 1/n! ,反過來 n 個數之和大於 1 的概率就是 1 - 1/n! ,因此加到第 n 個數才剛好超過 1 的概率就是

(1 - 1/n!) - (1 - 1/(n-1)!) = (n-1)/n!

因此,要想讓和超過 1 ,需要累加的期望次數為

∑(n=2..∞) n * (n-1)/n! = ∑(n=1..∞) n/n! = e

求下面函式的返回值(微軟) -- 統計1的個數

int func(int

x)

return

countx;

}

假定x = 9999

答案: 8

思路: 將x轉化為2進製,看含有的1的個數。

注:每執行一次x = x&(x-1),會將x用二進位制表示時最右邊的乙個1變為0,因為x-1將會將該位(x用二進位制表示時最右邊的乙個1)變為0。

判斷乙個數(x)是否是2的n次方

#include int func(int

x)int

main()

注:(1)如果乙個數是2的n次方,那麼這個數用二進位制表示時其最高位為1,其餘位為0。(2)== 優先順序高於&

一些資料結構的思想 3

假設你希望以各1 2的概率輸出0和1.你可以自由使用乙個輸出0或1的過程biased random。它以概率p輸出1,以概率1 p輸出0,其中 0 p 1,但是你並不知道p的值。給出乙個利用biased random作為子程式的演算法,返回乙個無偏向的結果,即以概率1 2返回0,以概率1 2返回1。...

一些資料結構

dir heapq about all builtins cached doc file loader name package spec heapify max heapreplace max siftdown siftdown max siftup siftup max heapify heap...

資料結構的一些筆記

資料結構 1.邏輯結構 書中都是對邏輯結構的討論 幫助理解 人為抽象出來的結構 線性 表 非線性 圖,樹 2.儲存結構 物理結構 幫助理解 資料到底以什麼樣的形式儲存在計算機中 順序 鏈式 線性表1.線性表是最常用且最簡單的一種資料結構 2.在稍微複雜的線性表中,乙個資料元素可以由若干個資料項組成 ...