程序設(shè)計是計算機(jī)專業(yè)人員十分重要的基本功,是軟件設(shè)計的基礎(chǔ)。然而,程序設(shè)計的基本功并不在程序設(shè)計中,而在程序設(shè)計外。程序設(shè)計課程提供了特定的指令、語法、語句的編寫規(guī)則,學(xué)習(xí)這些規(guī)則僅僅是一種最基礎(chǔ)的編程訓(xùn)練,不能解決如何提高編程能力的問題。這與許多應(yīng)用型普通高校初學(xué)程序設(shè)計課程的學(xué)生反映出來的情況是一致的,
即由于數(shù)學(xué)基礎(chǔ)和物理基礎(chǔ)方面的原因,如果程序設(shè)計中必備的數(shù)理邏輯推理和思維能力不強(qiáng),
就會使這部分學(xué)生普遍感到學(xué)習(xí)程序設(shè)計課程困難,這種困難有可能使
他們對自己的編程能力產(chǎn)生懷疑,從而影響他們對計算機(jī)專業(yè)的認(rèn)同感和歸屬感。
程序設(shè)計是用來解決問題的,解決問題的關(guān)鍵是面對實際問題時有沒有解題思路,
進(jìn)而在解題思路的基礎(chǔ)上找出解決問題的步驟,對其優(yōu)化,最終形成一個解題的算法。在軟件設(shè)計的實踐中,問題千奇百怪,五花八門,沒有一個定式,但迄今為止,大多數(shù)在計算機(jī)領(lǐng)域已經(jīng)出現(xiàn)的問題都有一些共性,有一些相同的數(shù)據(jù)現(xiàn)象。研究這些共性和數(shù)據(jù)現(xiàn)象,尋求解決各類問題的普適算法,可以有效提高編程能力,使得計算機(jī)專業(yè)的學(xué)生喜歡編程、熱愛編程,并具備較強(qiáng)的編程能力,成為一個合格的計算機(jī)專業(yè)人才。在計算機(jī)類專業(yè)課程體系中,數(shù)據(jù)結(jié)構(gòu)就是這樣一門
能夠提供解決具有共性問題的通用方法和有效提高編程能力的基礎(chǔ)性課程。
數(shù)據(jù)結(jié)構(gòu)原本是計算機(jī)類專業(yè)的重要核心基礎(chǔ)課程,近年來,隨著信息技術(shù)的飛速發(fā)展,該課程的重要性已經(jīng)為從事信息技術(shù)及其相關(guān)專業(yè)教學(xué)和研究的同仁所認(rèn)識,F(xiàn)在,數(shù)據(jù)結(jié)構(gòu)已經(jīng)不再是計算機(jī)類專業(yè)獨(dú)有的課程,逐漸演變成我國大學(xué)中許多專業(yè)的重要基礎(chǔ)課,如數(shù)學(xué)類、電子技術(shù)類、信息技術(shù)類等專業(yè)。
我國計算機(jī)類專業(yè)分為科學(xué)研究型、工程技術(shù)開發(fā)型、技術(shù)推廣應(yīng)用型三個層次。本書編寫的深度和難度定位在后兩個層次。本書參考了國內(nèi)外經(jīng)典教材,較全面地組織、安排書中的內(nèi)容; 提供了大量的經(jīng)典算法,并適當(dāng)引入考研典型例題,具有很強(qiáng)的實用性、易讀性、針對性,融入了編者多年的教學(xué)經(jīng)驗和體會; 體系結(jié)構(gòu)科學(xué)合理,內(nèi)容精煉。每章都附有一定量的習(xí)題,其中,部分選自近年來的考研題目,以幫助學(xué)生深入學(xué)習(xí)和理解相關(guān)章節(jié)的內(nèi)容,并為學(xué)生考研提供一定的幫助。
本書第2~9章附有實訓(xùn)部分,對相應(yīng)章節(jié)的教學(xué)內(nèi)容給出實訓(xùn)要求和實訓(xùn)項目,并將一些典型算法作為實訓(xùn)案例,給出了類定義、算法實現(xiàn)的源代碼。讀者可以在Python語言編程環(huán)境下直接運(yùn)行。本書提供了資源包,其他算法可參考本書的資源包。
近年來,隨著大數(shù)據(jù),云計算和人工智能技術(shù)的興起,Python語言成為流行的編程語言,一些高校的計算機(jī)類專業(yè)開始引入Python作為程序設(shè)計入門語言,因此,用Python語言描述的數(shù)據(jù)結(jié)構(gòu)、算法設(shè)計與分析等課程成為教學(xué)需求。在此背景下,我們編寫了本書。
本書共分10章,分別為緒論、線性表、
棧和隊列、串、數(shù)組和廣義表、
樹與二叉樹、圖、查找、排序以及文件。
第1章概述數(shù)據(jù)結(jié)構(gòu)可能涉及的內(nèi)容和分析方法,講述了算法和程序的差異、算法的評價
與分析等問題。
第2~5章講述線性表結(jié)構(gòu)、特殊線性表棧和隊列、串、數(shù)組與廣義表。從順序存儲結(jié)構(gòu)和鏈表結(jié)構(gòu)兩個方面來闡述線性表的存儲結(jié)構(gòu)和建立在存儲結(jié)構(gòu)上的算法設(shè)計,以及線性表的廣泛應(yīng)用,如棧、隊列、串、數(shù)組、廣義表等,并進(jìn)一步討論了這些數(shù)據(jù)結(jié)構(gòu)的應(yīng)用,如程序調(diào)用、皇后問題、火車編組問題等。
第6章主要討論樹。介紹了樹的性質(zhì)、
存儲結(jié)構(gòu)和基本運(yùn)算。討論了二叉樹的創(chuàng)建,前序、中序、后序、層次和歐拉遍歷算法,以及二叉樹的其他問題。還討論了線索二叉樹及其應(yīng)用、哈夫曼樹和哈夫曼編碼、二叉排序樹、平衡二叉樹、二叉表示樹、判定樹等問題。
第7章討論圖。內(nèi)容包括圖的定義、圖的存儲結(jié)構(gòu)
、圖的遍歷和圖的連通分量、最小生成樹、最短路徑、拓?fù)渑判蚝完P(guān)鍵路徑等。
第8章和第9章討論目前常見的查找算法和排序算法。在查找算法中,從靜態(tài)查找表、動態(tài)查找表和哈希表三方面來研究查找算法。靜態(tài)查找表的數(shù)據(jù)結(jié)構(gòu)是線性表,動態(tài)查找表主要有二叉樹查找、B樹查找等,哈希表的構(gòu)造和查找則用哈希算法來實現(xiàn)。在排序算法中分為內(nèi)排序和外排序兩部分: 內(nèi)排序中主要討論了插入排序、交換排序、選擇排序、歸并排序和基數(shù)排序等經(jīng)典的排序算法; 外排序討論了磁盤排序、勝者樹和敗者樹、最佳歸并樹和磁帶排序等。
第10章討論了文件。從文件的存儲結(jié)構(gòu)入手討論文件的管理,介紹了順序文件、索引文件、索引順序文件、散列文件、多關(guān)鍵字文件等。
上述內(nèi)容涵蓋了目前國內(nèi)數(shù)據(jù)結(jié)構(gòu)教材的幾乎所有內(nèi)容,有的進(jìn)行了深入的討論,有的比較初步,這與本書編寫的指導(dǎo)思想有關(guān)。
本書由王震江任主編,王勇剛、萬英、楊七九、和添錦任副主編。其中,全書的基本內(nèi)容由王震江編寫,萬英編寫了第1~3章的代碼,王勇剛編寫了第4、6、7章的代碼,和添錦編寫了第5章的代碼,楊七九編寫了第8章的代碼,王震江編寫了第9章的代碼。王震江對全書進(jìn)行了統(tǒng)稿和審查,統(tǒng)一了圖例,并統(tǒng)一編寫了實訓(xùn)內(nèi)容和要求。書中提供的算法全部通過了上機(jī)調(diào)試。
由于作者水平有限,編寫倉促,書中難免存在疏漏之處,敬請讀者不吝賜教。
本書配套教學(xué)大綱、PPT課件、思政內(nèi)容、微課視頻等豐富的教學(xué)資料。讀者掃描本書封底文泉課堂涂層下的二維碼并綁定微信賬號后,即可觀看視頻。其他教學(xué)資源(教學(xué)大綱、思政內(nèi)容、課件等)可以從清華大學(xué)出版社官方微信公眾號書圈(itshuquan)下載。
編者
2022年1月
于麗江
第1章緒論
1.1數(shù)據(jù)結(jié)構(gòu)概述
1.1.1引言
1.1.2數(shù)據(jù)結(jié)構(gòu)有關(guān)概念及術(shù)語
1.1.3數(shù)據(jù)類型
1.2算法描述與實現(xiàn)
1.2.1算法的概念與特性
1.2.2算法的設(shè)計與實現(xiàn)
1.3算法的評價與分析
1.3.1評價標(biāo)準(zhǔn)
1.3.2算法的時間復(fù)雜性
1.3.3算法的空間復(fù)雜性
本章小結(jié)
習(xí)題1
第2章線性表
2.1線性表的基本概念
2.1.1線性表的定義
2.1.2線性表的存儲結(jié)構(gòu)
2.1.3線性表的運(yùn)算
2.2順序表
2.2.1順序表的定義
2.2.2順序表的運(yùn)算
2.2.3遍歷
2.2.4順序存儲的物理位置
2.2.5線性表的順序存儲的主要特點(diǎn)
2.3鏈表
2.3.1單鏈表的定義與創(chuàng)建
2.3.2單鏈表的基本運(yùn)算
2.3.3循環(huán)單鏈表
2.3.4雙向鏈表
2.4順序表和鏈表的比較
2.5鏈表的應(yīng)用
本章小結(jié)
習(xí)題2
實訓(xùn)
第3章棧和隊列
3.1棧
3.1.1棧的定義及其運(yùn)算
3.1.2棧的順序存儲結(jié)構(gòu)
3.1.3棧的鏈?zhǔn)酱鎯Y(jié)構(gòu)
3.2棧的應(yīng)用
3.2.1數(shù)制轉(zhuǎn)換
3.2.2算術(shù)表達(dá)式轉(zhuǎn)換
3.2.3子程序調(diào)用
3.2.4遞歸調(diào)用
3.2.5序列進(jìn)出棧的排列問題
3.3隊列
3.3.1隊列的定義及運(yùn)算
3.3.2隊列的順序存儲結(jié)構(gòu)
3.3.3隊列的鏈?zhǔn)酱鎯Y(jié)構(gòu)
3.3.4隊列的應(yīng)用
本章小結(jié)
習(xí)題3
實訓(xùn)
第4章串
4.1串的基本概念
4.2串的存儲結(jié)構(gòu)
4.2.1串的順序存儲
4.2.2串的鏈表存儲
4.3串的運(yùn)算
4.3.1串的基本運(yùn)算
4.3.2串的簡單模式匹配
4.3.3KnuthMorrisPratt算法
本章小結(jié)
習(xí)題4
實訓(xùn)
第5章數(shù)組和廣義表
5.1數(shù)組的基本概念
5.1.1數(shù)組的概念
5.1.2數(shù)組的順序存儲結(jié)構(gòu)
5.1.3特殊矩陣的壓縮存儲
5.2稀疏矩陣
5.3數(shù)組的應(yīng)用
5.4廣義表
5.4.1廣義表的定義
5.4.2廣義表的存儲結(jié)構(gòu)
5.4.3廣義表的運(yùn)算
本章小結(jié)
習(xí)題5
實訓(xùn)
第6章樹與二叉樹
6.1樹
6.1.1樹的定義
6.1.2樹的常用術(shù)語
6.1.3樹的邏輯表示
6.1.4樹的性質(zhì)
6.1.5樹的存儲結(jié)構(gòu)
6.1.6樹的基本運(yùn)算
6.2二叉樹
6.2.1二叉樹的定義
6.2.2二叉樹的性質(zhì)
6.2.3二叉樹的存儲結(jié)構(gòu)
6.2.4遍歷二叉樹
6.2.5二叉樹的構(gòu)造
6.2.6二叉樹的計數(shù)
6.3二叉樹的線索化
6.3.1線索二叉樹的概念
6.3.2構(gòu)造中序線索二叉樹
6.3.3在中序線索樹上的操作
6.4二叉樹、樹、森林
6.4.1樹與二叉樹之間的轉(zhuǎn)換
6.4.2森林與二叉樹的轉(zhuǎn)換
6.5哈夫曼樹
6.5.1哈夫曼樹的定義
6.5.2哈夫曼樹的應(yīng)用
6.6其他樹
6.6.1二叉排序樹
6.6.2平衡二叉樹
6.6.3二叉表示樹
6.6.4判定樹
本章小結(jié)
習(xí)題6
實訓(xùn)
第7章圖
7.1圖的定義與基本術(shù)語
7.1.1圖的定義
7.1.2圖的基本術(shù)語
7.2圖的存儲結(jié)構(gòu)
7.2.1鄰接矩陣
7.2.2鄰接表
7.3圖的遍歷和圖的連通分量
7.3.1深度優(yōu)先搜索遍歷
7.3.2廣度優(yōu)先搜索遍歷
7.3.3非連通圖的遍歷
7.4最小生成樹
7.4.1普里姆算法
7.4.2克魯斯卡爾算法
7.5最短路徑
7.5.1從一個源點(diǎn)到其他各點(diǎn)的最短路徑
7.5.2任意一對頂點(diǎn)之間的最短路徑
7.6有向無環(huán)圖的應(yīng)用
7.6.1拓?fù)渑判?/p>
7.6.2關(guān)鍵路徑
本章小結(jié)
習(xí)題7
實訓(xùn)
第8章查找
8.1查找的基本概念
8.2靜態(tài)查找表
8.2.1順序查找
8.2.2二分查找
8.2.3索引查找
8.2.4線性表查找方法的比較
8.3動態(tài)查找表
8.3.1二叉排序樹
8.3.2平衡二叉樹
8.3.3B-樹和B 樹
8.4哈希表及其查找
8.4.1哈希表與哈希函數(shù)
8.4.2構(gòu)造哈希函數(shù)的常用方法
8.4.3解決沖突的主要方法
8.4.4哈希表上的運(yùn)算
8.4.5哈希表的性能分析
本章小結(jié)
習(xí)題8
實訓(xùn)
第9章排序
9.1排序的基本概念
9.2插入排序
9.2.1直接插入排序
9.2.2折半插入排序
9.2.3希爾排序
9.3交換排序
9.3.1冒泡排序
9.3.2快速排序
9.4選擇排序
9.4.1直接選擇排序
9.4.2堆排序
9.5歸并排序
9.6基數(shù)排序
9.6.1基數(shù)排序的概念
9.6.2基數(shù)排序方法
9.6.3基數(shù)排序算法實現(xiàn)
9.7各種內(nèi)排序算法的性能比較和選擇
9.8外排序
9.8.1磁盤排序
9.8.2勝者樹和敗者樹
9.8.3最佳歸并樹
9.8.4磁帶排序
本章小結(jié)
習(xí)題9
實訓(xùn)
第10章文件
10.1文件的基本概念
10.2順序文件
10.3索引文件
10.4索引順序文件
10.5直接存取文件
10.6多關(guān)鍵字文件
本章小結(jié)
習(xí)題10
參考文獻(xiàn)