通過前面的學習我們知道,資料結構並不是一門具體的程式語言,它教會我們的是一種思維方式,即如何以更優的方式儲存資料。或者正是由於這個原因,很多讀者感覺資料結構虛無縹緲,無法觸及,不如學習 Python、Java 等這些程式語言可以隨學隨用、擲地有聲,久而久之覺得學習資料結構沒用。
那麼,資料結構真的無用嗎?當然不是。作為計算機專業最重要的必修學科之一,計算機專業考研的必考知識,以及眾多 IT 公司筆、面試的側重考點,僅僅這些光環,就足以說明學習資料結構的重要性。
毋庸置疑,資料結構不僅有用,更應該是每個程式設計師必須掌握的基本功。
提升程式設計師的邏輯思維
首先,通過學習資料結構,可以大大拓寬我們的思維模式。掌握了資料結構與演算法,我們看待問題的深度、解決問題的角度會大有不同,對於個人邏輯思維的提升,也是質的飛躍。
具體來講,對於同一個問題,資料結構往往會教給我們不只一種解決思路。舉個例子,假設我們需要從眾多資料中查詢出符合要求的元素,多數人就只能借助陣列這種簡單的儲存結構來實現,而通過學習資料結構我們會知道,解決此類問題既可以通過構建二叉排序樹、平衡二元樹、甚至紅黑樹、B+/B- 樹來解決,還可以藉助雜湊表解決。
再舉一個例子,幾乎所有的程式語言中都提供有陣列這種儲存結構,但如果沒學過資料結構,就絕不會想到,陣列還能以連結串列的形式使用(也就是靜態連結串列,後續章節會做詳細講解)。
事實上,資料結構也有眾多程式語言無法比肩的優勢。無論是 Java、Python、C++、PHP 還是其他程式語言,無時無刻不在更新疊代,而資料結構卻永遠不會過時,其包含的儲存資料的思想,已經近乎將所有可能的情況都囊括其中,能解決 99% 的實際場景中有關資料儲存的問題。
能力高低的分水嶺
有很多讀者(其中不乏在職的程式設計師)都會問一個問題,即為什麼很多 IT 公司都特別注重對資料結構的考察?讀者大可以這樣認為:資料結構是眾多 IT 公司評判面試人員能力高低的重要工具。
同任何一門程式語言相比,資料結構確實是晦澀難懂的。舉個簡單的例子,眾多學習資料結構的讀者中,可能很多人都能快速學會連結串列、雜湊表、二元樹,還能熟練運用大部分的查詢演算法和排序演算法,但能玩轉路徑規劃、字串匹配、動態規則等複雜問題的人,卻鳳毛麟角。
因此,要想學好資料結構,不僅要求學員具備良好的程式設計基礎,還必須具有較強的邏輯分析能力和理解能力,甚至還需要具有一定的空間想象能力,可以這麼說,能玩轉資料結構的人,其綜合實力往往都不差。很多大的網際網路公司,更看重的往往不是你精通多少種程式語言,而是綜合能力,更確切地說是解決問題的能力。
有些讀者可能會問,類似 C++ 可以使用 STL 標準庫,Python 程式碼可以使用 Collections 模組等,很多程式語言都可以使用相應的整合資料結構的框架或者模組,直接拿來用不就可以了嗎?
事實上,很多在職程式設計師在開發過程中,都會套用現有的一些整合資料結構的模組或者框架。要知道,適當的使用是可取的,但不能完全依賴,否則知其然而不知其所以然,即便完成再多的專案,也無非是他人程式碼的搬運工,個人能力很快會進入瓶頸期,再無提升的空間。
程式效能好壞的評判標準
對於如何評判一個人程式設計能力的強弱,不同的人有不同的標準,或許是看中他編寫程式碼的可讀性,擴充套件性、是否健壯等等。
我認為,程式碼執行效能的好壞無疑能成為眾多評判標準中的一個。而想編寫出效能高的程式碼,前提是必須知道如何評判程式碼的效能,這就不得不使用資料結構中評判程式碼執行效能的時間複雜性和空間複雜度。
對於某些在職的程式設計師來說,如果覺得資料結構無用,更多可能是因為你接觸的都是一些使用者量很少、需要處理的資料量也很少的小專案,實際開發中更注重實現具體的功能,產品的效能要求並非那麼苛刻。反之,如果你身處像 BAT 這樣的大公司,所開發產品的使用者量往往是千萬級別甚至億級別,需要處理的資料量也往往是 TB 甚至 PB 級別,這時產品的效能將是首要考慮的因素,而資料結構和演算法的意義將會徹底凸顯出來。
別忘了,資料結構也是很多大 IT 公司選拔人才的重要標準。
總結
和學習某一門程式語言不同,隨學即用,常常會帶給你學習的快感。有些知識並非學習了就能立竿見影,但學懂它會讓你有整體的提升,資料結構就是這樣的知識。