学习数据结构有什么用?
當(dāng)我們遇到一個實際問題時,首先需要解決兩件事:
(1)如何將數(shù)據(jù)存儲在計算機中;
(2)用什么方法和策略解決問題。
前者是數(shù)據(jù)結(jié)構(gòu),后者是算法。只有數(shù)據(jù)結(jié)構(gòu)沒有算法,相當(dāng)于只把數(shù)據(jù)存儲到計算機中,而沒有有效的方法去處理,就像一幢只有框架的爛尾樓;若只有算法,沒有數(shù)據(jù)結(jié)構(gòu),就像沙漠里的海市蜃樓,只不過是空中樓閣罷了。
數(shù)據(jù)是一切能輸入計算機中的信息的總和,結(jié)構(gòu)是指數(shù)據(jù)之間的關(guān)系。數(shù)據(jù)結(jié)構(gòu)就是將數(shù)據(jù)及其之間的關(guān)系有效地存儲在計算機中并進行基本操作。算法是對特定問題求解步驟的一種描述,通俗講就是解決問題的方法和策略。
在遇到一個實際問題時,要充分利用自己所學(xué)的數(shù)據(jù)結(jié)構(gòu),將數(shù)據(jù)及其之間的關(guān)系有效地存儲在計算機中,然后選擇合適的算法策略,并用程序高效地實現(xiàn)。這就是Niklaus Wirth教授所說的:“數(shù)據(jù)結(jié)構(gòu)+算法=程序”。
高校的計算機專業(yè)為本科生都開設(shè)了數(shù)據(jù)結(jié)構(gòu)課程,它是計算機學(xué)科知識結(jié)構(gòu)的核心和技術(shù)體系的基石,在研究生考試中也是必考科目。隨著科學(xué)技術(shù)的飛速發(fā)展,數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)性地位不僅沒有動搖,反而因近年來算法工程師的高薪形勢,而得到了業(yè)內(nèi)空前的重視。很多人認為基本的數(shù)據(jù)結(jié)構(gòu)及操作已經(jīng)在高級語言(如C++、Java語言)中封裝,棧、隊列、排序、優(yōu)先隊列等都可以直接調(diào)用庫函數(shù),學(xué)會怎么調(diào)用就好了,為什么要重復(fù)“造輪子”?那么到底有沒有必要好好學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)呢?
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)有什么用
(1)學(xué)習(xí)有效存儲數(shù)據(jù)的方法。很多學(xué)生在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時,問我要不要把單鏈表插入、刪除背下來?要不合上書就不會寫了。我非常詫異,為什么要背?理工科技術(shù)知識很少需要記憶的,是用的,用的!學(xué)習(xí)知識不能只靠死記硬背,更重要的是學(xué)習(xí)處理問題的方法。如何有效地存儲數(shù)據(jù),不同的數(shù)據(jù)結(jié)構(gòu)產(chǎn)生什么樣的算法復(fù)雜性,有沒有更好的存儲方法提高算法的效率?
(2)處理具有復(fù)雜關(guān)系的數(shù)據(jù)。現(xiàn)實中很多具有復(fù)雜關(guān)系的數(shù)據(jù)無法通過簡單的庫函數(shù)調(diào)用實現(xiàn)。如同現(xiàn)在很多芯片高度集成,完全不需要知道芯片內(nèi)部如何,直接使用就行了。但是,如果在現(xiàn)實中遇到一個復(fù)雜問題,現(xiàn)有的芯片根本無法解決,或者一個芯片只能完成其中一個功能,而我們需要的是完成該復(fù)雜問題的一個集成芯片,這時就需要運用所學(xué)的數(shù)據(jù)結(jié)構(gòu)知識來高效處理具有復(fù)雜關(guān)系的數(shù)據(jù)。
(3)提高算法效率。很多問題的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)運行效率較低,需要借助高級數(shù)據(jù)結(jié)構(gòu)或通過改進數(shù)據(jù)結(jié)構(gòu)來提高算法效率。
通過學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),更加準確和深刻地理解不同數(shù)據(jù)結(jié)構(gòu)之間的共性和聯(lián)系,學(xué)會選擇和改進數(shù)據(jù)結(jié)構(gòu),高效地設(shè)計并實現(xiàn)各種算法,這才是數(shù)據(jù)結(jié)構(gòu)的精髓。
數(shù)據(jù)結(jié)構(gòu)為什么那么難
網(wǎng)絡(luò)上太多的同學(xué)吐槽被“虐”,如“滔滔江水連綿不絕”,數(shù)據(jù)結(jié)構(gòu)太難了!真的很難嗎?其實數(shù)據(jù)結(jié)構(gòu)只是講了3部分內(nèi)容:線性結(jié)構(gòu)、樹和圖。到底難在哪里呢?我通過調(diào)查,了解到數(shù)據(jù)結(jié)構(gòu)難學(xué)大概有以下4個原因。
(1)無法接受它的描述方式。數(shù)據(jù)結(jié)構(gòu)的描述大多是抽象的形式,我們習(xí)慣了使用自然語言表達,難以接受數(shù)據(jù)結(jié)構(gòu)的抽象表達。不止一個學(xué)生問我,書上的“ElemType”到底是什么類型?運行時怎么經(jīng)常提示錯誤。它的意思就是“元素類型”,只是這樣來描述,你需要什么類型就寫什么類型,例如int。這樣的表達方式會讓不少人感到崩潰。
(2)不知道它有什么用處。盡管很多人學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),但目的各不相同。有的人是應(yīng)付考試,有的人是參加算法競賽需要,而很多人不太清楚學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)有什么用處,迷迷糊糊看書、做題、考試。
(3)體會不到其中的妙處。由于教材、教師等各種因素影響,很多學(xué)生沒有體會到數(shù)據(jù)結(jié)構(gòu)處理數(shù)據(jù)的妙處,經(jīng)常為學(xué)不會而焦頭爛額,學(xué)習(xí)重在體會其中的樂趣,有樂趣才有興趣,興趣是最好的驅(qū)動力。
(4)語言基礎(chǔ)不好。我一直強調(diào)先看圖解,理清思路,再上機。可還是有很多同學(xué)已經(jīng)理解了思路后,因為缺少main函數(shù),輸入/輸出格式不對,缺少括號等各種語言問題卡殼,而這一切都被戴上了“數(shù)據(jù)結(jié)構(gòu)太難了”的大帽子。
數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)秘籍
在講學(xué)習(xí)秘籍之前,我們首先了解一下數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)的3種境界。
(1)會數(shù)據(jù)結(jié)構(gòu)的基本操作。學(xué)會各種數(shù)據(jù)結(jié)構(gòu)的基本操作,即取值、查找、插入、刪除等,是最基礎(chǔ)的要求。先看圖解,理解各種數(shù)據(jù)結(jié)構(gòu)的定義,操作方法,然后看代碼,嘗試自己動手上機運行,逐漸掌握基本操作。在初學(xué)時,要想理解數(shù)據(jù)結(jié)構(gòu),一定要學(xué)會畫圖。通過畫圖形象表達,能更好地體會其中的數(shù)據(jù)結(jié)構(gòu)關(guān)系。因此,初學(xué)階段學(xué)習(xí)利器是:畫圖、理解、畫圖。
(2)會利用數(shù)據(jù)結(jié)構(gòu)解決實際問題。在掌握了書中的基本操作之后,就可以嘗試利用數(shù)據(jù)結(jié)構(gòu)解決一些實際問題了。先學(xué)經(jīng)典應(yīng)用問題的解決方法,體會數(shù)據(jù)結(jié)構(gòu)的使用方法,再做題,獨立設(shè)計數(shù)據(jù)結(jié)構(gòu)解決問題。要想熟練應(yīng)用就必須做大量的題,在做題的過程中體會其中的方法。最好進行專項練習(xí),比如線性表問題、二叉樹問題、圖問題。這一階段的學(xué)習(xí)利器是:做題、反思、做題。
(3)熟練使用和改進數(shù)據(jù)結(jié)構(gòu),優(yōu)化算法。這是最高境界了,也是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的精髓所在,單獨學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)是無法達到這種境界的。數(shù)據(jù)結(jié)構(gòu)與算法相輔相成,需要在學(xué)習(xí)算法的過程中慢慢修煉。在學(xué)習(xí)算法的同時,逐步熟練應(yīng)用、改進數(shù)據(jù)結(jié)構(gòu),慢慢體會不同數(shù)據(jù)結(jié)構(gòu)和算法策略的算法復(fù)雜性,最終學(xué)會利用數(shù)據(jù)結(jié)構(gòu)改進和優(yōu)化算法。這一階段已經(jīng)在數(shù)據(jù)結(jié)構(gòu)之上,可以通過在ACM測試系統(tǒng)上刷各種算法題,體會數(shù)據(jù)結(jié)構(gòu)在算法設(shè)計中的應(yīng)用。這一階段的學(xué)習(xí)利器是:刷題、總結(jié)、刷題。
數(shù)據(jù)結(jié)構(gòu)與算法書籍推薦
數(shù)據(jù)結(jié)構(gòu)與算法之美(全彩印刷)
一些經(jīng)典的數(shù)據(jù)結(jié)構(gòu)和算法圖書,偏重理論,讀者學(xué)起來可能感覺比較枯燥。一些趣談類的數(shù)據(jù)結(jié)構(gòu)和算法圖書,雖然容易讀懂,但往往內(nèi)容不夠全面。另外,很多數(shù)據(jù)結(jié)構(gòu)和算法圖書缺少真實的開發(fā)場景,讀者很難將理論和實踐相結(jié)合。
為了解決上述問題,本書全面、系統(tǒng)地講解了常用、??嫉臄?shù)據(jù)結(jié)構(gòu)和算法,并結(jié)合 300多幅圖和上百段代碼,讓內(nèi)容變得更加通俗易懂。同時,對于每個知識點,本書結(jié)合真實的應(yīng)用場景進行講解,采用一問一答的講解模式,讓讀者不僅可以掌握理論知識,還可以掌握如何將數(shù)據(jù)結(jié)構(gòu)和算法應(yīng)用到實際的開發(fā)工作中。
本書分為11章。第1章介紹復(fù)雜度分析方法。第2章介紹數(shù)組、鏈表、棧和隊列這些基礎(chǔ)的線性表數(shù)據(jù)結(jié)構(gòu)。第3章介紹遞歸編程技巧、8種經(jīng)典排序、二分查找及二分查找的變體問題。第4章介紹哈希表、位圖、哈希算法和布隆過濾器。第5章介紹樹相關(guān)的數(shù)據(jù)結(jié)構(gòu),包括二叉樹、二叉查找樹、平衡二叉查找樹、遞歸樹和B+樹。第6章介紹堆,以及堆的各種應(yīng)用,包括堆排序、優(yōu)先級隊列、求Top K、求中位數(shù)和求百分位數(shù)。第7章介紹跳表、并查集、線段樹和樹狀數(shù)組這些比較高級的數(shù)據(jù)結(jié)構(gòu)。第8章介紹字符串匹配算法,包括BF算法、RK算法、BM算法、KMP算法、Trie樹和AC自動機。第9章介紹圖及相關(guān)算法,包括深度優(yōu)先搜索、廣度優(yōu)先搜索、拓撲排序、Dijkstra算法、Floyd算法、A*算法、Z小生成樹算法、Z大流算法和Z大二分匹配等。第10章介紹4種算法思想,包括貪心、分治、回溯和動態(tài)規(guī)劃。第11章介紹4個經(jīng)典項目中的數(shù)據(jù)結(jié)構(gòu)和算法的應(yīng)用,包括Redis、搜索引擎、鑒權(quán)限流和短網(wǎng)址服務(wù)。另外,附錄A為書中的思考題的解答。
數(shù)據(jù)結(jié)構(gòu) Python語言描述 第2版
本書主要介紹計算機編程中如下4個主要方面的內(nèi)容。
(1)編程基礎(chǔ)——數(shù)據(jù)類型、控制結(jié)構(gòu)、算法開發(fā)以及通過函數(shù)進行程序設(shè)計,是解決計算機問題所需要掌握的基本思想。本書用Python編程語言介紹這些核心主題,旨在幫助你通過理解這些主題解決更廣泛的問題。
(2)面向?qū)ο缶幊?/strong>——面向?qū)ο缶幊淌怯糜陂_發(fā)大型軟件系統(tǒng)的主要編程范式。本書介紹OOP的基本原理,旨在讓你能夠熟練地應(yīng)用它們。和其他教科書不同,本書會引導(dǎo)你開發(fā)一個專業(yè)的多項集類的框架,以說明這些原理。
(3)數(shù)據(jù)結(jié)構(gòu)——大多數(shù)程序會依賴數(shù)據(jù)結(jié)構(gòu)解決問題。在最具體的層級,數(shù)據(jù)結(jié)構(gòu)包含數(shù)組以及各種類型的鏈接結(jié)構(gòu)。本書介紹如何使用這些數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)各種類型的多項集結(jié)構(gòu)(如棧、隊列、列表、樹、包、集合、字典和圖),還會介紹如何使用復(fù)雜度分析來評估這些多項集的不同,進而實現(xiàn)在時間與空間上的權(quán)衡。
(4)軟件開發(fā)生命周期——本書不會設(shè)單獨的一兩章去介紹軟件開發(fā)技術(shù),而是通過大量的案例全面概述這方面的內(nèi)容。本書還會強調(diào),編寫程序通常并不是解決問題或軟件開發(fā)里最困難或最具挑戰(zhàn)性的部分。
趣學(xué)數(shù)據(jù)結(jié)構(gòu)
本書包括10章。
- 第1章是基礎(chǔ)知識,介紹數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)和算法復(fù)雜性的計算方法。
- 第2~5章是線性結(jié)構(gòu),講解線性表、棧和隊列、字符串、數(shù)組等的基本操作和應(yīng)用。
- 第6章是樹形結(jié)構(gòu),講解樹、二叉樹、線索二叉樹、樹和森林以及樹的經(jīng)典應(yīng)用。
- 第7章是圖形結(jié)構(gòu),講解圖的存儲、遍歷以及圖的經(jīng)典應(yīng)用。
- 第8~9章是數(shù)據(jù)結(jié)構(gòu)的基本應(yīng)用,講解查找、排序的方法和算法復(fù)雜性比較。
- 第10章是高級數(shù)據(jù)結(jié)構(gòu)及其應(yīng)用,講解優(yōu)先隊列、并查集、B-樹、B+樹、紅黑樹等。
本書的每一章中都有大量圖解,并給出數(shù)據(jù)結(jié)構(gòu)的基本操作,最后結(jié)合實例幫助讀者鞏固相關(guān)知識點,力求學(xué)以致用、舉一反三。
總結(jié)
以上是生活随笔為你收集整理的学习数据结构有什么用?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小班中班,随机10以内加法练习题,A4纸
- 下一篇: 广电系统三八红旗集体推荐材料_三八红旗集