演算法導論 僱傭問題

2021-09-26 00:02:50 字數 1795 閱讀 1310

首先介紹一點數學知識。

事件 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

n​xi

​, 有

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 的函式生成乙個 ...