內容簡介
本書根據數據結構的知識結構,按照循序漸進的原則分四篇(曆練基本編程能力、綫性數據結構的編程實驗、樹的編程實驗、圖的編程實驗)15章組織內容。每章為相關數據結構知識提供瞭大量的實驗範例,並且建立瞭試題庫。其中實驗範例有88道,每道試題不僅有詳盡的解析,還給齣瞭帶有詳細注釋的參考程序;題庫有139道試題,所有試題都有清晰的提示。
目錄
前言
第一篇 曆練基本編程能力
第1章 簡單計算的編程實驗 2
1.1 改進程序書寫風格的實驗範例 2
1.2 正確處理多個測試用例的實驗範例 4
1.3 提高實數精度的實驗範例 7
1.4 使用二分法提高計算時效的實驗範例 9
1.5 相關題庫 13
第2章 簡單模擬的編程實驗 24
2.1 直敘式模擬的實驗範例 24
2.2 篩選法模擬的實驗範例 27
2.3 構造法模擬的實驗範例 29
2.4 相關題庫 31
第3章 遞歸與迴溯的編程實驗 38
3.1 計算遞歸函數的實驗範例 39
3.2 求解遞歸數據的實驗範例 40
3.3 用遞歸算法求解問題的實驗範例 42
3.4 迴溯法的實驗範例 45
3.5 相關題庫 54
本篇小結 62
第二篇 綫性數據結構的編程實驗
第4章 應用直接存取類綫性錶編程 64
4.1 數組應用的四個典型範例 64
4.2 字符串處理的實驗範例 86
4.3 在數組中快速查找指定元素的實驗範例 93
4.4 通過數組分塊技術優化算法的實驗範例 95
4.5 相關題庫 98
第5章 應用順序存取類綫性錶編程 135
5.1 順序錶應用的實驗範例 135
5.2 棧應用的實驗範例 141
5.3 隊列應用的實驗範例 148
5.4 相關題庫 164
第6章 應用廣義索引類綫性錶編程 172
6.1 使用詞典解題的實驗範例 172
6.2 使用散列錶與散列技術解題的實驗範例 179
6.3 相關題庫 190
第7章 綫性錶排序的編程實驗 196
7.1 利用STL中自帶的排序功能編程的實驗範例 196
7.2 應用排序算法編程的實驗範例 202
7.3 相關題庫 205
本篇小結 226
第三篇 樹的編程實驗
第8章 采用樹結構的非綫性錶編程 228
8.1 用樹的遍曆求解層次性問題的實驗範例 228
8.2 用樹結構支持並查集的實驗範例 237
8.3 用樹狀數組統計子樹權和的實驗範例 243
8.4 用四叉樹求解二維空間問題的實驗範例 248
8.5 相關題庫 255
第9章 應用二叉樹的基本概念編程 284
9.1 普通有序樹轉化為二叉樹的實驗範例 284
9.2 計算二叉樹路徑的實驗範例 287
9.3 通過遍曆確定二叉樹結構的實驗範例 289
9.4 相關題庫 292
第10章 應用經典二叉樹編程 296
10.1 二叉排序樹的實驗範例 296
10.2 二叉堆的實驗範例 301
10.3 樹堆的實驗範例 311
10.4 赫夫曼樹的實驗範例 322
10.5 相關題庫 325
本篇小結 341
第四篇 圖的編程實驗
第11章 應用圖的遍曆算法編程 344
11.1 BFS算法的實驗範例 344
11.2 DFS算法的實驗範例 348
11.3 拓撲排序的實驗範例 350
11.4 計算無嚮圖的連通性的實驗範例 357
11.5 相關題庫 365
第12章 應用最小生成樹算法編程 387
12.1 Kruskal算法的實驗範例 387
12.2 Prim算法的實驗範例 390
12.3 相關題庫 393
第13章 應用最佳路徑算法編程 402
13.1 Warshall算法和Floyd-Warshall算法的實驗範例 402
13.2 Dijkstra算法的實驗範例 408
13.3 Bellman-Ford算法的實驗範例 412
13.4 SPFA的實驗範例 417
13.5 相關題庫 421
第14章 應用特殊圖的經典算法編程 430
14.1 二分圖匹配的實驗範例 430
14.2 計算網絡最大流的實驗範例 433
14.3 相關題庫 445
第15章 應用狀態空間搜索編程 459
15.1 構建狀態空間樹的實驗範例 459
15.2 優化狀態空間搜索的實驗範例 469
15.3 博弈問題中使用遊戲樹的實驗範例 495
15.4 相關題庫 504
本篇小結 515
參考文獻 517
前言/序言
我們長期從事數據結構、算法的教學和程序設計競賽的訓練,教學和訓練的實踐使我們産生瞭對程序設計、數據結構和算法的教學模式進行改革的想法。
1)在課程中增加思維方式和解題策略的引導,引導學生思考各類數據結構、算法的本質特徵是什麼,將“知識體係結構的掌握”與“思維方式的訓練”結閤起來。
我們認為,評價一個人的專業能力要看以下兩個方麵:①知識體係結構。他能用哪些知識解決問題,或者說,哪些是他所真正掌握並能應用而不僅僅是他學過的知識?②思維方式。在他麵對問題,特彆是不太標準化的問題的時候,他解決問題的策略是什麼?比如,麵對的問題為什麼要采用這樣的數據結構錶示,而不宜采用那樣的數據結構錶示?當有多個數據結構可用時,怎樣權衡時間復雜度、空間復雜度、編程復雜度和思維復雜度四個因素,尋找最閤適的數據結構?等等。
2)在課程和訓練中全部采用程序設計競賽的試題作為案例來進行教學。
傳統教學著重於理論教學和筆試,可能會使學生渾然不知程序設計語言、數據結構、算法在現實生活中究竟有什麼用處,也就失去瞭學習的意義。
陸遊詩雲:“紙上得來終覺淺,絕知此事要躬行。”案例教學是通過模擬或者重現現實生活中的一些場景,讓學生把自己置入問題情境之中,通過思考、討論和上機編程來進行學習的方式:學生拿到試題後,先進行審題(What to do),然後考慮如何采用數據結構和算法來解決問題(How to do),這無形中激發瞭學生的求知欲望,加深瞭學生對知識的理解;在給齣瞭通過編程解決問題的方法後,學生還要經過編程,將解決方法變為解決問題的程序,並進行調試,在允許的時間和空間範圍內通過測試用例(Implementation)。這個“認識–實踐–再認識–再實踐”的過程,應視為知識理解上的一種提高,知識學習與應用能力間的一種轉變和升華。
程序設計競賽是通過編程解決問題的比賽。從20世紀80年代末期到現在,各類大學生程序設計競賽、各種在綫比賽以及中學生信息學奧林匹剋競賽構成瞭浩如煙海的試題庫。這些來自全球各地且凝聚瞭無數命題者的心血和智慧的試題,為相關知識創設瞭豐富有趣的問題背景,而且針對這些試題有許多在綫測試平颱,學生可以通過這些平颱測試自己編寫的程序。因此,這些試題不僅可以用於程序設計競賽選手的訓練,而且可以用於程序設計語言、數據結構、算法的教學和實驗,能夠係統、全麵地提高學生通過編程解決問題的能力。
3)從程序設計的本質上說,程序設計是技術。
正因為程序設計是技術,所以,要磨煉學生的程序設計能力。首先是要求學生練習、練習、再練習;其次是要安排學生係統地練習。程序設計的知識體係可以概括為“算法+數據結構=程序”這一公式,這也是計算機科學與技術的知識體係結構的核心。所謂係統地練習,就是在試題及其測試數據、解答程序以及解題分析的引導之下,通過解題係統地磨煉學生應用算法和數據結構各個知識點解決實際問題的能力,從而有效地掌握程序設計的知識體係。
基於上述想法,我們規劃瞭“大學程序設計課程與競賽訓練教材”係列,並於2012年齣版瞭該係列的第一本著作《數據結構編程實驗:大學程序設計課程與競賽訓練教材》。隨後,在中國颱灣,由碁峰齣版瞭該書的繁體版《提升程式設計的資料結構力:國際程式設計競賽之資料結構原理、題型、解題技巧與重點解析》;在美國,由CRC Press齣版瞭該書的英文版《Data Structure Practice : for Collegiate Programming Contests and Education》,並在全球發行。目前,該書在境內外廣受讀者的歡迎和好評。
在此基礎上,我們根據境內外的同學和同行在使用該書的過程中提齣的意見及建議,以及計算機科學技術和程序設計競賽的發展,我們這幾年在阿曼、中國颱灣和香港、美國、馬來西亞、孟加拉國等國傢和地區的講學和訪學工作,對該書進行瞭“脫胎換骨”的改進,最終齣版瞭《數據結構編程實驗:大學程序設計課程與競賽訓練教材》第2版。
本書根據數據結構的知識體係結構,按照循序漸進的原則,分四大篇(曆練基本編程能力、綫性數據結構的編程實驗、樹的編程實驗、圖的編程實驗)15章組織內容。每一章在介紹瞭相關的數據結構知識後,給齣瞭相應的實驗範例,並在最後一節給齣相關題庫。
相應於本書的第1版,我們除瞭修正原有的小錯誤、筆誤以及改進瞭一些錶述外,較大的改進如下:在第一篇的第3章中,由原來的“簡單遞歸的編程實驗”完善為“遞歸與迴溯的編程實驗”。在第二篇的第4章中,將“在數組中快速查找指定元素”和“通過數組分塊技術優化算法”的實驗範例融閤到原有的內容中;在第5章的隊列編程實驗中,完整地給齣瞭三種隊列形式即順序隊列、優先隊列、雙端隊列的實驗範例。在第三篇的第8章中,加入瞭“用四叉樹求解二維空間問題”的實驗範例;在第10章,在已有的二叉排序樹和二叉堆的編程實驗基礎上,給齣兼具二叉排序樹和二叉堆性質的樹堆的實驗範例。在第四篇中,加入第15章“應用狀態空間搜索編程”。
我們對浩如煙海的ACM程序設計競賽區預賽、總決賽、各大學程序設計競賽、在綫程序設計競賽以及中學生信息學奧林匹剋競賽的試題進行瞭分析和整理,從中精選齣227道試題作為書中內容。其中88道試題作為實驗範例,每道試題不僅有詳盡的解析,還給齣帶有詳細注釋的參考程序;139道作為題庫試題,所有試題都有清晰的提示,同時對第1版的讀者反映的題庫中一些“看瞭提示也很難編程”的較難的試題給齣瞭帶詳盡注解的解答程序(或者直接給齣,或者作為電子版隨試題原版給齣)。
書中每道題都注明瞭試題來源和在綫測試網址,學生可以通過在綫測試平颱測試自己編寫的程序。
本書的網站(www.hzbook.com)提供瞭所有試題的英文原版以及大部分試題的官方測試數據和解答程序。
本書既可以用於大學程序設計課程的教學和實驗,又可以用於程序設計競賽的訓練。對於本書,我們的使用建議是:書中每章的實驗範例可以用於程序設計語言、數據結構課程的教學、實驗和上機作業,以及程序設計競賽選手掌握知識點的入門訓練;而在每章最後給齣的“相關題庫”中的試題則可以作為程序設計競賽選手的專項訓練試題,以及學生進一步提高編程能力的練習題。根據本書第1版的使用情況,本書也非常適閤學生自學,在知識背景、試題、測試數據、解題分析或提示的支持之下,即使沒有老師、沒有同伴,同學們也能夠係統、全麵地提高自己的編程能力。
本書是在復旦大學程序設計集訓隊長期活動的基礎上積纍而成的。
感謝復旦大學計算機學院2006級、2007級、2008級同學,他們在使用本書第1版的講義稿過程中提齣瞭寶貴的意見和建議。
感謝阿拉法特·居來提、姚哲雲、張昊同學,他們編寫瞭本書第1版的所有程序。
感謝使用本書第1版的讀者們,他們提齣的寶貴意見和建議對第2版和英文版的齣版貢獻巨大。
感謝Stony Brook University的Steven Skiena教授、Rezaul Chowdhury教授,Texas State University的C. Jinshong Hwang教授、Ziliang Zong教授和Hongchi Shi教授,German Unive-rsity of Technology in Oman的Rudolf Fleischer教授,以及North South University的Abul L. Haque教授和Shazzad Hosain教授,他們為本書英文版的試用和改進提供瞭平颱。
感謝中國颱灣、中國香港、孟加拉國、馬來西亞邀請我講學的李哲榮、廖宜恩、楊昌彪、林盈達、李淑敏、傅楸善、曹建農等教授和參加我的講學的老師和同學,這幾年,我們並肩作戰,風雨同舟,而他們在使用本書第2版書稿的過程中也提齣瞭寶貴意見和建議,為本書第2版的完成做齣瞭不可或缺的貢獻。
由於時間和水平所限,書中肯定夾雜瞭不少缺點和錯誤,錶述不當和筆誤也在所難免,熱忱歡迎學術界同仁和讀者賜正。如果您在閱讀中發現瞭問題,懇請通過書信或電子郵件告訴我們,以便我們及時整理成勘誤錶放在本書的網站上,供廣大讀者查詢更正。我們更期望讀者對本書提齣建設性意見,以便再版時改進。
數據結構編程實驗(第2版) 下載 mobi epub pdf txt 電子書 格式