經典數據結構沉思錄(一):數據結構和算法爲什麼這麼重要?

經典數據結構沉思錄(一):數據結構和算法爲什麼這麼重要?

“程序設計 算法 數據結構”是瑞士計算機科學家Niklaus Wirth1976年出版的一本書的書名,很快就成了在計算機工作者之間流傳的一句名言。斗轉星移,儘管新技術方法不斷涌現,這句名言依然煥發着無限的生命力,它藉助面向對象知識的普及,使數據結構技術更加完善和易於使用。由此,也說明了數據結構在計算機學科中的地位和不可替代的獨特作用。

然而,在可視化程序設計的今天,藉助於集成開發環境我們可以很方便、快捷地開發部署應用程序,程序設計似乎不再只是計算機專業的人員的專利,很多人以爲,只要掌握了幾種開發工具就可以成爲編程高手了,其實這是一個誤區。縱然,我們可以很熟練地掌握一門程序設計語言、熟練地運用各種IDE開發應用程序,但是我們寫出的代碼是否是優良的?我們的設計是否合理?代碼執行是否是高效的?代碼風格是否是有美感的?更甚的說我們所寫出代碼的是否是藝術?

在長達幾年的時間內,我總是陷在了一個誤區裏面:即認爲工程能力和算法能力是不相干的兩回事,我們似乎可以很輕鬆地完成一個工程項目,至少我在做一些MIS系統的時候一直都是這麼認爲的,甚至覺得根本不需要所謂的算法或數據結構。當時一直想不通的是爲什麼Google、百度這樣牛的公司卻對ACMer們如此青睞,對於這種招聘的標準感到疑惑不解。爲什麼他們不在技術(多線程、網絡編程、分佈式系統等)上做要求,卻偏偏只關注這麼一小塊的算法設計?

我曾經反覆地告訴自己“程序設計 算法 數據結構”在70年代提出是受限於計算機硬件,當時的內存不足、計算能力不強,程序需要設計足夠精巧細緻。再看當前主流的計算機配置,比70年代的大型機運算能力還要強大,我們好像完全不用擔心算法設計的問題。報着這樣的想法,我向來都不太重視算法,而且工程中對算法的需求並不多。

只是有一天,我突然發現我只是片面地關注其中一個方面,硬件能力是提升了,但同時人們所面對的信息、數據、運算任務的規模也是極大的膨脹了,而且膨脹的規模比硬件本身運算能力提升的規模還要大很多。算法和數據結構不僅沒有貶值,反而比之前那個時代顯得更爲重要。試想,在互聯網迅猛發展的今天,一箇中等規模的企業每天所產生的數據量能達到GB級甚至TB級。要處理這樣的海量數據不是說單純的硬件運算能力上來就解決了的,設計優良的算法和數據結構設計能夠在1分鐘之內完成任務,而一個糟糕的設計則可能需要1個小時的運行。

一般認爲,一個數據結構是由數據元素依據某種邏輯聯繫組織起來的,這種對數據元素間邏輯關係的描述稱爲數據結構。許多大型系統的構造經驗表明,系統實現的困難程度和系統構造的質量都嚴重的依賴於是否選擇了最優的數據結構。許多時候,確定了數據結構後,算法就容易得到了。當然,有些情況下事情也會反過來,我們根據特定算法來選擇數據結構與之適應。算法則可以理解爲有基本運算及規定的運算順序所構成的完整的解題步驟,或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題。

總的來說,數據結構和算法並不是一門教你編程的課,它們可以脫離任何的計算機程序設計語言,而只需要從抽象意義上去概括描述。說的簡單一點,數據結構是一門告訴你數據在計算機裏如何組織的課程,而算法是一門告訴你數據在計算機裏如何運算的課程,前者是結構學、後者是數學。程序設計就像蓋房子,數據結構是磚、瓦,而算法則是設計圖紙。你若想蓋房子首先必須要有原材料(數據結構),但這些原材料並不能自動地蓋起你想要的房子,你必須按照設計圖紙(算法)一磚一瓦地去砌,這樣你才能擁有你想要的房子。數據結構是程序設計這座大廈的基礎,沒有基礎,無論設計有多麼高明,這座大廈不可能建造起來。算法則是程序設計之靈魂,它是程序設計的思想所在,沒有靈魂沒有思想那不叫程序,只是一堆雜亂無章的符號而已。在程序設計中,數據結構就像物質,而算法則是意識,這在哲學上可以理解爲:意識是依賴與物質而存在的,物質是由意識而發展的。雙方相互依賴,缺一不可!

當然最經典的數據結構是有限的,包括線性表、棧、隊列、串、數組、二叉樹、樹、圖、查找表等,而算法則是琳琅滿目的,多種多樣的。就好像數據結構是人體的各種組織、器官,算法則是人的思想。你可以用自己的思想去支配你的身體各個可以運動的器官隨意運動。如果你想吃蘋果,你可以削皮吃,可以帶皮吃,只要你願意,甚至你可以不洗就吃。但無論如何,你的器官還是你的器官,就那麼幾樣,目的只有一個就是吃蘋果,而方式卻是隨心所欲的!這就是算法的靈活性、不固定性。因此可以這樣說:數據結構是死的,而算法是活的。

我花了四年時間才走出這個誤區,值得慶幸的是不算太晚,而我的夢想是要做一名優秀的架構師,缺乏數據結構和算法的深厚功底,很難設計出高水平的具有專業水準的架構和應用,數據結構和算法則是我實現夢想最堅實的基石。現在,也正是我需要開始沉澱的時刻!程序設計這項偉大的工程,教授於我的將不僅僅是技術這麼簡單,我期待它能給我以更深的思考與感悟,激發我對生命的熱愛,對理想的執着,對卓越的追求!

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