為什么說程序=算法+數據結構!


本文將描述自己對算法的數學表達的理解。將使用提問的方式來引導大家思考,進而對問題一步一步的分析,是一個循序漸進的過程。本文側重講講筆者的看法,沒有什么實質的內容。但我相信,一些看法對於你從事編程工作來說,可能還是有幫助滴。廢話少說,看題!

 

1.      什么是程序的構成?

代碼?編程語言?編譯器?鏈接器?不不不 ……。我想聽到的答案是算法+數據結構

沒有算法的程序,只是一些代碼的堆砌,談不上是一個優秀的軟件(即便一個簡單的單片機流水燈的程序也應該有一個算法,當然可能你覺的太簡單了沒有必要)。傳說!算法是軟件的靈魂。這個還真不是傳說。你看,某某雲音樂對用戶行為進行數據分析並通過一些算法進行個性化推薦,短時間就搶奪了多少的音頻播放終端,廣受用戶歡迎。之所以稱為,算法是軟件的靈魂,得益於好的算法會給軟件帶來的往往都是質的變化,性能都是呈指數倍提高滴

數據結構是什么?不要問我,數據結構用什么實現。因為那都不是事兒!我要告訴大家的是,如果沒有它,你的軟件系統就會變得極其不值錢。甚至於到你開發完成之后,你再也不想理他了。很多年前,我用java編寫了一個類似QQ的軟件,費了好大的勁才把開發完成,實現了低版本QQ的所有聊天功能,發文字、圖片、表情、截圖、文件以及抖動窗口等等。還有群聊功能,推送系統、會員積分系統等,可謂應有盡有。遺憾的是,后期我並不想維護它了,原因是軟件模塊實在難於管理,耦合性大。可能那是我學java的第一個項目,當時只關注語法並沒有過多面向對象的設計,壓根不知道其中的奧秘是沒有合理的數據結構將各個模塊串聯起來管理。看了失敗的例子,大家都知道的一個成功的例子:Linux。Linux數據結構可謂信手拈來。最重要的思想:一切皆文件!看,當所有模塊使用“文件”這個數據結構時,你會發現Linux所有模塊近乎相同。非要說會用數據結構的好處,數數Linux系統的好處就知道了,不必多說。

 

2.      算法

a.      怎么描述一個算法?

通常,我們描述一個算法使用的是偽代碼。例如:

Insertion-sort(A[1, n])

for j = 2 to n

do

   key = A[j]

   i   = j-1

   while i > 0 and A[i] > key

   do

      A[i+1] = A[i]

      i = i-1

   A[i+1] = key

之所以選擇偽代碼是因為簡潔,不需要做一些不必要的定義。一般采用縮進的形式來區分層次關系。值得一提的是,某些編程語言也采用縮進的方式來區分層次關系。但我覺得不如使用“{}”括號來的簡單暴力。也許計算器編程書寫影響不大,但是可能會影響編程書籍的跨頁閱讀。但是對於簡單的程序來說,采用縮進又不失簡約方便,就像用於描述算法。

采用偽代碼的另一個好處,在於不用關心程序的具體實現(也有可能一種算法誕生之后,沒有對應的語言能實現)。算法應當不依賴於某種編程語言的實現,像上面的插入排序算法,不管你使用C、Java還是Python都可以實現。

b.     相同算法間怎么比較?不同算法間又是如何比較?

上面所說,使用偽代碼來描述的算法不依賴於具體編程語言。那么怎么比較C和Java實現的插入排序算法?又怎么比較使用C實現的插入排序算法和歸並排序算法。那有怎么比較使用C實現的歸並排序算法和使用Java實現的插入排序算法。

 

那么怎么比較C和Java實現的插入排序算法?(前提是同一台機器)

不用問阿貴都知道,Java的運行較慢些。原因是Java語言本身使用更多的系統資源用於為用戶提供更好的面向對象特性。注意這句話並不是一味將這個黑鍋扔到Java虛擬機身上,此中緣由此處不再深究。這需要分析語言本身的特性。

 

怎么比較使用C實現的插入排序算法和歸並排序算法?

大家說插入排序算法的時間復雜度是多少?θ(n^2 )  。 歸並排序算法呢?θ(log⁡n )。你說誰快?我只能說n比較大的時候,歸並排序算法更快。這個要分析算法自身的特性。

 

那有怎么比較使用C實現的插入排序算法和使用Java實現的歸並排序算法?

這個問題是上兩個問題的綜合體!滿分100分。A君:你猜我得了多少分。B君:猜完了。A君:多少分?B君:你猜!首先,對於同一算法來說,C實現和Java實現的程序,性能來說差的只是一個常量,Java運行的更慢。對於兩種算法的時間復雜性,我們發現歸並排序算法更快。那么下面等式是否成立呢?

   C語言:          運行快+算法跑得慢=快?

  Java語言:     運行慢+算法跑得快=快?

      為此,我們高數的知識就要用的上了,無窮大+∞!當排序數組的輸入規模很大的時候,即n →+∞,插入排序算法的時間復雜度增長速度遠遠大於歸並排序算法,而因語言差異造成的一丁點影響也會忽略不計。所以最后算法占了主導作用。所以Java實現的歸並排序算法會運行的更快!

3.      數據結構

此內容就不多講。因為我從教材學到的這方面東西也並不多。即使修過“數據結構”相關課程,我也不認為課本的知識能讓大家在數據結構的應用上融會貫通,即使做到有所感悟,我認為這也是難事。原因是目前大家都偏向於關注算法,而對於軟件架構的設計,模塊的耦合分析,程序的可擴展性等這方面內容缺乏深入研究。在這里我就扔下這塊磚(曾經有個體會,先不說,今天寫累了)。希望有大牛大神來為我解答一下數據結構對程序的影響。

 ————————————————————————————————————————————————————————————————————————————

算法比較厲害的~去做大數據分析,數據挖掘,數值分析……!

數據結構比較厲害的~去做軟件架構師、操作系統設計……!

以后,別問人家問你什么職業。別回答成敲代碼的,也不要簡單回答軟件工程師。這樣顯得自己不夠專業。你一定要說清楚你是曾經側重或者精於搞算法或者數據結構的軟件系統建築師(還是碼農~)。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com