《快速排序》引發關於演算法的討論

colorfulCat發表於2019-05-15

昨天筆者寫了一篇帖子:

c#實現最簡快速排序,你絕對可以看懂

 

有多個同學共同提到一個問題,實現演算法的過程中,你的記憶體消耗太大,所以演算法沒有任何意義。所以我單獨開一個帖子,對這個質疑進行解釋

 


 

  首先我本人軟體從業5年,學校裡面主修c和c++,畢業後先後接觸和使用的語言有c#,java,python,以及一系列的前端指令碼語言(js、jq)等。不能說自己現在的能力有多麼強,但是基本可以應付目前的開發任務。我個人資質平平,雖然喜歡研究技術,但是自己並不是一個聰明人。

  說一下我自己對演算法的理解:我認為演算法是一個實現目標的過程,追求的是時間成本,也就是計算步驟,對於大家提到的記憶體消耗,我認為本身就不屬於演算法討論的範疇。演算法和程式語言是沒有任何關係的,說白了,程式碼只是實現演算法的工具。你用什麼工具去實現,全憑你個人。

  


 

當然,記憶體消耗也是必須要考慮的,但是我覺得不應該是我們來考慮,或者說全域性來看,這種消耗是值得的。我為什麼這麼說,下面我給出我的幾條理由:

一、程式碼的閱讀成本以及理解成本直接對應著錯誤成本

相信大家有過這個感受,一些優秀的程式碼,自己卻很難讀懂,即使理解了,讓你自己獨立寫出來又會很難,或者過一段時間,你又忘了這段程式碼的意思。這個情況直接導致了你自己根本無法使用這些優秀的程式碼。為什麼?因為從一開始你自己就沒有真正理解,就和我們上學考試一樣,死記硬背之後馬上就忘。當然排除一些聰明的同學理解力確實強,但是很遺憾,大多數人不是!這樣就會導致我們出現大量的錯誤。

 

二、記憶體消耗是我們要考慮的事情嗎?

這個問題的答案是肯定的,每個程式設計師都必須去考慮這個問題。我這裡要給大家補充說的另外一點,這個其實是一個尋找平衡點的事情。眾所眾知,除了彙編和c、c++,大多數語言是不需要我們直接操作記憶體的,像java和c#都有專門的GC去處理這個事情。可以這麼說,它們都在儘量避免我們去操作記憶體。實際上GC在一般情況下是足夠優秀的。當我們在糾結著記憶體消耗的時候,有沒有想過,這一部分記憶體消耗換來的是自己程式碼流暢正確的執行,筆試的時候,輕鬆完成的快感。

 

三、最優的程式碼留給小機靈鬼去做

再回到最開始的問題,演算法是步驟和過程,我們使用程式碼去實現演算法,小機靈鬼的實現方式肯定要比我們普通人更省資源,那麼優化程式碼的事情就交給他們吧,事實上我們在平時的工作中,也不需要你去實現這些演算法,因為這些演算法早就被完美的實現了。而我們自己理解了演算法,並且也可以正確的實現演算法,那麼至少我們是一個懂原理,會使用工具的人。那麼你就是一個優秀的程式設計師。

 

文末:

其實大家說的都對,然後我只是向大家表達一下我對於程式設計的理解。

 

相關文章