第一篇:數據結構與算法分析總結
數據結構和算法設計與分析
談到計算機方面的專業課程,我覺得數據結構算是一門必不可少的課了,它是計算機從業和研究人員了解、開發及最大程度的利用計算機硬件的一種工具。數據結構與算法分析是兩門緊密聯系的課程,算法要靠好的數據結構來實現,二者的關系是密不可分的,談到算法不得不講數據結構,談數據結構也不可避免的要了解算法,好的算法一定有一個好的數據結構,很多算法實際上是對某種數據結構實行的一種變換,研究算法也就是研究在實行變換過程中數據的動態性質。這兩門課程分別是我在大二和研一的時候學的,因為它們密切的聯系,這里將其放在一起總結如下。
什么是數據結構呢?研究數據的邏輯結構和存儲結構(物理結構)以及它們之間的關系,且為該結構定義相應的運算設計相應的算法。這里的數據是指可輸入到計算機能被程序處理的符號的集合。其中,數據的邏輯結構是指數據之間邏輯關系的描述,邏輯結構的分類有線性結構、樹形結構和圖結構。數據的存儲結構是指數據在計算機中存儲結構,也稱為物理結構,它有4類基本的存儲映射方法:1.順序的方法;2.鏈接的方法;3.索引的方法;4.散列的方法。在程序設計語言中,數據結構直接反映在數據類型上,比如一個整型變量就是一個節點,根據類型給他分配內存單元。抽象數據類型:一組值以及在這些值上定義的操作集合,它是描述數據結構的一種理論工具,其特點是把數據結構作為獨立于應用程序的一種抽象代數結構。
線性表結構:由一系列元素組成的有序的序列,除了第一個元素和最后一個元素外,每個元素都只有一個直接前趨和直接后繼,元素的個數稱為線性表的長度。它的存儲方式有順序存儲和鏈式存儲。順序存儲方式它的優點是存儲單元是連續的,適合快速訪問元素內容,鏈表的特點是動態申請內存空間,并通過指針來鏈接結點,按照線性表的前驅關系把一個個結點鏈接起來,這樣可以動態地根據需要分配內存空間,經常用于插入新結點或刪除節點的需要,鏈表還可以根據結點中指針個數分為單鏈表、雙鏈表、循環鏈表等。在線性表結構中有兩類特別的線性表:棧和隊列。棧是一種限制訪問端口的線性表,常稱為后進先出表。正是這種特殊的性質使得棧的用途非常廣泛,比如在計算表達式的值時處理運算符的先后次序,另外一個大的用處就是遞歸了,hanoi 塔就是最典型的用了遞歸的思想,在算法中,也有很多運用遞歸思想的例子。隊列也屬于限制訪問點的線性表,它的特點就是加入和刪除元素都只能在隊列的一端進行,即隊列首出,隊列尾進,最大的特點是先來先服務,先進先出。因為這個特點,隊列常被用作消息緩沖器。
在算法設計中,順序表主要用于檢索,而利用棧中的遞歸思想在算法中則應用非常廣泛,如遞歸排序,分治算法等。
樹結構:是一種非常重要的非線性數據結構,它是由一個根結點和若干葉結點組成的樹狀結構,除了根結點每個結點只能有一個父節點,可以有若干子結點,若干個樹結構還可以構成森林,樹的存儲結構也分為順序存儲和鏈式存儲,最典型的是左孩子右兄弟法。在樹結構中比較重要的算法就是周游(遍歷)樹,有先根次序、后根次序以及中根次序。樹結構中有幾類非常重要的特殊樹結構,如二叉樹,B樹,B+樹等,其中,二叉樹應用最為廣泛。
二叉樹:是指每個結點最多有兩個子結點的樹結構,具體細分,根據葉子結點的特性可分為滿二叉樹、完全二叉樹等。二叉樹的遍歷也分為深度優先和廣度優先。另外,二叉樹有幾條非常重要的性質,這也使得它的應用非常廣泛。
在算法設計中,典型的利用樹的深度優先遍歷的算法是回溯法,而典型的廣度優先搜索算法是分枝定界法。
圖:是一種較線性表和樹更為復雜的數據結構。一般來講,數據的邏輯結構可表示為結點的有窮集合K和K上的一個關系r,如果對K中結點相對于r的前驅、后繼個數加以限制,則可以分別定義線性結構、樹形結構和圖結構,即:
線性結構:惟一前驅,惟一后繼,反映一種線性關系; 樹形結構:惟一前驅,多個后繼,反映一種層次關系;
圖結構:不限制前驅的個數,亦不限制后繼的個數,反映一種網狀關系。
通常用G=(V,E)代表一個圖,其中V是頂點集,E是邊集。圖分為有向圖和無向圖,圖的存儲方式有鄰接表和鄰接矩陣法。和樹類似的,圖中也需要周游,同樣有深度優先搜索和廣度優先搜索,而比樹的周游要更復雜,也更重要。在這一塊中,有兩種比較典型的求最短路徑和最小支撐樹的算法需要注意,它們分別是Dijkstra算法和Prim算法。另外需要注意的是圖的連通性。
在算法設計中,典型的用到圖論的算法有貪心算法和動態規劃算法。
對于計算機科學來說,算法的概念至關重要。通俗的講,算法是指解決問題的一種方法或一個過程,或者嚴格來講,是由若干條指令組成的有窮序列,且滿足以下4條性質;
(1)輸入:有零個或多個由外部提供的量作為算法的輸入。(2)輸出:算法產生至少一個量作為輸出。
(3)確定性:組成算法的每條指令是清晰的,無歧義的。(4)有限性:算法中每條指令的執行次數是有限的,執行每條指令的時間也是有限的。
我們研究一個算法或者評價一個算法主要是通過估計該算法的復雜性,包括時間復雜性和空間復雜性??臻g復雜性是指使用該算法的程序在運行時需要占用多少內存空間,具體包括指令空間、數據空間和環境??臻g。時間復雜性是指執行該程序所需要的時間量級,通常是估算的時間,包括編譯時間和運行時間。同時評價一個算法的好壞還要看其時間復雜性和空間復雜性隨著輸入規模的增長趨勢,一般能接受的最好是線性增長。在算法設計這本書中,每介紹一個算法都會分析其算法復雜度,由此可看出它的重要性。
首先,從遞歸的分治算法開始。分治算法的基本思想是將一個規模為n的問題分解為k個規模較小的子問題,這些子問題互相獨立且與原問題相同。遞歸的解這些子問題,然后將各個子問題的解合并得到原問題的解。該算法的主要應用有大整數乘法,矩陣乘法、合并排序等??梢源蟠蠼档退惴ǖ臅r間復雜度,但使用遞歸棧可能增加程序的空間規模。
動態規劃算法和貪心算法:與分治算法類似,動態規劃的基本思想也是將待求解問題分解成若干子問題,先求解子問題,然后從這些子問題的解得到原問題的解。與分治算法不同的是,適合于用動態規劃法求解的問題,經分解得到的子問題往往不是相互獨立的。動態規劃算法適用于解最優化問題。通??砂匆韵?個步驟:
(1)找出最優解的性質,并刻畫其結構特征。(2)遞歸的定義最優值。
(3)以自底向上的方式計算出最優值。
(4)根據計算最優值時得到的信息,構造最優解。
動態規劃算法的基本要素是最優子結構性質和子問題重疊性質。
最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃算法解決問題提供了重要線索。
子問題重疊性質。子問題重疊性質是指在用遞歸演算法自頂向下對問題進行求解時,每次產生的子問題并不總是新問題,有些子問題會被重復計算多次。動態規劃算法正是利用了這種子問題的重疊性質,對每一個子問題只計算一次,然后將其計算結果保存在一個表格中,當再次需要計算已經計算過的子問題時,只是在表格中簡單地查看一下結果,從而獲得較高的效率。
另外一點要素是備忘錄方法,它作為動態規劃算法的變形,用表格保存已解決問題的答案,在下次需要解此子問題時,只要簡單查看子問題的解答,而不必重新計算。與動態規劃不同的是備忘錄方法的遞歸是自頂向下的,而動態規劃則是自底向上的。
動態規劃算法設計策略典型的應用案例有:矩陣連乘、最大字段和、流水作業調度等。有時滿足動態規劃條件的問題可以有更好的算法,比如貪心算法。貪心算法即總是做出在當前看來是最好的選擇。也就是說貪心算法并不從整體最優上加以考慮,它所做的總是做出的選擇只是在某種意義上的局部最優。這種啟發式的策略并不能總是奏效,然而對某些特定的問題確能達到預期目的。比如活動安排的例子。
貪心算法的基本要素主要有貪心選擇性質和最優子結構性質。所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇來達到。這是貪心算法與動態規劃的主要區別,它們的共同點是都要求問題具有最優子結構性質。
貪心算法的典型案列是:活動安排、最優裝載問題、最短路徑和最優生成樹問題。回溯法和分枝定界法:回溯法有“通用的解題法”之稱。用它可以系統的搜索一個問題的所有解或任一解。它在問題的解空間樹中,按深度優先策略,從根節點出發搜索解空間樹。其算法框架包含遞歸回溯和迭代回溯,兩個特別的解空間樹為子集樹和排列樹。典型的回溯法的案例有:批處理作業調度、圖的m著色、旅行售貨員問題、0-1背包問題等。
分枝定界法類似于回溯法,也是在問題的解空間上搜索問題解的算法。一般情況下,分治定界法與回溯法的求解目標不同。回溯法的求解目標是找出解空間中滿足約束條件的所有 的解,而分枝定界法的求解目標則是找出滿足約束條件的一個解,或是滿足約束條件的解中找出使某一目標函數值達到極大或極小的解,即在某種意義下的最優解。由于求解目標不同,導致分支定界法與回溯法對解空間的搜索方式也不相同?;厮莘ㄒ陨疃葍炏鹊姆绞剿阉鹘饪臻g,而分枝定界法則以廣度優先或以最小耗費優先的方式搜索解空間。
另外,在算法分析中一定要提的是NP問題。首先需要介紹P(Polynomial,多項式)問題.P問題是可以在多項式時間內被確定機(通常意義的計算機)解決的問題。NP(Non-Deterministic Polynomial, 非確定多項式)問題,是指可以在多項式時間內被非確定機(他可以猜,他總是能猜到最能滿足你需要的那種選擇,如果你讓他解決n皇后問題,他只要猜n次就能完成----每次都是那么幸運)解決的問題.這里有一個著名的問題----千禧難題之首,是說P問題是否等于NP問題,也即是否所有在非確定機上多項式可解的問題都能在確定機上用多項式時間求解。
NP完全(NP Complete,NPC)問題是指這樣一類NP問題,所有的NP問題都可以用多項式時間劃歸到他們中的一個。所以顯然NP完全的問題具有如下性質:它可以在多項式時間內求解,當且僅當所有的其他的NP-完全問題也可以在多項式時間內求解。這樣一來,只要我們找到一個NPC問題的多項式解,所有的NP問題都可以多項式時間內劃歸成這個NPC問題,再用多項式時間解決,這樣NP就等于P了。
小結一下,在算法設計這么課中學了這么幾大類典型的算法,里面也涉及到具體的應用案例,但我覺得學算法的目的遠不是學會這幾種固定的特殊問題的解法而已,事實上領會這些巧妙算法背后的思想然后學會遷移到其他新的問題中去才是領會了算法設計的精髓。
第二篇:數據結構與算法總結
《數據結構與算法》課程學習總結報告
100401200510計本(4)班章興春
本學期所學習的《數據結構與算法》課程已經告一段落,就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。以便在所學習知識有更深刻的認識。
一、《數據結構與算法》知識點:
學習數據結構之前、一直以為數據結構是一門新的語言、后來才知道學習數據結構是為了更加高效的的組織數據、設計出良好的算法,而算法則是一個程序的靈魂。經過了一學期的數據結構了,在期末之際對其進行總結。首先,學完數據結構我們應該知道數據結構講的是什么,數據結構課程主要是研究非數值計算的研究的程序設計問題中所出現的計算機處理對象以及它們之間關系和操作的學科。
第一章主要介紹了相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。
第二章具體地介紹了順序表的定義、特點及其主要操作,如查找、插入和刪除的實現。需要掌握對它們的性能估計。包括查找算法的平均查找長度,插入與刪除算法中的對象平均移動次數。
鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。
第三章介紹了堆棧與隊列這兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。算法上要求掌握進棧、退棧、取棧頂元素、判??蘸兄每諚5任宸N操作及掌握使用元素個數計數器及少用一個元素空間來區分隊列空、隊列滿的方法。
第四章串和數組中,我們知道串是一種特殊的線性表,是由零個或多個任意字符組成的字符序列。串的儲存結構分為緊縮模式和非緊縮模式。
基本運算需掌握求串長、串賦值、連接操作、求子串、串比較、串定位、串插入、串刪除、串替換等。
第五章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。
樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。
第六章介紹了圖的概念及其應用,圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。
最后兩章集體說明了查找和排序算法,查找教材上介紹了靜態查找表和哈希查找表,靜態查找表中介紹了順序查找、折半查找以及分塊查找。哈希法中,學習要點包括哈希函數的比較;解決地址沖突的線性探查法的運用,平均探查次數;解決地址沖突的二次哈希法的運用。
排序是使用最頻繁的一類算法,可分為內部排序和外部排序。主要需要理解排序的基本概念,在算法上、需要掌握插入排序(包括直接插入排序算法、折半插入排序算法),交換排序(包括冒泡排序算法、快速排序遞歸算法),選擇排序(包括直接選擇排序算法、堆排序算法)等。
二、對各知識點的掌握情況
總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象?,F將各個章節出現的知識點理解情況列舉如下。
第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。
第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。
鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。
接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。
在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。
第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。
第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。
散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。
最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。
由于平時上機練習的少,對于教材中很多算法都掌握的不是很熟悉、不過這些都是可以彌補的,我會在剩下的時間中不斷練習書上給出的算法和練習,正如教材上說的,學習數據結構,僅從書本上學習是不夠的,必須經過大量的程序設計實踐,在實踐中體會構造性思維方法,掌握數據組織與程序設計技術。
三、學習體會:
多做實驗!這個就沒有太多理由了,我一直覺得編程是一門熟練科學,多編程,水平肯定會提高,最重要的是能夠養成一種感覺,就是對程序對算法的敏感,為什么那些牛人看一個算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了過了一陣子又忘記了?其實這個是因為牛人們以前看的程序很多,編得也很多,所以他們有了那種感覺,所以我覺得大家應該多看程序,多寫程序,培養自己的感覺。
復習和考試的技巧,我想大家應該都有這樣的感覺,就是覺得自己什么都掌握了,但是在考試的時候就是會犯暈,有時候一出考場就知道錯在哪個了,然后考完以后一對答案,發現其實考得很簡單,應該都是自己會做的,這個就是與自己的復習和考試的技巧有關系了。
首先就是復習,前面已經說過其實我們學的算法也就是幾十個,那么我們的任務也就是理解這幾十個算法,復習也就是要加深你的理解。如何理解算法,然后理解到什么程度呢? 是能默出整個算法嗎?其實不是這樣的,數據結構的考試有它的特點,考過程考試了,大家應該都發現數據結構其實不要求你把整個算法背出來,它注重考察你的理解,那么怎么考察呢?其實也就是兩種方式吧,一種就是用實例,就是給你一個例子,要你用某個算法運行出結果,我想這個期末考試的時候仍然會有很多這樣的題目,比如排序那塊就很好出這樣的題目,要復習這種題目我覺得很簡單,就是每個算法都自己用例子去實踐一下,以不變應萬變,我期中復習的時候就是這樣去做的,而且考試之前我就覺得那個并查集的題目就很有可能會考,于是就自己出了幾個例子,做了一下。另外一種考察方式就是算法填空和算法改錯,可能有一些同學覺得這種題目很難,其實我們首先可以確定這兩種題目肯定是與書上算法有關系的,只要理解了書上的算法就可以了,有人覺得看完書以后什么都懂了,而且要默也默得出來,其實不是這樣的,算法改錯和填空主要是考察的細微處,雖然你覺得你默得出來,那是能夠默出算法的主體部分,很多細微的地方你就會很容易忽略。我想大家考過期中考以后應該都有這種感覺吧?那要怎樣解決這種問題呢? 我覺得有兩種方法,一種就是自己去編程實現,這種方法比較有意義,還能夠提高編程水平,另外一種就是用實例分析算法的每句話,我認為這種方法是最有效的。
然后還有一種題目,就是最后的寫算法的題目,我覺得這種題目還是很好解決的,只要是能夠自己做出作業的,基本上都會很容易做出來,這也是為什么我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心,尤其是題目簡單的時候,那肯定會有一些小地方要考慮清楚,一不小心就會被扣掉很多分,這樣很不值。
我覺得考試的時候沒有太多要講的,只要復習好了,考試的時候細心一點就可以了,然后就是做一個題目開始就要盡量保證正確,如果覺得留在那里等后面做完了再來檢查,這樣錯誤還是很有可能檢查不出來,我期中考試的時候就基本上沒有檢查,因為我做每個題目都是確保正確,用的時間也挺多的,然后也覺得沒有檢查的必要了。
三、對《數據結構與算法》課程教學的建議
1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。
2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。
3、要更加重視實驗的重要性。
以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進!
第三篇:數據結構與算法總結
《數據結構與算法》課程學習總結報告
070401301507計本(3)班張浩
本學期開設的《數據結構與算法》課程已經告一段落,現就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。
一、《數據結構與算法》知識點
在課本的第一章便交代了該學科的相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。緊接著介紹了一些常用的數據運算。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。
第二章具體地介紹了順序表的概念、基本運算及其應用?;具\算有:初始化表、求表長、排序、元素的查找、插入及刪除等。元素查找方法有:簡單順序查找、二分查找和分塊查找。排序方法有:直接插入排序、希爾排序、冒泡排序、快速排序、直接選擇排序及歸并排序等。最后介紹了順序串的概念,重點在于串的模式匹配。
鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。
堆棧與隊列是兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。
第六章介紹了特殊矩陣和廣義表的概念與應用。其中,特殊矩陣包括對稱矩陣、三角矩陣、對角矩陣和稀疏矩陣,書中分別詳細介紹了它們的存儲結構。稀疏矩陣的應用包括轉置和加法運算等。最后介紹了廣義表的相關概念及存儲結構,關于它的應用,課本中舉了m元多項式的表示問題。
第七章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。
樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。散列結構是一種查找效率很高的一種數據結構。本章的主要知識點有:散列結構的概念及其存儲結構、散列函數、兩種沖突處理方法、線性探測散列和鏈地址散列的基本算法以及散列結構的查找性能分析。
最后一章介紹了圖的概念及其應用,是本書的難點。圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。
二、對各知識點的掌握情況
總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象?,F將各個章節出現的知識點理解情況列舉如下。
第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。
第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。
鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。
接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。
在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。
第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。
第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。
散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。
最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。
三、學習體會
接觸這門課程以前,我對該課程所學的內容有許多疑點,例如:這門課是否是在介紹一種新的計算機語言?如果不是,那么學習這門課程的用途是什么?為什么市面上各種介紹數據結構的資料采用了不同的計算機語言,如C、C++還有Java?我的C語言學得不好,對學習這門課是否有影響??
在學習伊始,老師就明確提出它不是一種計算機語言,不會介紹新的關鍵詞,而是通過學習可以設計出良好的算法,高效地組織數據。一個程序無論采用何種語言,其基本算法思想不會改變。聯系到在大一和大二上學期學習的C和C++語言,我深刻認識到了這一點。“軟件開發好比寫作文,計算機語言提供了許多華麗的辭藻,而數據結構則考慮如何將這些辭藻組織成一篇優秀的文章來?!痹趯W習這門課中,要熟悉對算法思想的一些描述手段,包括文字描述、圖形描述和計算機語言描述等。因此,計算機語言基礎是必須的,因為它提供了一種重要的算法思想描述手段——機器可識別的描述。
這門課結束之后,我總結了學習中遇到的一些問題,最為突出的,書本上的知識與老師的講解都比較容易理解,但是當自己采用剛學的知識點編寫程序時卻感到十分棘手,有時表現在想不到適合題意的算法,有時表現在算法想出來后,只能將書本上原有的程序段謄寫到
自己的程序中再加以必要的連接以完成程序的編寫。針對這一情況,我會嚴格要求自己,熟練掌握算法思想,盡量獨立完成程序的編寫與修改工作,只有這樣,才能夠提高運用知識,解決問題的能力。
四、對《數據結構與算法》課程教學的建議
1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。
2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。
以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進!
第四篇:算法與數據結構總結
算法與數據結構總結
算法與數據結構這一門課程,就是描述了數據的邏輯結構,數據的存儲結構,以及數據的運算集合在計算機中的運用和體現。數據的邏輯結構就是數據與數據之間的邏輯結構;數據的存儲結構就包含了順序存儲、鏈式存儲、索引存儲和散列存儲。在這學期當中,老師給我們主要講了順序存儲和鏈式存儲。最后數據的運算集合就是對于一批數據,數據的運算是定義在數據的邏輯結構之上的,而運算的具體實現依賴于數據的存儲結構。
通過這學期的學習,讓我在去年C語言的基礎上對數據與數據之間的邏輯關系有了更深的理解和認識。以前在學Matlab這一課程的時候,我們如果要實現兩個數的加減乘除,或者一系列復雜的數據運算,就直接的調用函數就行,套用規則符號和運算格式,就能立馬知道結果。在學習C語言這一課程時,我們逐漸開始了解函數的調用的原理,利用子函數中包含的運算規則,從而實現函數的功能?,F今學習了算法,讓我更深層次的知道了通過順序表、指針、遞歸,能讓數據算法的實現更加的簡潔,明了,更易于理解。摒棄了數據的冗雜性。
在本書第二章中,主要介紹了順序表的實現以及運用。順序表中我認為最重要的是一個實型數組,和順序表的表長,不論是在一個數據的倒置、插入、刪除以及數據的排序過程中,都能將數據依次存入數組當中,利用數組下標之間的關系,就能實現數據的一系列操作了。在存儲棧中,給我留下最深刻的映像就是“先進后出”,由于它特殊的存儲特性,所以在括號的匹配,算術表達式中被大量應用。在存儲隊列之中,數據的刪除和存儲分別在表的兩端進行操作,所以存儲數據很方便。為節省隊列浪費閑置空間的這一大缺點,所以引入了循環隊列這一概念,很好用。
在第三章中,主要講的是鏈式存儲特性。它最突出的優點就是可以選擇連續或者不連續的存儲空間都行。所以,不管是數據在插入或者刪除一個數據時,會很方便,不會像順序表那樣,要移動數組中的諸多元素。所以鏈表利用指針能很方便的進行刪除或者插入操作。而鏈式在棧和隊列的基礎上,也有了多方面的應用,所以在這些方面有了更多的應用。
第四章字符串中,基本的數組內部元素的排序和字符串的匹配大部分代碼自己還是能夠理解,能夠看懂,如果真的要將所學的大量運用于實踐的話,那就要多花些功夫和時間了。在對稱矩陣的壓縮,三角矩陣的壓縮,稀疏矩陣在存儲中能夠合理的進行,能大大提高空間的開支。
在第五章遞歸當中,就是在函數的定義之中出現了自己本身的調用,稱之為遞歸。而遞歸設計出來的程序,具有結構清晰,可讀性強,便于理解等優點。但是由于遞歸在執行的過程中,伴隨著函數自身的多次調用,因而執行效率較低。如果要在追求執行效率的情況下,往往采用非遞歸方式實現問題的算法程序。
在第六章數型結構當中,這是區別于線性結構的另一大類數據結構,它具有分支性和層次性。它是數據表示,信息組織和程序設計的基礎和工具。在本章中,映像深刻的是樹的存儲結構。有雙親表示法,孩子表示法,以及孩子兄弟表示法。在表示怎樣存儲數據之后,接著要從數型結構中將數據讀取出來,于是,有了樹的遍歷,在遍歷當中,又分為前序、中序和后序遍歷,這三種遍歷各有各的特點。
在第七章中,說到了樹的擴展---二叉樹。二叉樹不同一般的樹型結構的另一種重要的非線性結構,它是處理兩種不同的數據結構,許多涉及樹的算法采用二叉樹表示和處理更加便捷和方便。其他的也是和一般的二叉樹差不多。還多了一個樹、森林和二叉樹之間的轉換。
第八章的圍繞著圖來展開,它是一種復雜的非線性結構,在人工智能、網絡工程、數學、并行計算和工業設計有著廣泛的應用。圖最重要的由一個非空的頂點集合和一個描述頂點之間的多對多關系的邊集合組成的一種數據結構。圖的存儲室通過鄰接矩陣老存儲圖的信息。而圖的讀取是通過深度優先遍歷和廣度優先遍歷實現。生成最小生成樹有Prim算法和Kruskal算法,相對于這兩種算法,后一種算法要更加易于理解。
在考試的時候,我以為老師只會出題作業部分。然后書中有一小部分就沒看,但是題中出現了一個二叉樹轉換為森林的時候,我有印象,但就是沒思路想法了,就沒做。從中我真的理解了老師說的,考試不代表學習的結束?;蛘吣悻F在看的內容在生活中學習中暫時沒有太大的作用,但是到了某一特定的環境條件下,總會有作用。所以,學習是一個積累的過程,不懈怠,踏實的走下去,你才會有所收獲。
第五篇:數據結構算法設計與分析
數據結構算法設計與分析、計算機網絡、計算機組成原理、操作系統原理、編譯原理、數據庫原理及應用、軟件工程、軟件測試等計算機基礎理論課程;
網頁制作、程序設計Java、JSP程序設計、Oracle、XML程序設計、計算機網絡、SSH(Struts+Spring+Hibernate)框架、Java EE程序設計、Ajax程序設計、Linux+PHP+MySQL程序設計、Android手機開發、UML系統分析與設計、性能測試、自動化軟件測試、軟件質量保證、畢業設計及項目綜合實訓等。
數據結構、計算機網絡、計算機組成原理、操作系統原理、編譯原理、數據庫原理及應用、金融學概論、西方經濟學等基礎理論課程;
網頁制作、程序設計Java、JSP程序設計、J2EE程序設計、SQL Server數據庫、Oracle數據庫、Linux操作系統、UML系統分析與設計、軟件工程、XML程序設計、SSH框架、金融市場學、ERP財務管理、管理信息系統、投資銀行學、商業銀行學、國際金融管理、畢業設計及項目綜合實訓等專業課程。
數據結構、計算機網絡、計算機組成原理、操作系統原理、數據庫原理及應用、軟件工程、軟件測試等計算機基礎理論課程;
網頁制作、程序設計Java、JSP程序設計、J2EE程序設計、XML程序設計、Ajax程序設計、SSH框架、Android手機開發、Linux+PHP+MySQL程序設計、SQL Server數據庫、Linux操作系統、UML系統分析與設計、軟件項目管理、行業標準與規范、IT服務管理、IT職業英語、畢業設計及項目綜合實訓等專業課程