用算法做人生選擇

很有意思的一篇文章,整理在這地方。

糾結是人生永恆的話題。

當我們在面對各種對選擇影響的因素時,如:城市、公司規模、公司性質、薪水、項目、戶口、技術、方向、眼界。。你總會糾結一些東西。

我個人覺得,如果是非計算機科班出身的人不會做選擇,不知道怎麼走也罷了,但是我們計算機科班出身的人是學過算法的,懂算法的人應該是知道怎麼做選擇的。


排序算法


你不可能要所有的東西,所以你只能要你最看重的東西,所以你要知道什麼東西最重要,你就需要對你心內的那些慾望和抱負有清楚的認識,不然,你會在糾結中度過。

所以,在選擇中糾結的人有必要參考一下排序算法。

  •   首先,你最需要參考的就是“冒泡排序”--這種算法的思路就是每次冒泡出一個最大的數。所以,你有必要先問問自己,面對那些影響你選擇的因子,如果你只能要一個的話,你會要哪個?而剩下的都可以放棄。於是,當你把最大的數,一個一個冒泡出來的時候,並用這個決策因子來過濾選項的時候,你就能比較容易地知道你應該選什麼了。這個算法告訴我們,人的雜念越少,就越容易做出選擇。
  • 如果,你可能已經茫然到了怎麼比較兩個決策因子的大小。比如:分不清,工資》業務前景?業務前景》能力提升?那麼你完全沒有辦法進行冒泡法。現在,不妨參考一個“快速排序”的思路--這個算法告訴我們,我們一開始並不需要找到最大的數,我們只需要把價值觀中的某個標準拿出來,然後,把可以滿足這個價值的放到右邊,不能的放到左邊去。比如,你的標準是:工資大於5000元 && 業務前景長於3年的公司,你可以用這個標準來過濾你的選項。然後,你可以再調整這個標準再繼續遞歸下去。這個算法告訴我們,我們的選擇標準越清晰,我們就越容易做出選擇。
這是排序算法中最經典的兩個算法了,面試必考。必須爛熟於心中。你把這個算法用到你的人生選擇中並不是什麼問題,關鍵在於,你是否知道自己想要的是什麼?
排序算法的核心思想就是,讓你幫助你自己認清自己最需要的是什麼,認清自己最想要的是什麼,然後根據這個去選擇。

貪婪算法

所謂貪婪算法,是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇(注意是當前狀態下),從而希望導致結果是最好或最優的算法。貪婪算法最經典的一個例子就是哈夫曼編碼。

對於人類來說,一般人在行爲處事的時候都會用到貪婪算法,
  • 在找零錢的時候,如果要找36元,一般會按這樣的順序找錢,20元、10元、5元、1元。

  • 在過十字路口的時候,要到對角線的那個街區時,我們也會用貪婪算法,哪邊的綠燈先亮了我們就先到那邊去,然後再轉身90度等紅燈再過街。
這樣的例子很多。對於選擇中,大多數人都會選用貪婪算法,因爲這是一個比較簡單的算法,未來太複雜了,只能走一步看一步,在當前的狀況下,做出最有利於自己的判斷和選擇即可。
有的人會貪婪薪水,有的人會貪婪做的項目,有的人會貪婪業務,有的人會貪婪職位,有的人會貪婪自己的興趣。。。這些都沒什麼問題。貪婪算法並沒有錯,雖然不是全局最優解,但其可以讓你找到局部最優解或是次優解。其實,有次優解也不錯了。

貪婪算法基本上是一種急功近利的算法,但是並不代表這種算法不好,如果貪婪的是一種長遠和持續,又未嘗不可呢?

動態規劃

但是我們知道,對於大部分的問題,貪婪法通常都不能找出最優解,因爲他們一般沒有測試所有可能的解。因爲貪婪算法是一種短視的行爲,
只會跟據當前的形式做判斷,也就是過早做決定,因而沒法達到最佳解。
動態規劃和貪婪算法的最大不同是,貪婪算法做出選擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。
動態規劃算法至少告訴我們兩個事:
   1)承前啓後非常重要,當你準備去做遍歷的時候,你的上次的經歷不但能開啓你以後的經歷,而且還能爲後面的經歷所用。你的每一步都沒
