程序員挑戰(zhàn):如何讓一個技術(shù)小白搞懂二分法檢索?
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)
在向萌新介紹計算機科學(xué)時,教授基本算法可能是很具挑戰(zhàn)性的部分之一。它介于假設(shè)性問題和抽象性思維之間,十分棘手。但或許可以不必這么困難。有一個小眾的觀點:只要能清晰地構(gòu)造問題,任何一位善于思考的人都可以對一個基本算法問題提出優(yōu)秀的解決方案。
不相信嗎?可以找一個朋友試驗一下。我敢打賭,即使他們沒有任何技術(shù)背景,最后他們也能開發(fā)出一個二分法檢索的算法,并且理解這個概念。
傳統(tǒng)意義上的二分法檢索問題
以下是Geeks for Geeks上給出的二分法檢索的定義:“給定一個包含n個元素的排序數(shù)組arr[],編寫一個函數(shù)來搜索arr[]中的給定元素x。”
即使我是軟件工程專業(yè),但讀到這里時依然會頭疼。如果用這么復(fù)雜的語言來講述,聽者保證會一只耳朵進,另一只耳朵出。不要這么做。
構(gòu)造好問題是成功的一半。如果想用一種不那么專業(yè)的方法來提問二分法檢索問題,以下是一種很好的方法:“你有一大盒一模一樣的雞蛋,想要測試這些雞蛋的硬度。假設(shè)你在一棟100層的辦公樓里工作,要找到把雞蛋扔下去還完好無損的最高樓層。如何盡快做到這一點?”
雖然不必完全一致,但在構(gòu)建問題時,應(yīng)該記住下列提示。
技巧1:把問題當(dāng)作與編程無關(guān)的問題來交流
對于非技術(shù)人員來說,計算機科學(xué)是很“可怕”的。相信我,因為我深有其感。曾經(jīng)有一段時間,我對編程的了解僅限于電視節(jié)目中播放的有關(guān)黑客攻擊的片段。我對它一無所知,只能一臉茫然地聽別人解釋什么是程序或算法。
如今,作為一名軟件開發(fā)人員,我意識到編程實際上并沒有第一眼看起來那么難。計算機語法非常有誤導(dǎo)性。無論你是否有技術(shù)背景,只要你善于思考,都可以想出很棒的算法解決方案。
那么我的建議是什么呢?那就是不要講代碼。別把它當(dāng)成是一個編程問題。這會把他們嚇壞的。

技巧2:利用常識
“想象一個嚴(yán)格遞增的整數(shù)值的列表…”等等。信息過載了。你也一樣。我的建議是:不要解釋,讓常識幫你做這件事吧。
是的,二分法檢索要求搜索列表需按照一定的順序和方向排列,但不必用那么多的術(shù)語來表達。
我在構(gòu)造問題時,通過使用一棟建筑來類比,將每個潛在值(樓層數(shù))都控制在一個嚴(yán)格遞減的區(qū)間。因為這是現(xiàn)實世界中人們心照不宣的常識。
每個人都知道,如果東西從高處掉落,重力只會把它拉向一個方向——下方。通過常識,人們知道,如果一樣?xùn)|西從某一樓層摔下還能完好無損,那么在比該樓層低的任何一個樓層也都不會摔碎。
常識能比我們更好地解釋問題,好好利用它。畢竟,每個人都更愿意解決適用于現(xiàn)實世界的問題。
技巧3:避免使用過多的技術(shù)術(shù)語
你是一個軟件工程師或數(shù)學(xué)專業(yè)的學(xué)生,你喜歡用你們復(fù)雜的術(shù)語交流。但和其他領(lǐng)域一樣,你每天都在說的行話對小白來說幾乎毫無意義。就像一個外科醫(yī)生在向病人解釋的時候,會盡可能簡化說明,所以,應(yīng)該盡量避免使用計算機科學(xué)領(lǐng)域特有的行話。
記住,你是在教別人一個概念,而不是炫耀專業(yè)知識或教他們技術(shù)術(shù)語。
避免使用“臨界”等字眼。雖然“臨界值”在算法世界中可能意義重大,但大多數(shù)非技術(shù)人員并不能意識到這一點。你會注意到我在上文中要求的是最高樓層,而不是“臨界樓層”。
應(yīng)該使用簡單的用語,盡可能用能讓非技術(shù)人員聽明白的語言講述。
是的,你可以定義“臨界”這個詞,但這又有什么意義呢。這個詞對于問題本身是不必要的,它只是添加了一個會分散注意力的信息。對于那些有不必要定義的詞,請?zhí)^它們。
此外你會注意到,我構(gòu)建問題時使用的是100層,而不是二分法檢索問題中常用的n層。
計算機科學(xué)家可能習(xí)慣于把每個問題中的“n”看作是概括問題大小的一種方法,但大多數(shù)人認(rèn)為“n”只是問卷中“no”的縮寫。即使用任意值構(gòu)造的問題可能適用于普遍情況,但任意值不會改變問題的本質(zhì)。
如果想讓別人理解一個問題,就給他們一個很好的整數(shù)作為起點,這樣他們的大腦就會專注在這個問題上。而任意數(shù)字很難概念化。讓他們專注于手頭的問題,而非專注于可視化任意值“n”。
除非絕對必要,否則不要將問題普遍化。先解決問題,再根據(jù)需要進行概括。這是我解決任何算法問題的技巧,但對于同完全沒有技術(shù)背景的人交談時,這一點便尤其重要。
小貼士:設(shè)身處地為他們著想
耐心點。做一名你一直想在面試中渴望遇見的那種面試官,在需要時提出提示性問題。
沒有人喜歡待在原地不動,不知道下一步該去哪里,這令人沮喪和尷尬。如果有人陷入困境,請幫助他們。問他們一個問題,讓他們找到正確的方向。或者,如果他們的解決方案是錯誤的,給他們一個不是最優(yōu)的解決方案,而不是直截了當(dāng)?shù)馗嬖V他們答案。
設(shè)身處地為一個沒有技術(shù)背景的人想想,請別人來解決雞蛋掉落的問題會很有意思。你會感到驚訝,原來那么多對編程一無所知的人能解決算法問題。