提高效率瓶蝴,就要少做事情(二)

吳軍老師的《得到》專欄谷歌方法論中毒返,有幾節(jié)課是講排序算法的。排序舷手,作為算法里面最為基礎(chǔ)的一種拧簸,看似簡單卻非常值得深入研究,并且在研究算法的過程中也能感悟出一些平時做人做事的道理男窟。上周我寫過一篇文章盆赤,算是復(fù)盤學(xué)習(xí)到的最基本的兩種排序算法知識,從最基本的選擇排序和插入排序算法的對比中了解到蝎宇,要想提高做事的效率弟劲,就要盡量少做事情,盡量把握現(xiàn)有條件姥芥,把時間和精力花在最值得投入的地方兔乞。

在這周,我學(xué)習(xí)了更為高級的排序算法,歸并排序和快速排序庸追,這兩種算法在理論上的時間復(fù)雜度為O(nlogn)霍骄,通過數(shù)學(xué)證明能夠證明這種復(fù)雜度是無序數(shù)組排序時間復(fù)雜度最優(yōu)的極限。但在實際應(yīng)用中淡溯,這兩種算法又有自己的問題读整。人們會根據(jù)實際情況對其進行各種適用于特定場合的特殊優(yōu)化處理。通過學(xué)習(xí)咱娶,我除了更加深入了解這兩種排序算法之外米间,更有這樣的感觸:

1、如果能夠根據(jù)實際情況膘侮,對不同的事劃分出不同的優(yōu)先級屈糊,分類進行處理,然后再歸總琼了,效率要比同等對待高得多逻锐。也許這就是從計算機算法的角度詮釋了《高效能人士的七個習(xí)慣》中“要事優(yōu)先”的原理。

2雕薪、不同的情況下昧诱,沒有哪種方法是放之四海而皆準的。沒有高端方法和低端方法之分所袁,實踐是檢驗真理的唯一標(biāo)準盏档,能高效解決問題的就是好方法。

歸并排序算法:自頂向下分解問題燥爷,自底向上合并答案

首先通俗介紹一下歸并算法的原理妆丘。歸并算法本質(zhì)上是不斷將數(shù)組二分的過程。假設(shè)待排序數(shù)組的個數(shù)為8局劲,第一次將數(shù)組從中間分為兩段亡脸,每段長度為4(如果數(shù)組長度為奇數(shù)屯仗,那么就分成長度相差1的兩段);第二次將兩段長度為4的數(shù)組再次二分联逻;第三次將四段長度為2的數(shù)組再次2分毅戈,數(shù)組退化成為8段長度為1的數(shù)組苹丸。請注意,當(dāng)數(shù)組長度為1的時候苇经,它就退化成一個不需要排序的數(shù)組了赘理。接下來,關(guān)鍵的是做“歸并”操作扇单,即先把2個已經(jīng)有序的元素長度為1的“歸并”成長度為2的有序數(shù)組商模。接下來,再把兩段長度為2的有序數(shù)組“歸并”成長度為4的有序數(shù)組。最終施流,再把兩段長度為4的有序數(shù)組“歸并”成最終有序的數(shù)組响疚。因此“歸并排序”本質(zhì)上就是自頂向下分解問題,自底向上合并答案瞪醋。

那么如何把兩段已經(jīng)有序的數(shù)組A和B歸并成一大段有序的數(shù)組呢忿晕?其實也很簡單。這里银受,我們需要首先申請一段長度為兩小段待歸并數(shù)組長度之和的內(nèi)存空間C践盼。首先,比較比較A和B的第一個元素宾巍,誰更小咕幻,就把這個元素拷貝到內(nèi)存空間的第一個。假設(shè)是A的第一個元素更小蜀漆,那么就把A的第一個元素拷貝過去谅河,接下來比較A的第二個元素和B的第一個元素,依次類推确丢。如果A先遍歷完绷耍,即A的元素已經(jīng)全部拷貝到新數(shù)組C中,那么接下來鲜侥,就把B中剩下的元素按B中原封不動的順序拷貝到C中(A褂始、B已經(jīng)有序保證了這樣操作后,C一定是有序的)描函。

最后崎苗,來考慮一下“歸并排序”的時間復(fù)雜度。首先舀寓,上一段介紹的“歸并”過程是一個O(n)復(fù)雜度的操作胆数,因為只需要完成一次遍歷A和B。而層層細分過程互墓,復(fù)雜度是O(logn)(長度為n必尼,求能被多少次二分,因此復(fù)雜度是2為底篡撵,n的對數(shù))判莉。所以總體上的時間復(fù)雜度為O(nlogn)。(數(shù)學(xué)上的證明可以證明這個復(fù)雜度是排序算法的理論最優(yōu))

“歸并排序”的特點是時間復(fù)雜度很“穩(wěn)定”育谬,無論原始數(shù)組是“完全順序”的還是“完全逆序”的券盅,完成排序的時間幾乎是相同的。因為都是反復(fù)從數(shù)組自頂向下二分膛檀,然后從底向上“歸并”锰镀。這樣就導(dǎo)致了當(dāng)數(shù)組元素很少或者只有很少數(shù)據(jù)是逆序的時候娘侍,它所化的時間還比不上之前所提到過的“插入排序”(接近完全順序的情況下插入排序的時間復(fù)雜度接近O(n))。這就說明了數(shù)學(xué)上看似厲害的高級算法在某些場景會“水土不服”互站。

