4. 怎么選擇合適的算法?
在大多數(shù)情況下,我們面臨的問題并不是找不到算法,而是找到的算法太多了:
雖然搜索引擎會替我們把一部分完全重復(fù)的內(nèi)容過濾掉,但它的能力畢竟有限。這么多算法看得我們眼花繚亂,到底哪個算法更適合我們呢?我們肯定不可能把所有的算法都試一遍,因為我們根本沒有那么多資源和時間。
接下來,我們就需要執(zhí)行元算法中的第二步:選擇算法。也就是從找到的眾多算法中,挑選出最適合自己的算法來執(zhí)行。
我們在前面講過,一個算法在創(chuàng)造出來之后,在不斷地復(fù)制傳播的過程中,會產(chǎn)生很多的變種。除了算法中最核心的步驟外,其他的一切都可能發(fā)生變化。比如 做可樂雞翅 的算法中必然有“放雞翅”和“加入可樂”這兩步,否則就不再是可樂雞翅了。然而配菜、調(diào)料、烹調(diào)時間、烹調(diào)方法……可以組成無數(shù)種組合,也就形成了無數(shù)種大同小異的算法。
只要變種有一定效果,就會流傳開來。效果越好的變種,流傳就越廣。所以別看搜索引擎說它找到了上千萬條內(nèi)容,看起來很嚇人,其實那往往只是幾十種甚至幾種算法變種不斷復(fù)制傳播的結(jié)果。
事實上,搜索引擎顯示的結(jié)果前三頁里,基本就包括了所有普遍流行的算法變種。 我們沒有必要一直翻到最后一頁,看完所有的算法后再作出決定。如果這件事不是特別重要的話,我們完全可以只從第一頁里的內(nèi)容中進(jìn)行挑選。
比如有一個 制作可樂雞翅 的算法是這樣的:
材料
雞翅10只,可樂1瓶,姜,蒜,蔥,鹽,醬油,老抽,料酒
做法
1、雞翅洗凈,用牙簽在雞翅上扎些小洞
2、姜、蒜、小蔥切碎
3、將雞翅放盤內(nèi),再加入切好的姜、蒜、小蔥
4、加入鹽、醬油、老抽、料酒,用手抓均腌制15分鐘
5、鍋內(nèi)倒入食用油小火燒熱
6、將腌制好的雞翅放入鍋內(nèi),煎到兩面呈金黃色
7、加入適量的可樂燒開,可樂和雞翅持平即可
8、用小火燜至湯汁變濃時即可關(guān)火裝盤
拿到一個算法后,怎么知道它是不是適合自己呢?我們可以從三個方面進(jìn)行考察:
1、執(zhí)行效果: 算法執(zhí)行的效果如何?我能接受嗎? 我們需要知道執(zhí)行算法后的效果,這樣對自己將要付出的時間和精力有個合理的預(yù)期。對做可樂雞翅這個例子來說,幾乎每個菜譜都帶有效果圖,你只要判斷圖片是否讓你有食欲就可以了,感覺不好的直接pass掉。除非已經(jīng)沒有其他選擇了,否則不要考慮那些沒有說明執(zhí)行效果的算法。
2、所需條件: 我具備所有的條件嗎?我能補(bǔ)足不具備的條件嗎?它重要嗎? 掃描整個算法,羅列一下執(zhí)行它需要的條件,比如:材料、技能、時間、金錢……然后逐個檢查看自己是不是具備。如果某個條件不具備,我們能不能、愿不愿意付出額外的時間和金錢去交換?在缺失這個條件的情況下執(zhí)行算法,會出大問題嗎?不行的話,那這個算法就只能放棄掉了。比方說你發(fā)現(xiàn)家里沒有姜,僅僅少一味調(diào)料一般來說問題并不大;但是要是沒有可樂,你又不能出去買的話,那就別想做可樂雞翅了。
3、執(zhí)行難度: 算法是否足夠簡單?每個步驟描述是否詳細(xì)?操作起來難嗎? 梳理一遍所有的步驟,看看你是否能清楚地明白每一步具體要做什么。算法應(yīng)該用你能理解的方式來描述和呈現(xiàn),要是有配圖甚至視頻則更好。如果算法里面有一大堆你看不懂的專業(yè)術(shù)語,那這個算法就不太適合你。假如你從來沒做過飯,可能對上面那個算法里的一些名詞(比如:老抽)有點陌生,或者對某些描述感到疑惑(比如:多大的火算小火?)。如果你不請教一下做飯高手或者在網(wǎng)上搜索來搞明白這些問題,在執(zhí)行的過程中很可能就會出問題。
你是想追求最好的效果?還是在有限的條件下完成任務(wù)?還是想盡可能地保證成功率?哪個對你來說最重要?你需要想明白這一點,然后依此安排考察以上三個方面的順序,把最重要的放在最前面。 如果最重要的方面出了問題,我們就不需要再浪費(fèi)時間去考察其他方面了。
把不適合我們的算法都過濾掉之后,往往就只剩下屈指可數(shù)的幾個選擇了。如果你有條件多試幾次的話,不妨把它們都保存下來,挨個試一遍。執(zhí)行過幾個不同的算法變種,你就能理解這個算法最核心的部分是什么,各個變種的區(qū)別和價值在哪里,甚至可以自己開發(fā)出新的變種來。
如果你只有一次嘗試機(jī)會,那么可以兼顧各個方面,選擇綜合表現(xiàn)最好的算法;也可以選擇在你最看重的那個方面上,單項得分最高的算法(執(zhí)行效果最好的 / 所需條件最少的 / 執(zhí)行難度最小的)。
「試一試」
挑一件你從來沒做過的事,然后通過搜索引擎來尋找算法。用上面所述的方法,從搜索結(jié)果前三頁中篩選出適合自己的算法,并確定一個最適合自己的算法,把它保存下來。
5. 怎么做好執(zhí)行算法前的準(zhǔn)備?
在找到合適的算法之后,你可能會覺得勝利已經(jīng)近在眼前了,接下來只要按照算法一步一步地執(zhí)行下去,就能完成目標(biāo)。有點躍躍欲試了嗎?
先別著急,請回憶一下,你有沒有遇到過下面這些情況?
從超市回到家之后,才發(fā)現(xiàn)有樣?xùn)|西忘了買
為了趕時間匆忙行事,結(jié)果不小心把事情搞砸了
打游戲時接了個電話,掛斷之后游戲已經(jīng)輸?shù)袅?br> ……
俗話說:“預(yù)則立,不預(yù)則廢”。以上列出的問題,都是由于 沒有進(jìn)行充分準(zhǔn)備 導(dǎo)致的,也就是說沒有做好元算法中的第三步:事前準(zhǔn)備。我們在執(zhí)行算法之前準(zhǔn)備得越充分,出問題的可能性就越小。那我們應(yīng)該怎么做準(zhǔn)備呢?
1、制作準(zhǔn)備清單
首先,我們應(yīng)該仔細(xì)閱讀算法中每一個步驟,想一想:“如果我要執(zhí)行這一步的話,必須擁有哪些東西?”,然后把所有需要的東西列出一個清單來。千萬不要天真地以為,照算法作者列出來的材料清單來做準(zhǔn)備就行了。因為作者往往會假設(shè)一些東西你肯定有,就沒有放在清單里面。比如在做可樂雞翅的算法中,有這么一步:
5、鍋內(nèi)倒入食用油小火燒熱
很明顯,為了完成這一步,你必須要有鍋和食用油,而材料清單里并沒有。此外想要用火來加熱,就還得有燃?xì)庠罨蛘唠姶艩t。最后,我們可以列出下面的清單來:
材料
雞翅10只,可樂1瓶,油,姜,蒜,蔥,鹽,醬油,老抽,料酒
工具
燃?xì)庠?/ 電磁爐、鍋、鏟子、菜刀、案板、盤子、牙簽
如果不經(jīng)過特殊的訓(xùn)練的話,我們的大腦只能同時記住三到五件事情,當(dāng)有新的事情需要記憶時,之前的事情就會被忘掉。所以我們一定要把清單記錄在可靠的媒介上,比如抄到紙上或者存在手機(jī)里,不要相信自己的記憶!
2、按照清單進(jìn)行準(zhǔn)備,多多益善
接下來,我們就可以按照清單來做準(zhǔn)備工作了。把缺少的東西標(biāo)記出來,然后去超市統(tǒng)一采購。如果有樣?xùn)|西在超市買不到,那就在網(wǎng)上買,也可以問別人借。除此之外,對已經(jīng)有的東西最好也檢查一下,看看數(shù)量夠不夠、能不能用、有沒有損壞……每當(dāng)你 做好了一項準(zhǔn)備,就在清單上做一個標(biāo)記(比如打勾或者劃掉)。
算法越復(fù)雜、需要準(zhǔn)備的東西越多,出現(xiàn)各種意外的可能性就越大。假如你在拿可樂時不小心摔了一跤,一瓶可樂全倒在了地上怎么辦?所以 不管是材料、時間還是金錢,都應(yīng)該盡可能多準(zhǔn)備一些。 就算只需要一瓶可樂,也最好買上兩瓶,剩下了還可以自己喝。如果你計劃一個小時完成,那么至少要準(zhǔn)備上兩三個小時,萬一發(fā)現(xiàn)少了什么東西還可以再去超市買一次……
準(zhǔn)備完成之后,千萬別忘了 再對照清單核對一遍!
3、調(diào)整環(huán)境和自我狀態(tài)
為了更好地執(zhí)行任務(wù),我們還需要 調(diào)整好自己的身體狀態(tài)。每個人都有不同的生理節(jié)奏,有的人早上精力充沛,而有的人到了晚上注意力才能集中起來。越是重要的事,越要安排在自己狀態(tài)最好的時候來做。比如剛剛吃完飯人很容易犯困,這時候就不太適合執(zhí)行需要認(rèn)真思考的任務(wù)。而在開始高強(qiáng)度運(yùn)動之前,則必須做適量的熱身來讓身體做好準(zhǔn)備,以避免受傷。
此外,創(chuàng)造一個免受外界打擾的環(huán)境 也是很有必要的。因為只有集中精力,才能把事做好。假如你正在玩對戰(zhàn)游戲,那么最討厭的事莫過于來電話了。如果你不得不接這個電話,那么很可能會心不在焉,一直想著游戲里的事。等電話掛掉,游戲往往也已經(jīng)輸?shù)袅恕_@種體驗真讓人沮喪,對嗎?
為了避免外部干擾,我們可以在執(zhí)行算法之前,把手機(jī)關(guān)機(jī)或者調(diào)成靜音、鎖上房門或者掛上“請勿打擾”的牌子、去咖啡廳或者圖書館……
最后,如果你沒有任何相關(guān)領(lǐng)域的經(jīng)驗,那么最好能 找一位專業(yè)人士在旁指導(dǎo)。因為只要是人都會犯錯誤,專業(yè)人士不僅可以在你出現(xiàn)問題時及時糾正,也能在你碰到各種意外情況時,提供有效的幫助,避免出現(xiàn)無法挽回的局面。
如果實在找不到有經(jīng)驗的人,也最好能找一個信得過的伙伴來一起做。犯錯誤并不可怕,只要及時發(fā)現(xiàn),采取有效的措施來補(bǔ)救即可。真正可怕的是犯了錯而不自知,等到發(fā)現(xiàn)后為時已晚。更可怕的是明知道自己犯了錯誤,還要一意孤行,往往會釀成大錯。
如果我們做好了充分準(zhǔn)備,提前考慮到了各種意外情況,那么在執(zhí)行算法時心里就會更有底氣,也就更可能取得好的效果。
「試一試」
選擇一個自己從來沒有執(zhí)行過的算法,然后用上面所述的方法來做好執(zhí)行前的準(zhǔn)備工作
(未完待續(xù))