書名: 趣學數據結構作者名: 陳小玉本章字數: 4679字更新時間: 2020-02-14 17:45:01
前言
2017年8月,本著讓更多的人輕松學習算法的初心,我寫作了第一本書《趣學算法》,該書在出版后受到廣大讀者一致好評,在一年內重印了10次,并輸出了繁體版的版權。一位讀者對我說,讀這本書讀到“停不下來”,我又何嘗不是呢?寫書寫到“停不下來”,這是作者和讀者的巨大共鳴!在交流學習算法的同時,越來越多的學生反映數據結構晦澀難懂,問我能不能寫一本《趣學數據結構》。說實在的,寫書是一項極其繁重的工作,每一句話,每一個圖,都需要精心琢磨。正在我猶豫不決之際,一件事情堅定了我寫作本書的信心。
招聘趣事
如果你關注計算機專業招聘試題,會發現越是大型公司,問的問題越基礎,有的甚至問你什么是棧和隊列,反而一些小公司會關心你做過什么系統。從關注點的不同可以看出,大公司更注重基礎扎實和發展潛力,而小公司希望你立刻能夠為其干活。可以這樣比喻:小公司喜歡細而長的竹子,大公司更喜歡碗口粗的竹筍。
我曾經推薦一個學生到某知名公司,沒多久,學生向我說了應聘的事情:“我介紹我開發了企業管理系統、在線商城系統等,沒想到他問我使用了什么數據結構和算法,我懂很多技術,那么多功能我都實現了,他不問,卻問我使用了什么數據結構和算法,你說搞笑不?數據結構和算法我早就忘了,我會開發軟件還不行嗎?”人力資源總監也反饋過來意見:“很搞笑,這個學生做了不少系統,卻說根本沒用到數據結構和算法。”
既然雙方都覺得這是一件搞笑的事情,那么我們就攤開來看,數據結構到底是什么。
撥云見日,看清數據結構
當我們遇到一個實際問題時,首先需要解決兩件事:
(1)如何將數據存儲在計算機中;
(2)用什么方法和策略解決問題。
前者是數據結構,后者是算法。只有數據結構沒有算法,相當于只把數據存儲到計算機中,而沒有有效的方法去處理,就像一幢只有框架的爛尾樓;若只有算法,沒有數據結構,就像沙漠里的海市蜃樓,只不過是空中樓閣罷了。
數據是一切能輸入計算機中的信息的總和,結構是指數據之間的關系。數據結構就是將數據及其之間的關系有效地存儲在計算機中并進行基本操作。算法是對特定問題求解步驟的一種描述,通俗講就是解決問題的方法和策略。
在遇到一個實際問題時,要充分利用自己所學的數據結構,將數據及其之間的關系有效地存儲在計算機中,然后選擇合適的算法策略,并用程序高效地實現。這就是Niklaus Wirth教授所說的:“數據結構+算法=程序”。
為什么要學習數據結構
高校的計算機專業為本科生都開設了數據結構課程,它是計算機學科知識結構的核心和技術體系的基石,在研究生考試中也是必考科目。隨著科學技術的飛速發展,數據結構的基礎性地位不僅沒有動搖,反而因近年來算法工程師的高薪形勢,而得到了業內空前的重視。很多人認為基本的數據結構及操作已經在高級語言(如C++、Java語言)中封裝,棧、隊列、排序、優先隊列等都可以直接調用庫函數,學會怎么調用就好了,為什么要重復“造輪子”?那么到底有沒有必要好好學習數據結構呢?
先看學習數據結構有什么用處。
(1)學習有效存儲數據的方法。很多學生在學習數據結構時,問我要不要把單鏈表插入、刪除背下來?要不合上書就不會寫了。我非常詫異,為什么要背?理工科技術知識很少需要記憶的,是用的,用的!學習知識不能只靠死記硬背,更重要的是學習處理問題的方法。如何有效地存儲數據,不同的數據結構產生什么樣的算法復雜性,有沒有更好的存儲方法提高算法的效率?
(2)處理具有復雜關系的數據。現實中很多具有復雜關系的數據無法通過簡單的庫函數調用實現。如同現在很多芯片高度集成,完全不需要知道芯片內部如何,直接使用就行了。但是,如果在現實中遇到一個復雜問題,現有的芯片根本無法解決,或者一個芯片只能完成其中一個功能,而我們需要的是完成該復雜問題的一個集成芯片,這時就需要運用所學的數據結構知識來高效處理具有復雜關系的數據。
(3)提高算法效率。很多問題的基礎數據結構運行效率較低,需要借助高級數據結構或通過改進數據結構來提高算法效率。
通過學習數據結構,更加準確和深刻地理解不同數據結構之間的共性和聯系,學會選擇和改進數據結構,高效地設計并實現各種算法,這才是數據結構的精髓。
數據結構為什么那么難
網絡上太多的同學吐槽被“虐”,如“滔滔江水連綿不絕”,數據結構太難了!真的很難嗎?其實數據結構只是講了3部分內容:線性結構、樹和圖。到底難在哪里呢?我通過調查,了解到數據結構難學大概有以下4個原因。
(1)無法接受它的描述方式。數據結構的描述大多是抽象的形式,我們習慣了使用自然語言表達,難以接受數據結構的抽象表達。不止一個學生問我,書上的“ElemType”到底是什么類型?運行時怎么經常提示錯誤。它的意思就是“元素類型”,只是這樣來描述,你需要什么類型就寫什么類型,例如int。這樣的表達方式會讓不少人感到崩潰。
(2)不知道它有什么用處。盡管很多人學習數據結構,但目的各不相同。有的人是應付考試,有的人是參加算法競賽需要,而很多人不太清楚學習數據結構有什么用處,迷迷糊糊看書、做題、考試。
(3)體會不到其中的妙處。由于教材、教師等各種因素影響,很多學生沒有體會到數據結構處理數據的妙處,經常為學不會而焦頭爛額,學習重在體會其中的樂趣,有樂趣才有興趣,興趣是最好的驅動力。
(4)語言基礎不好。我一直強調先看圖解,理清思路,再上機。可還是有很多同學已經理解了思路后,因為缺少main函數,輸入/輸出格式不對,缺少括號等各種語言問題卡殼,而這一切都被戴上了“數據結構太難了”的大帽子。
數據結構學習秘籍
在講學習秘籍之前,我們首先了解一下數據結構學習的3種境界。
(1)會數據結構的基本操作。學會各種數據結構的基本操作,即取值、查找、插入、刪除等,是最基礎的要求。先看圖解,理解各種數據結構的定義,操作方法,然后看代碼,嘗試自己動手上機運行,逐漸掌握基本操作。在初學時,要想理解數據結構,一定要學會畫圖。通過畫圖形象表達,能更好地體會其中的數據結構關系。因此,初學階段學習利器是:畫圖、理解、畫圖。
(2)會利用數據結構解決實際問題。在掌握了書中的基本操作之后,就可以嘗試利用數據結構解決一些實際問題了。先學經典應用問題的解決方法,體會數據結構的使用方法,再做題,獨立設計數據結構解決問題。要想熟練應用就必須做大量的題,在做題的過程中體會其中的方法。最好進行專項練習,比如線性表問題、二叉樹問題、圖問題。這一階段的學習利器是:做題、反思、做題。
(3)熟練使用和改進數據結構,優化算法。這是最高境界了,也是學習數據結構的精髓所在,單獨學習數據結構是無法達到這種境界的。數據結構與算法相輔相成,需要在學習算法的過程中慢慢修煉。在學習算法的同時,逐步熟練應用、改進數據結構,慢慢體會不同數據結構和算法策略的算法復雜性,最終學會利用數據結構改進和優化算法。這一階段已經在數據結構之上,可以通過在ACM測試系統上刷各種算法題,體會數據結構在算法設計中的應用。這一階段的學習利器是:刷題、總結、刷題。
本書特色
本書具有五大特色。
(1)完美圖解,通俗易懂。學習數據結構最好的辦法就是畫圖、畫圖、畫圖。本書中的每一個基本操作和演示都有圖解,有了圖解,一切就都變得簡單,迎刃而解。
(2)實例豐富,簡單有趣。本書結合大量實例,講述如何利用數據結構解決實際問題,使復雜難懂的問題變得簡單有趣,給讀者帶來巨大的閱讀樂趣,使讀者在閱讀中不知不覺地學會數據結構知識,體會數據結構的妙處。
(3)深入淺出,透析本質。本書采用簡潔易懂的代碼描述,抓住本質,通俗描述及注釋使代碼更加易懂。本書不僅對數據結構設計和操作描述全面細致,而且有復雜性分析過程。
(4)實戰演練,循序漸進。本書在每一個數據結構講解清楚后,進行實戰演練,使讀者在實戰中體會數據結構的設計和操作,增強自信,從而提高了讀者獨立思考、自己動手實踐的能力。豐富的練習題和思考題及時檢驗對所學知識的掌握情況,為讀者從小問題出發,逐步解決大型復雜性問題奠定基礎。
(5)網絡資源,技術支持。本書為讀者提供本書所有范例程序的源代碼、練習題以及答案解析,這些源代碼可以自由修改編譯,以符合自己的需要。本書提供源代碼執行、調試說明書,提供博客、QQ群技術支持,為讀者答疑解惑。
本書內容
本書包括10章。
· 第1章是基礎知識,介紹數據結構基礎和算法復雜性的計算方法。
· 第2~5章是線性結構,講解線性表、棧和隊列、字符串、數組等的基本操作和應用。
· 第6章是樹形結構,講解樹、二叉樹、線索二叉樹、樹和森林以及樹的經典應用。
· 第7章是圖形結構,講解圖的存儲、遍歷以及圖的經典應用。
· 第8~9章是數據結構的基本應用,講解查找、排序的方法和算法復雜性比較。
· 第10章是高級數據結構及其應用,講解優先隊列、并查集、B-樹、B+樹、紅黑樹等。
本書的每一章中都有大量圖解,并給出數據結構的基本操作,最后結合實例幫助讀者鞏固相關知識點,力求學以致用、舉一反三。
建議和反饋
寫一本書是一項極其瑣碎、繁重的工作,盡管我已經竭力使本書和網絡支持接近完美,但仍然可能存在很多漏洞和瑕疵。歡迎讀者提供關于本書的反饋意見,因為對本書的意見和建議有利于我們改進和提高,以幫助更多的讀者。如果對本書有什么意見和建議,或者有問題需要幫助,可以加入QQ群887694770,也可以致信rainchxy@126.com,我將不勝感激。
感恩與致謝
感謝我的家人和朋友在本書編寫過程中提供的大力支持。感謝人民郵電出版社的張爽編輯認真負責促成本書的早日出版,感謝提供寶貴意見的同事們,感謝提供技術支持的同學們。感恩遇到這么多良師益友!
資源與支持
本書由異步社區出品,社區(https://www.epubit.com/)為您提供相關資源和后續服務。
配套資源
本書提供范例程序源代碼,請在異步社區本書頁面中點擊,跳轉到下載界面,按提示進行操作即可。注意:為保證購書讀者的權益,該操作會給出相關提示,要求輸入提取碼進行驗證。
提交勘誤
作者和編輯盡最大努力來確保書中內容的準確性,但難免會存在疏漏。歡迎您將發現的問題反饋給我們,幫助我們提升圖書的質量。
當您發現錯誤時,請登錄異步社區,按書名搜索,進入本書頁面,點擊“提交勘誤”,輸入勘誤信息,點擊“提交”按鈕即可。本書的作者和編輯會對您提交的勘誤進行審核,確認并接受后,您將獲贈異步社區的100積分。積分可用于在異步社區兌換優惠券、樣書或獎品。

與我們聯系
我們的聯系郵箱是contact@epubit.com.cn。
如果您對本書有任何疑問或建議,請您發郵件給我們,并請在郵件標題中注明本書書名,以便我們更高效地做出反饋。
如果您有興趣出版圖書、錄制教學視頻,或者參與圖書翻譯、技術審校等工作,可以發郵件給我們;有意出版圖書的作者也可以到異步社區在線提交投稿(直接訪問www.epubit.com/selfpublish/submission即可)。
如果您是學校、培訓機構或企業,想批量購買本書或異步社區出版的其他圖書,也可以發郵件給我們。
如果您在網上發現有針對異步社區出品圖書的各種形式的盜版行為,包括對圖書全部或部分內容的非授權傳播,請您將懷疑有侵權行為的鏈接發郵件給我們。您的這一舉動是對作者權益的保護,也是我們持續為您提供有價值的內容的動力之源。
關于異步社區和異步圖書
“異步社區”是人民郵電出版社旗下IT專業圖書社區,致力于出版精品IT技術圖書和相關學習產品,為作譯者提供優質出版服務。異步社區創辦于2015年8月,提供大量精品IT技術圖書和電子書,以及高品質技術文章和視頻課程。更多詳情請訪問異步社區官網https://www.epubit.com。
“異步圖書”是由異步社區編輯團隊策劃出版的精品IT專業圖書的品牌,依托于人民郵電出版社近30年的計算機圖書出版積累和專業編輯團隊,相關圖書在封面上印有異步圖書的LOGO。異步圖書的出版領域包括軟件開發、大數據、AI、測試、前端、網絡技術等。

異步社區

微信服務號
- Web應用系統開發實踐(C#)
- 深入淺出WPF
- 人臉識別原理及算法:動態人臉識別系統研究
- Hands-On C++ Game Animation Programming
- 教孩子學編程:C++入門圖解
- Apache Mesos Essentials
- 數據結構習題解析與實驗指導
- Keras深度學習實戰
- Java網絡編程核心技術詳解(視頻微課版)
- Procedural Content Generation for C++ Game Development
- Scratch3.0趣味編程動手玩:比賽訓練營
- UML2面向對象分析與設計(第2版)
- Machine Learning for Developers
- Practical GIS
- 算法設計與分析:基于C++編程語言的描述