首先介紹一點數學知識。
事件 a 的指示器隨機變數i
i\i定義為:
i
== \begin 1 \quad 如果a發生\\ 0 \quad 如果a不發生 \end i=]
=pre[i\] = pr\
e[i]=p
r,其中p
rpr\
pr為事件a發生的概率。
期望性質:期望的和等於和的期望,即若x=∑
xix = \sum
x=∑xi
, 則e[∑
xi]=
∑e[x
i]e[\sum] = \sum
e[∑xi
]=∑e
[xi
]僱傭問題:輸入長度為n的陣列 a[0, …, n-1], 其元素數值代表每個人的能力。假定初始時助手的能力為0, 且每次遇到能力高於當前助手能力的人,便辭掉當前助手,並僱傭該人. 每次僱傭需要花費費用c
hc_h
ch,求總費用。
圖示:假設 a = [2, 1, 3].
在上述例子中,一共僱傭了兩次助手,花費為2ch
2c_h
2ch
.上述過程的**如下:
int hire( vector& a)
return cost;
}
在上述**中我們並不關注時間複雜度,反而關注僱傭費用。
最壞情況下,即陣列 a 按順序遞增時,花費最大,為陣列所有元素的和。
下面來關注僱傭問題中,僱傭乙個新助理的期望。
假定應聘者已隨機順序出現,x
ix_i
xi對應第 i 人被僱傭,其指示器隨機變數為:
x i=
i== \begin 1 \quad 第i位被僱傭\\ 0 \quad 第i位未被僱傭 \end
xi=i=
.
pr[xi
]=i1
.又因e [i
]=pr
e[i\] = pr\
e[i]=p
r, 因此e[i
]=1i
e[i\] = \frac
e[i]=i
1.則令x=∑
i=1n
xix = \sum_^x_i
x=∑i=1
nxi
, 有
e [i
]=∑i
=1n1
i=1+
12+.
..+1
ne[i\] = \sum_^ \frac = 1 + \frac + ... + \frac
e[i]=i
=1∑n
i1
=1+2
1+.
..+n
1由調和級數的性質可知,上式結果為:
e [i
]=ln
n+o(
1)e[i\] = lnn + o(1)
e[i]=l
nn+o
(1)即,面試了 n 個應聘者,平均意義上也只僱傭了lnn
lnnln
n個人。
演算法導論 學習問題
演算法導論 裡的counting sort,用c 實現有問題 include include using namespace std void counting sort vector a,vector b,const int k delete c int main for auto index c...
演算法導論 任務排程問題
問題描述 在單處理器上具有期限和懲罰的單位時間任務排程問題 課本p239 實驗要求 1 實現這個問題的貪心演算法 2 將每個 wi 替換為max wi,執行演算法比較結果。解題思路 1.先將任務按照時間懲罰遞減順序進行排序,2.然後用貪心的思想,盡量把懲罰重的任務先放入待完成佇列中。這裡我是用了乙個...
演算法導論筆記 05隨機問題
4 用random 0,1 實現random a,b 這道題的實現思路 這個題目相當於在能隨機生成 0,1 的前提下,要求隨機生成 n b a 1 個整數。1 把要生成的數標記為 a,a 1,a 2,b a 1,b 1,b 2 取最小的 m,使得2 m n 3 通過隨機生成 0,1 的函式生成乙個 ...