pareto最優解程式 程式設計師如何避免面試被坑?

2021-10-12 18:29:19 字數 2034 閱讀 1354

首先,面試者必須要自信,要能夠像同事討論一樣面對問題,不能用考生對老師的態度,不要假想對方總是出難題來考察你能不能解出來。

我在 facebook 面了大概 200 人,都是面 coding。如果說面試者的本質是乙個搜尋演算法,在指定搜尋空間內尋找題目的解法,那面試官就是乙個搜尋演算法評估演算法,在指定時間內呼叫搜尋演算法然後評估其效能和適應能力。

面試者的工作相對容易理解。給你一道題目,也就是給你乙個搜尋空間和搜尋目標,然後你就搜尋去吧。一開始可能你搜尋到乙個非最優的有效解,例如說暴力解法;然後可能你搜尋到乙個次優解,例如說 o(n) 解法;最後你找到乙個 o(log n) 解法,你認為是最優解了,但實際上沒辦法證明。然後面試官再給你一道題目,這個過程重複下去……

面試官的工作則要複雜一些。面試官是要評估你的搜尋演算法是否足夠好。足夠好的意思是,將來在工作上遇到各種問題,你都能在合理的時間內獲得最優解或次優解。面試官最明顯的資源限制是時間,他只有 45 分鐘的時間來呼叫你這個搜尋演算法,然後就必須給出結論。如果讓你來設計面試官演算法,你會怎樣做呢?

最簡單粗暴的方法當然是把面試官設計為跟 oj 一樣,他內建很多組輸入和輸出,把輸入提供給面試者,然後等待正確的輸出,測算一下消耗的時間。不過問題是面試官只有 45 分鐘,這樣做顯然是不夠的,所以必須把面試官演算法設計得再聰明一下。

例如說,面試官演算法應該去估算面試者演算法在面對某一類搜尋問題時的時間複雜度,如果小資料輸入就證明面試者演算法是 o(n^2) 的話,大資料就不用試了,顯然會超時的。對比到現實中來,有些面試題是設計為有多個小問題的,如果你做到第 n 個小問題時已經花了不少時間,第 n+1 個問題就會被直接 cut 掉,根本不會問你,因為明知道問下去很可能是浪費時間。

又例如說,面試官演算法應該去跟蹤面試者演算法對搜尋空間的遍歷方式,如果確定這個搜尋演算法在特定的情況下會觸發特定的 bug,導致某個分支該剪不剪然後在上面浪費大量時間,那面試官演算法就應該主動把搜尋空間上同類的分支全部剪掉,避免這個 bug 每次觸發時都浪費時間。別忘記了面試官演算法必須在有限時間內評估面試者演算法的效能,已經被鑑定的 bug 就沒必要重複鑑定。對比到現實中來,如果面試者總是想不起來 api 或者公式,那就沒必要再浪費時間讓他回想,之後他在需要用到新的 api 或公式就直接給他,默默記錄下來他不熟悉 api 或公式就是了。

如果面試者演算法在某種輸入上表現出 o(a^n) 的效能怎麼辦?或者說跟蹤其遍歷,發現根本不是在靠近目標。這時候就應該直接終止當前任務,換乙個不同型別的輸入。因為某些面試者確實不擅長解答某些型別的題目,浪費時間給他繼續思考下去是沒有意義的,面試官只是在不停地驗證面試者確實不能解決這類題目而已,所以必須換不同型別的題目繼續觀察。(當然,我們會避免打擊面試者的資訊,所以就算要換題我們也會等到你有點進展的階段,然後說我們對這個結果很滿意,然後再換個話題。)

很多學生不理解的就是,面試官是全程觀察的,因為中國的考試制度從來沒有提供這種經歷。中國的大多數考試都跟 oj 一樣,你只要最終的結果是對的就可以了,沒有人在乎過程是怎樣的。但面試官在乎的其實不是最終的結果,而是你實際工作的方式。面試官想要**的是,假若將來跟你一起工作的話,你這種工作方式的效率高不高。舉個例子來說,有個程式 crash 了,有人從頭開始除錯,有人二分排查,儘管得出來的結果一樣,但從習慣上來說當然後者更好。(當然還有人看一下 log 就能憑經驗說出來估計是呼叫了某個有 bug 的 api,然後 grep 一下所有呼叫該 api 的**就解決了,你不得不承認這種剪枝效率超高,這種經驗很值錢。)

至於刷題,大家都明白這相當於打表嘛。作為面試者演算法,我猜你只會用特定的輸入,所以我提前算好所有這些輸入的正確輸出,你提供搜尋空間我就直奔搜尋目標去。這種行為其實看起來有點可疑,但也不能說你什麼。很多時候輕微調整一下搜尋空間,或者是調整一下對最優解的要求,打表就會失敗,然後就能看到真實性能。

此外上面所說的都是基於面試官非常認真想要做好的情況。當然面試官也有忙的時候,有時候也會心情不好。如果面試官一邊面試一邊開啟電腦忙自己的事情,你基本上就掛了一半了。面試官演算法是要消耗 cpu 的,如果面試官自己不能 100% 專注於觀察面試者,那顯然該為你剪枝的時候沒有剪,讓你重複犯同型別錯誤,沒有主動尋找能夠展現你優勢的場景,結果通常對你不利。

優秀程式設計師如養成

小範圍的選擇一些有用技術,透徹的學習它們,擁抱它們。然後不斷的擴充套件這個範圍。2.理解各種資料結構的優點和缺點,包括它們在記憶體中和在硬碟上的各自表現。3.理解各種演算法的優點和缺點。4.了解你的工作領域。關上電腦,去做你的使用者們在做的事。5.有準備,有願望,有能力在任何時候投入到多種技術層面中...

程式設計師何苦為難程式設計師

職場上有很多辛酸事,很多合夥人出局的故事,很多技術骨幹被裁員的故事。說來模板都類似,曾經是名校畢業,曾經是優秀員工,曾經被領導表揚,曾經業績突出,然而突然有一天,因為種種原因,被裁員了,想申訴,想求解釋,結論是,能力不匹配,未能與企業一起成長云云。這有兩說,一說是企業冷血,卸磨殺驢,嫌棄老人成本太高...

程式設計師表白程式

作為程式設計師,我們時常被外界誤認為很悶 不浪漫 沒創意 等等這一類人,這讓我們實在有些感傷啊,我得為程式設計師吶喊一聲 我們也能可以歡快 浪漫 有創意 朋友,你向女生表白過嗎?這個問題有點兒羞澀,但是我今兒叫你一招 用我們程式設計師的方式表白 呵呵,說到這裡,你可能已經猜到 該不是程式設計序吧?我...