有浪費。
   2)是否可以回退也很重要。這意思是——如果你面前有兩個選擇,一個是A公司一個是B公司,如果今天你錯失了B公司,那到你明天還能不能找回來?
比如說:你有兩個offer,一個是Yahoo,一個是Baidu,上述的第一點會讓我們思考,Yahoo和Baidu誰能給我們開啓更大的平臺?上述的第二點告訴我們,是進入Yahoo後如果沒有選好,是否還能回退到Baidu公司?還是進入Baidu公司後能容易回退到Yahoo公司?

Dijkstra最短路徑

最短路徑是一個Greedy + DP的算法。相當經典。這個算法的大意如下:
  1)在初始化的時候,所有的結點都和我是無窮大,默認是達不到的。
  2)從離自己最近的結點開始貪婪。
  3)走過去,看看又能到達什麼樣的結點,計算並更新到所有目標點的距離。
  4)再貪婪與原點最短的結點,如此反覆。
這個算法給我們帶來了一些這樣的啓示:
有朋友和我說過他想成爲一個架構師,或是某技術領域的專家,並會踏踏實實的向這個目標前進,永不放棄。我還是鼓勵了他,但我也告訴他
了這個著名的算法,我說,這個算法告訴你,架構師或某領域的專家對你來說目前的距離是無窮大,他們放在心中,先看看你能夠得着的東西所謂踏實,並不是踏踏實實追求你的目標,而是踏踏實實把你夠得着看得見的就在身邊的東西幹好。我還記得我剛參加工作,從老家出來的時候,從來沒有想過要成爲一個技術牛人,也從沒有想過我的博客會那麼的有影響力,在做自己力所能及,看得見摸得着的事情,我就看見什麼技術就學什麼,學着學着就知道怎麼學更輕鬆,怎麼學更紮實,這也許就是我的最短路徑。
有很多朋友問我要不要學C++,或是問我學Python還是學Ruby,是不是不用學前端,等等。這些朋友告訴我,他們不可能學習多個語言,學了
不用也就忘了,而且術業有專攻。這並沒有什麼不對的,只是我個人覺得,學習一個東西沒有必要只有兩種狀態,一種是不學,另一種是精通。瞭解一個技術其實花不了多少時間,我學C++的目的其實是爲了更懂Java,學TCP/IP協議其實是爲了更懂Socket編程,很多東西都是連通和相輔相成的,學好了C/C++/Unix/TCP等這些基礎技術後,我發現到達別的技術路徑一下縮短了(這就是爲什麼我用兩天時間就可以瞭解Go語言的原因)。這就好像這個算法一樣,算法效率不高,也許達到你的目標,你在一開始花了很長時間,遍歷了很多地方,但是,這也許這就是你的最短路徑。

算法就是Trade-Off

    你根本沒有辦法能得到所有你想得到的東西,任何的選擇都意味着放棄——當你要去獲得一個東西的時候,你總是需要放棄一些東西。人生本
來就是一個蹺蹺板,一頭上,另一頭必然下。這和我們做軟件設計或算法設計一樣,用時間換空間,用空間換時間,還有CAP理論,總是有很多的Trade-Off,正如這個短語的原意一樣——你總是要用某種東西去交易某種東西。
   我們都在用某種東西在交易我們的未來,有的人用自己的努力,有的人用自己的思考,有的人用自己的年輕,有的人用自己的自由,有的人用
自己的價值觀,有的人用自己的道德…… …… 有的人在交換金錢,有的人在交換眼界,有的人在交換經歷,有的人在交換地位,有的人在交換能力,有的人在交換自由,有的人在交換興趣,有的人在交換虛榮心,在交換安逸享樂…… ……
    每個人有每個人的算法,每個算法都有每個算法的purpose,就算大家在用同樣的算法,但是每個人算法中的那些變量、開關和條件都不一樣
,得到的結果也不一樣。我們就是生活在Matrix裏的一段程序,我們每個人的算法決定着我們每個人的選擇,我們的選擇決定了我們的人生。


參考:http://coolshell.cn/articles/8790.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章