那么如何解決這個問題呢私蕾?一個明顯的改善就是我們其實不需要一直將數(shù)組二分到底。當(dāng)二分到一定程度胡桃,子數(shù)組長度已經(jīng)很短的時候踩叭,就可以考慮用簡單的插入排序了(當(dāng)長度很短時,實際情況中數(shù)組中逆序元素個數(shù)應(yīng)該很少)翠胰。實際情況中容贝,這種“歸并加插入”的算法能顯著提高效率。實踐是檢驗真理的唯一標(biāo)準之景,能高效解決問題的就是好方法斤富。

快速排序算法:將數(shù)組元素分成幾類,區(qū)別對待锻狗,最后合并答案

快速排序的思想是在數(shù)組中隨機選擇一個“排頭兵”满力。然后把數(shù)組分成三部分,把小于這個“排頭兵” 的放在最左側(cè)轻纪,把“排頭兵”放在中間油额,把等于“排頭兵”的數(shù)放中間,把大于“排頭兵”的數(shù)放右邊刻帚,然后再對小于和大于“排頭兵”的兩段數(shù)組進行同樣的操作潦嘶,直到最后把整段數(shù)組排序完畢。

這種把一個復(fù)雜問題先按一定標(biāo)準劃分崇众,再分而治之的思想在解決問題的時候非常有效掂僵。在實際測試中快速排序方法的所用的時間甚至能超過歸并排序,而且快速排序方法不需要為“歸并”而開辟額外的空間顷歌,因此比歸并排序來說能節(jié)省空間锰蓬。根據(jù)實際情況,優(yōu)化“排頭兵”的選擇眯漩,則能夠進一步提高效率互妓。在工程應(yīng)用中,快速排序仍然是使用的最為廣泛的排序算法坤塞。

吳軍老師對快速排序算法有自己獨特的感悟:如果我們講求絕對的公平,對每一個人澈蚌,每一件事都完全平等對待摹芙,那么效率就不可能做得很高。只有允許區(qū)別對待宛瞄,分類處理浮禾,才能做到最整體效率提升最大交胚。就像一所學(xué)校,想要提高整體水平盈电,必須對不同水平的學(xué)生進行“分班”蝴簇,因材施教。而我們?nèi)粘I钪袑Υ考煌氖虑榇抑悖残枰凑找欢ㄒ?guī)則進行分類熬词,比較重要的事情放在一起,很不重要的事情放在一起吸重,這樣才有利于高效處理事情互拾。

計算機算法,看上去是“冷冰冰”的邏輯推理和代碼嚎幸,但實際上也蘊含著不少哲理在里面颜矿。總的原則還是想要提高效率,就得少做事情嫉晶。根據(jù)事情不同的優(yōu)先級骑疆,分輕重緩急進行處理,分而治之替废,能夠顯著提高效率箍铭。同時,還需要根據(jù)實際情況進行變通舶担,高級的方法不代表任何情境下都能取得最好的效果坡疼。實踐是檢驗真理的唯一標(biāo)準。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衣陶,一起剝皮案震驚了整個濱河市柄瑰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剪况,老刑警劉巖教沾,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異译断,居然都是意外死亡授翻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門孙咪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堪唐,“玉大人,你說我怎么就攤上這事翎蹈』床ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵荤堪,是天一觀的道長合陵。 經(jīng)常有香客問我枢赔,道長,這世上最難降的妖魔是什么拥知? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任踏拜,我火速辦了婚禮,結(jié)果婚禮上低剔,老公的妹妹穿的比我還像新娘速梗。我一直安慰自己,他們只是感情好户侥,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布镀琉。 她就那樣靜靜地躺著,像睡著了一般蕊唐。 火紅的嫁衣襯著肌膚如雪屋摔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天替梨,我揣著相機與錄音钓试,去河邊找鬼。 笑死副瀑,一個胖子當(dāng)著我的面吹牛弓熏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糠睡,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挽鞠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狈孔?” 一聲冷哼從身側(cè)響起信认,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎均抽,沒想到半個月后嫁赏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡油挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年潦蝇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深寥。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡攘乒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惋鹅,到底是詐尸還是另有隱情则酝,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布负饲,位于F島的核電站堤魁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏返十。R本人自食惡果不足惜妥泉,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洞坑。 院中可真熱鬧盲链,春花似錦、人聲如沸迟杂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排拷。三九已至侧漓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間监氢,已是汗流浹背布蔗。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浪腐,地道東北人纵揍。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像议街,于是被迫代替她去往敵國和親泽谨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 初級排序算法 排序算法關(guān)注的主要是重新排列數(shù)組元素特漩,其中每個元素都有一個主鍵吧雹。排序算法是將所有元素主鍵按某種方...
    深度沉迷學(xué)習(xí)閱讀 1,408評論 0 1
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序拾稳,而外部排序是因排序的數(shù)據(jù)很大吮炕,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序访得,而外部排序是因排序的數(shù)據(jù)很大龙亲,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,253評論 0 2
  • 時間在每天的忙碌中,悄然而過悍抑,即將告別一個月的寒假鳄炉。這個寒假,你快樂嗎搜骡?你有收獲嗎拂盯? 看到你們一張...
    莒縣四小王厚艷閱讀 209評論 0 0