原載於:www.zhihu.com/question/33…前端
有不少。面試
我記得《算法導論》裏就有一些頗有意思的例子,驚喜在本文末尾。算法
第五章有一個「僱傭問題」(有刪改)前端工程師
假設你要招一個前端工程師,發現沒有合適的人選。
因而你找了一個獵頭。不是豬頭,是獵頭。
假設獵頭天天給你推薦一個應聘者,你會去面試這我的,而後立刻決定要不要錄用他/她。
假設你每次面試都須要支付給獵頭一筆小費用,若是你決定錄用一我的則須要支付一大筆費用給獵頭的公司。
你能夠今天錄用一我的,而後次日反悔錄用另外一我的,可是這樣你就要付兩大筆錢。
你一旦發現今天的面試者比以前決定錄用的人好,就會改成錄用今天的面試者。學習
前提條件基本是這樣,而後就是分析了。cdn
因爲有多少人你就要面試多少次,因此小費用這一部分無法節省。blog
問題的關鍵就在於如何儘可能減小大費用的支出了。get
最壞狀況分析it
最壞的狀況就是 n 個應聘者的質量逐天遞增,你每次都發現你天天都要花一大筆錢用今天的面試者替換昨天的。這實在是很燒錢。io
機率分析
最壞狀況是很難出現的,咱們應該計算一個平均狀況。
假設 n 個應聘者的水平排名是 1 到 n;
假設這些應聘者出現的順序是隨機的;
那麼面試官面對的就是一個均勻的隨機序列,若是 n 是 3,那麼這些應聘者出現的順序多是
一共有 n! (n的階乘)種狀況。
而後書中利用一些機率公式得出一個結論:只須要錄用
我的(指望值)。這個結果使人疑惑,由於假設有 10 我的來面試,他們的水平依次是 1 2 3 4 5 6 7 8 9 10,顯然咱們的錄用次數會是 9。
的結果倒是 2.3 左右。而後書中說你只須要把應聘者出現的順序隨機化一下,結果就會接近 2.3 了。
到此,第一個例子就完了。這個例子看起來有些不符合實際,由於每錄用一次就付錢那獵頭公司實在是太賺了。
因此書後面又有一個變形的題目:
假設如今咱們不想要面試完全部人而後找一個最好的,也不但願不停地錄用新人換以前錄用的人,
怎麼着呢?咱們但願錄用一個接近最好的應聘者,並且只錄用一次。
假設每次面試後必須立馬告訴錄用結果,不能拖幾天再決定。
請問,如何經過儘可能少的面試次數,錄用水平儘可能高的應聘者呢?
這個題目就很是接近現實生活中的面試了。
書中的面試策略是這樣的:
選擇一個正整數 k < n,面試前 k 個應聘者而後拒絕他們,以後的應聘者只要有一個比前 k 個的最高水平高,就錄用他/她。
而後書中又一頓騷操做,得出 k 的值:n/e 。
也就是說,若是有 100 名隨機出現的應聘者,只須要面試前 37 人,所有拒絕掉,而後只要遇到一個比這 37 人都好的,錄用便可。這樣錄用到最好的應聘者的機率是最高的。
不知道各位是怎麼想的,反正我當時以爲這個腦回路真的是很神奇,竟然還有這種面試方法。
但當我把這個算法放到另外一個領域,就發現了更奇葩的腦回路了。
假設你一輩子中會隨機遇到 n 個異性,你跟ta相遇以後就要決定是跟ta交往仍是不跟ta交往,不能夠劈腿,最終你只能選擇一我的結婚並且只能選一次,請問,你該怎麼選,才能最大可能地選中最合適你的那我的?
答案跟上面的面試策略很像:先依次跟前 n / e 個異性交往,記下其分數,而後所有分手。以後,只要遇到一個比前面都好的異性,就結婚。這是最優解。(固然你也能夠不顧時間、精力和金錢成本跟每一個異性都交往看看,但那不是最優解)
這個策略是否是有點——或者說很是——渣。
可是好像就是事實……假設一個男人在求偶期總共會遇到 10 個女人,那麼 10 / e 的值就是 3.7。這跟非誠勿擾的統計數據很是吻合!非誠勿擾的男嘉賓基本都會說本身曾經有過 3 到 4 段戀情。原來這裏面是有科學依據的呀(大誤)。
另外一個啓發就是,若是你的求偶期已通過了一半了,那麼你可能只能遇到 5 個女人,那麼你的值就是 5 / e 結果是 1.8。也就是說,你談一兩段戀愛以後就結婚是最好的。
那若是你已經出在求偶期的末尾呢?答案是……只要有人願意你就跟ta結婚纔是最好的,別挑了,越挑結果越差。(剩男剩女注意了,敲黑板)
再假設你是王某聰,求偶期遇到的女人是 200 個,那麼,前 74 個都不要選,從第 75 個開始再選。
假設你是個女人,你想嫁給王某聰,你應該儘可能出如今 75 個左右,而且儘可能讓本身的素質高於前面 74 個。這個競爭壓力還真的是很大啊。
最後,這個算法還能夠用來勸導早戀:最先交往的那些異性,確定不是跟你走到最後的人。是否是很虐,哈哈。
以上都是腦洞而已。算法是枯燥的,只有學會苦中做樂,才能深刻學習算法知識。
共勉。
另外說實話,算法導論中的精髓就是那些騷操做,但也是最難懂的,我通常都是直接跳過看代碼。
完。