大家好,今天和各位談談“吳軍硅谷來信”專欄裡的一篇文章心得。目前世界上已知最好的演算法是什麼呢?在判別“最好”之前,我們要先加入一些限制條件,例如:在一般情況下或是在惡劣情況下的“最好”。吳軍老師舉了北京交通的例子,來說明這兩種情況的差別。
吳軍老師每次到北京,大多住在東三環,因為交通相對其他地方便利。從東三環到機場,在一般情況下,最近的路線是,從三元橋到機場高速公路,約40分鐘。但是,如果東三環出現塞車,就會塞非常久的時間,可能就要變成2個小時。如果要避免遇到塞車這種狀況,另一個選擇方案是,走東四環上第二機場高速,因為比較偏僻,就算遇到事故,也不會完全塞住。正常情況下,東四環會比東三環的方案慢15分鐘;但是在極端情況下,反而會至少快半小時。這說明世界上沒有絕對的最好。
同樣地,電腦演算法也是如此。目前世界上正常情況下,最好的演算法是“快速排序(Quicksort)”演算法。由英國電腦科學家東尼·霍爾(Tony Hoare)在1961年所發表。這種演算法是目前全世界電腦產業界,使用最多的排序演算法。霍爾還因此成為第一位獲得爵士頭銜的科學家。
那麼,快速排序快在哪兒呢?道理很簡單,就是少做事情。其原理大致如下:先在一堆無序的數字中,隨機挑選一個數字做為樞值,假設是53。接下來,將所有的數字依據大於或小於53分成兩堆。這樣一來,這兩堆數字就變得稍微有序一些。
接著,再從兩堆數字中,再各找出一個樞值,假設是4和79。這樣一來,就會出現<4、4-53、53-79、>79,這4小堆。再依序重複做下去,所有數字很快就排序完成。
這種演算法在正常情況下的複雜度,也是N乘以log(N),和歸併排序是同一量級的。但是在工程上,一般情況下,快速排序比歸併排序快2倍左右。因此,在工程上,還是有意義的。
吳軍老師舉學生就學的例子做進一步說明:假設某個學區有2萬名高中生,如果讓他們都到同一所學校上課,再從中挑出優秀的學生排序,這樣的效率一定很低,這就是冒泡排序。如果把2萬人放到10所學校中,再從各學校挑出優秀學生,依序比較這樣會比較有效率許多,這是歸併排序。
如果我們先做出幾個分數界線,依2萬名學生的成續高低分到10所學校去,第1所學生成績最好,第10所最差,再找出優秀的學生,這樣的工作量最小,這就是快速排序的原理。這也是快速排序比歸併排序快的原因。
吳軍老師從快速排序演算法中,悟出生活思維方式的啟發。不管是電腦演算法,或是我們日常生活做事,想要提高效率,就是要少做事情。相對的,效率最低的辦法,通常都是刻意追求所有人的一律平等,不做區分。
這就好比學校裡,一個班級的學生水準相當時,老師教起來就相對容易。因此,依照學生成績分班是有道理的,特別是在資源不足的地方。相反的,如果一個班級裡的學生從0到100分的水準都有,那麼老師就很難教了,就必須投入更多的資源,才能達到全部提升的效果。
對比快速排序和歸併排序2倍的效率差,吳軍老師得到一個啟發。那就是為什麼美國的民營公司的效率,會比政府機關高非常多。美國政府機關和社會要講究民主和平等;但是,美國的民營公司從來不講這一套,公司裡的大事,從來不會和每一位員工商量。行政職務的層級就像是快速排序裡的樞值,有了三六九等,公司才有效率可言。
因此,當一名年輕員工進入公司,一開始從事最低層級工作時,不用指望公司的政策會照顧底層的員工,因為那樣的組織沒有效率。沒效率的組織在競爭中是會被淘汰的。當一家公司垮掉後,任何的理想都只是幻影。因此,每位底層員工所思考的事情,是如何進入更高的層級。
這也是吳軍老師從來不強調底層思維的原因,因為大家將來都是不斷向上提升的,必須要有高層思維。底層思維或是心靈雞湯,基本上和毒藥沒兩樣。如果你還在慶幸自己進了一家,最底層員工領的薪水和總經理差不多的公司,趁年輕趕快離開,因為這樣的公司早晚要垮掉的。
世界上沒有絕對的好,快速排序是在一般情況下最好的演算法。那麼,在極端的情況下,它的複雜度是N平方,和冒泡排序一樣的等級。而歸併排序就算在最差的情況下,也能保證N乘以log(N)的複雜度。當然,電腦工程師們都會先想出一些方法,防止極端的情況發生。
隨著科技進步,有沒有可能發明一種比快速排序更好的演算法呢?從科學上來說,答案是不可能。因為從數學上證明,N個任意亂數的排序,複雜度不可能比N乘以log(N)更低,這是數學給出的極限或者說是邊界。因此,有點數學概念的人就知道,不需要在這方面白費工夫。這就是吳軍老師之前常提到的,在邊界內做事情的原因。
吳軍老師舉以前在騰訊面試工程師的例子:吳軍老師曾經面試過一位電腦科學背景的學生。這位學生總是不相信排序演算法是有極限的,吳軍老師還用數學證明給他看,但是因為他的數學程度有限,所以看不懂。這種人和醉心於發明永動機的人沒什麼兩樣;如果花時間培訓這樣的人,只是在浪費時間和精力。最好的辦法就如同芒格所說的:將這種人排除在組織之外。
本日思考題:從快速排序對於效率的提高,對於你的生活或工作,有得到什麼啟發嗎?
歡迎你的留言,和我一起分享、一起討論,我們下次見。
請先 登入 以發表留言。