第一篇:數據結構與算法總結
《數據結構與算法》課程學習總結報告
070401301507計本(3)班張浩
本學期開設的《數據結構與算法》課程已經告一段落,現就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。
一、《數據結構與算法》知識點
在課本的第一章便交代了該學科的相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。緊接著介紹了一些常用的數據運算。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。
第二章具體地介紹了順序表的概念、基本運算及其應用。基本運算有:初始化表、求表長、排序、元素的查找、插入及刪除等。元素查找方法有:簡單順序查找、二分查找和分塊查找。排序方法有:直接插入排序、希爾排序、冒泡排序、快速排序、直接選擇排序及歸并排序等。最后介紹了順序串的概念,重點在于串的模式匹配。
鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。
堆棧與隊列是兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。
第六章介紹了特殊矩陣和廣義表的概念與應用。其中,特殊矩陣包括對稱矩陣、三角矩陣、對角矩陣和稀疏矩陣,書中分別詳細介紹了它們的存儲結構。稀疏矩陣的應用包括轉置和加法運算等。最后介紹了廣義表的相關概念及存儲結構,關于它的應用,課本中舉了m元多項式的表示問題。
第七章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。
樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。散列結構是一種查找效率很高的一種數據結構。本章的主要知識點有:散列結構的概念及其存儲結構、散列函數、兩種沖突處理方法、線性探測散列和鏈地址散列的基本算法以及散列結構的查找性能分析。
最后一章介紹了圖的概念及其應用,是本書的難點。圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。
二、對各知識點的掌握情況
總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象。現將各個章節出現的知識點理解情況列舉如下。
第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。
第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。
鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。
接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。
在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。
第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。
第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。
散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。
最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。
三、學習體會
接觸這門課程以前,我對該課程所學的內容有許多疑點,例如:這門課是否是在介紹一種新的計算機語言?如果不是,那么學習這門課程的用途是什么?為什么市面上各種介紹數據結構的資料采用了不同的計算機語言,如C、C++還有Java?我的C語言學得不好,對學習這門課是否有影響??
在學習伊始,老師就明確提出它不是一種計算機語言,不會介紹新的關鍵詞,而是通過學習可以設計出良好的算法,高效地組織數據。一個程序無論采用何種語言,其基本算法思想不會改變。聯系到在大一和大二上學期學習的C和C++語言,我深刻認識到了這一點。“軟件開發好比寫作文,計算機語言提供了許多華麗的辭藻,而數據結構則考慮如何將這些辭藻組織成一篇優秀的文章來。”在學習這門課中,要熟悉對算法思想的一些描述手段,包括文字描述、圖形描述和計算機語言描述等。因此,計算機語言基礎是必須的,因為它提供了一種重要的算法思想描述手段——機器可識別的描述。
這門課結束之后,我總結了學習中遇到的一些問題,最為突出的,書本上的知識與老師的講解都比較容易理解,但是當自己采用剛學的知識點編寫程序時卻感到十分棘手,有時表現在想不到適合題意的算法,有時表現在算法想出來后,只能將書本上原有的程序段謄寫到
自己的程序中再加以必要的連接以完成程序的編寫。針對這一情況,我會嚴格要求自己,熟練掌握算法思想,盡量獨立完成程序的編寫與修改工作,只有這樣,才能夠提高運用知識,解決問題的能力。
四、對《數據結構與算法》課程教學的建議
1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。
2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。
以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進!
第二篇:數據結構與算法總結
《數據結構與算法》課程學習總結報告
100401200510計本(4)班章興春
本學期所學習的《數據結構與算法》課程已經告一段落,就其知識點及其掌握情況、學習體會以及對該門課程的教學建議等方面進行學習總結。以便在所學習知識有更深刻的認識。
一、《數據結構與算法》知識點:
學習數據結構之前、一直以為數據結構是一門新的語言、后來才知道學習數據結構是為了更加高效的的組織數據、設計出良好的算法,而算法則是一個程序的靈魂。經過了一學期的數據結構了,在期末之際對其進行總結。首先,學完數據結構我們應該知道數據結構講的是什么,數據結構課程主要是研究非數值計算的研究的程序設計問題中所出現的計算機處理對象以及它們之間關系和操作的學科。
第一章主要介紹了相關概念,如數據、數據元素、數據類型以及數據結構的定義。其中,數據結構包括邏輯結構、存儲結構和運算集合。邏輯結構分為四類:集合型、線性、樹形和圖形結構,數據元素的存儲結構分為:順序存儲、鏈接存儲、索引存儲和散列存儲四類。最后著重介紹算法性能分析,包括算法的時間性能分析以及算法的空間性能分析。
第二章具體地介紹了順序表的定義、特點及其主要操作,如查找、插入和刪除的實現。需要掌握對它們的性能估計。包括查找算法的平均查找長度,插入與刪除算法中的對象平均移動次數。
鏈表中數據元素的存儲不一定是連續的,還可以占用任意的、不連續的物理存儲區域。與順序表相比,鏈表的插入、刪除不需要移動元素,給算法的效率帶來較大的提高。鏈表這一章中介紹了鏈表的節點結構、靜態與動態鏈表的概念、鏈表的基本運算(如求表長、插入、查找、刪除等)、單鏈表的建立(頭插法和尾插法)以及雙向循環鏈表的定義、結構、功能和基本算法。
第三章介紹了堆棧與隊列這兩種運算受限制的線性結構。其基本運算方法與順序表和鏈表運算方法基本相同,不同的是堆棧須遵循“先進后出”的規則,對堆棧的操作只能在棧頂進行;而隊列要遵循“先進先出”的規則,教材中列出了兩種結構的相應算法,如入棧、出棧、入隊、出隊等。在介紹隊列時,提出了循環隊列的概念,以避免“假溢出”的現象。算法上要求掌握進棧、退棧、取棧頂元素、判棧空盒置空棧等五種操作及掌握使用元素個數計數器及少用一個元素空間來區分隊列空、隊列滿的方法。
第四章串和數組中,我們知道串是一種特殊的線性表,是由零個或多個任意字符組成的字符序列。串的儲存結構分為緊縮模式和非緊縮模式。
基本運算需掌握求串長、串賦值、連接操作、求子串、串比較、串定位、串插入、串刪除、串替換等。
第五章二叉樹的知識是重點內容。在介紹有關概念時,提到了二叉樹的性質以及兩種特殊的二叉樹:完全二叉樹和滿二叉樹。接著介紹二叉樹的順序存儲和鏈接存儲以及生成算法。重點介紹二叉樹的遍歷算法(遞歸算法、先序、中序和后序遍歷非遞歸算法)和線索二叉樹。二叉樹的應用:基本算法、哈弗曼樹、二叉排序樹和堆排序。
樹與二叉樹是不同的概念。教材介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。
第六章介紹了圖的概念及其應用,圖的存儲結構的知識點有:鄰接矩陣、鄰接表、逆鄰接表、十字鏈表和鄰接多重表。圖的遍歷包括圖的深度優先搜索遍歷和廣度優先搜索遍歷。其余知識點有:有向圖、連通圖、生成樹和森林、最短路徑問題和有向無環圖及其應用。有向無環圖重點理解AOV網和拓撲排序及其算法。
最后兩章集體說明了查找和排序算法,查找教材上介紹了靜態查找表和哈希查找表,靜態查找表中介紹了順序查找、折半查找以及分塊查找。哈希法中,學習要點包括哈希函數的比較;解決地址沖突的線性探查法的運用,平均探查次數;解決地址沖突的二次哈希法的運用。
排序是使用最頻繁的一類算法,可分為內部排序和外部排序。主要需要理解排序的基本概念,在算法上、需要掌握插入排序(包括直接插入排序算法、折半插入排序算法),交換排序(包括冒泡排序算法、快速排序遞歸算法),選擇排序(包括直接選擇排序算法、堆排序算法)等。
二、對各知識點的掌握情況
總體來看,對教材中的知識點理解較為完善,但各個章節均出現有個別知識點較為陌生的現象。現將各個章節出現的知識點理解情況列舉如下。
第一章中我對數據和數據結構的概念理解較為透徹,熟悉數據結構的邏輯結構和存儲結構。而對算法的時間、空間性能分析較為模糊,尤其是空間性能分析需要加強。
第二章,順序表的概念、生成算法理解較為清晰,并且熟悉簡單順序查找和二分查找,對分塊查找較為含糊;排序問題中,由于冒泡排序在大一C語言課上已經學習過,再來學習感覺很輕松。對插入排序和選擇排序理解良好,但是,在實際運用中仍然出現明顯不熟練的現象。由于在歸并排序學習中感覺較吃力,現在對這種排序方法仍然非常模糊,所以需要花較多的時間來補習。此外串的模式匹配也是較難理解的一個地方。
鏈表這一章中,除對雙向循環鏈表這一知識點理解困難之外,其他的知識點像單鏈表的建立和基本算法等都較為熟悉。
接下來的有關堆棧以及隊列的知識點比較少,除有關算法較為特殊以外,其余算法都是先前學過的順序表和鏈表的知識,加上思想上較為重視,因此這部分內容是我對全書掌握最好的一部分。不足之處仍然表現在算法的性能分析上。
在學習第六章時感覺較為吃力的部分在于矩陣的應用上,尤其對矩陣轉置算法的C語言描述不太理解。稀疏矩陣相加算法中,用三元組表實現比較容易理解,對十字鏈表進行矩陣相加的方法較為陌生。
第七章是全書的重點,卻也有一些內容沒有完全理解。在第一節基本概念中,二叉樹的性質容易懂卻很難記憶。對二叉樹的存儲結構和遍歷算法這部分內容掌握較好,能夠熟練運用,而對于二叉樹應用中的哈弗曼樹卻比較陌生。
第八章內容較少,牽涉到所學的隊列的有關內容,總體來說理解上沒有什么困難,問題依舊出現在算法的性能分析上。
散列結構這一章理解比較完善的知識點有:基本概念和存儲結構。散列函數中直接定址法和除留余數法學得比較扎實,對數字分析法等方法則感覺較為陌生。對兩種沖突處理的算法思想的理解良好,問題在于用C語言描述上。
最后一章,圖及其應用中,圖的定義、基本運算如圖的生成等起初理解有困難,但隨著學習深入,對它的概念也逐步明朗起來。鄰接矩陣、鄰接表和逆鄰接表掌握較好,而對十字鏈表和鄰接多重表則較為陌生。感覺理解較為吃力的內容還有圖的遍歷(包括深度和廣度優先遍歷),最小生成樹問題也是比較陌生的知識點。最短路徑和AOV網學習起來感覺比較輕松,而對于C語言描述卻又不大明白。
由于平時上機練習的少,對于教材中很多算法都掌握的不是很熟悉、不過這些都是可以彌補的,我會在剩下的時間中不斷練習書上給出的算法和練習,正如教材上說的,學習數據結構,僅從書本上學習是不夠的,必須經過大量的程序設計實踐,在實踐中體會構造性思維方法,掌握數據組織與程序設計技術。
三、學習體會:
多做實驗!這個就沒有太多理由了,我一直覺得編程是一門熟練科學,多編程,水平肯定會提高,最重要的是能夠養成一種感覺,就是對程序對算法的敏感,為什么那些牛人看一個算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了過了一陣子又忘記了?其實這個是因為牛人們以前看的程序很多,編得也很多,所以他們有了那種感覺,所以我覺得大家應該多看程序,多寫程序,培養自己的感覺。
復習和考試的技巧,我想大家應該都有這樣的感覺,就是覺得自己什么都掌握了,但是在考試的時候就是會犯暈,有時候一出考場就知道錯在哪個了,然后考完以后一對答案,發現其實考得很簡單,應該都是自己會做的,這個就是與自己的復習和考試的技巧有關系了。
首先就是復習,前面已經說過其實我們學的算法也就是幾十個,那么我們的任務也就是理解這幾十個算法,復習也就是要加深你的理解。如何理解算法,然后理解到什么程度呢? 是能默出整個算法嗎?其實不是這樣的,數據結構的考試有它的特點,考過程考試了,大家應該都發現數據結構其實不要求你把整個算法背出來,它注重考察你的理解,那么怎么考察呢?其實也就是兩種方式吧,一種就是用實例,就是給你一個例子,要你用某個算法運行出結果,我想這個期末考試的時候仍然會有很多這樣的題目,比如排序那塊就很好出這樣的題目,要復習這種題目我覺得很簡單,就是每個算法都自己用例子去實踐一下,以不變應萬變,我期中復習的時候就是這樣去做的,而且考試之前我就覺得那個并查集的題目就很有可能會考,于是就自己出了幾個例子,做了一下。另外一種考察方式就是算法填空和算法改錯,可能有一些同學覺得這種題目很難,其實我們首先可以確定這兩種題目肯定是與書上算法有關系的,只要理解了書上的算法就可以了,有人覺得看完書以后什么都懂了,而且要默也默得出來,其實不是這樣的,算法改錯和填空主要是考察的細微處,雖然你覺得你默得出來,那是能夠默出算法的主體部分,很多細微的地方你就會很容易忽略。我想大家考過期中考以后應該都有這種感覺吧?那要怎樣解決這種問題呢? 我覺得有兩種方法,一種就是自己去編程實現,這種方法比較有意義,還能夠提高編程水平,另外一種就是用實例分析算法的每句話,我認為這種方法是最有效的。
然后還有一種題目,就是最后的寫算法的題目,我覺得這種題目還是很好解決的,只要是能夠自己做出作業的,基本上都會很容易做出來,這也是為什么我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心,尤其是題目簡單的時候,那肯定會有一些小地方要考慮清楚,一不小心就會被扣掉很多分,這樣很不值。
我覺得考試的時候沒有太多要講的,只要復習好了,考試的時候細心一點就可以了,然后就是做一個題目開始就要盡量保證正確,如果覺得留在那里等后面做完了再來檢查,這樣錯誤還是很有可能檢查不出來,我期中考試的時候就基本上沒有檢查,因為我做每個題目都是確保正確,用的時間也挺多的,然后也覺得沒有檢查的必要了。
三、對《數據結構與算法》課程教學的建議
1、建議在上課過程中加大隨堂練習的分量,以便學生能當堂消化課堂上學習的知識,也便于及時了解學生對知識點的掌握情況,同時有助于學生保持良好的精神狀態。
2、建議在課時允許的情況下,增加習題課的分量,通過課堂的習題講解,加深對知識點的掌握,同時對各知識點的運用有一個更為直觀和具體的認識。
3、要更加重視實驗的重要性。
以上便是我對《數據結構與算法》這門課的學習總結,我會抓緊時間將沒有吃透的知識點補齊。今后我仍然會繼續學習,克服學習中遇到的難關,在打牢基礎的前提下向更深入的層面邁進!
第三篇:算法與數據結構總結
算法與數據結構總結
算法與數據結構這一門課程,就是描述了數據的邏輯結構,數據的存儲結構,以及數據的運算集合在計算機中的運用和體現。數據的邏輯結構就是數據與數據之間的邏輯結構;數據的存儲結構就包含了順序存儲、鏈式存儲、索引存儲和散列存儲。在這學期當中,老師給我們主要講了順序存儲和鏈式存儲。最后數據的運算集合就是對于一批數據,數據的運算是定義在數據的邏輯結構之上的,而運算的具體實現依賴于數據的存儲結構。
通過這學期的學習,讓我在去年C語言的基礎上對數據與數據之間的邏輯關系有了更深的理解和認識。以前在學Matlab這一課程的時候,我們如果要實現兩個數的加減乘除,或者一系列復雜的數據運算,就直接的調用函數就行,套用規則符號和運算格式,就能立馬知道結果。在學習C語言這一課程時,我們逐漸開始了解函數的調用的原理,利用子函數中包含的運算規則,從而實現函數的功能。現今學習了算法,讓我更深層次的知道了通過順序表、指針、遞歸,能讓數據算法的實現更加的簡潔,明了,更易于理解。摒棄了數據的冗雜性。
在本書第二章中,主要介紹了順序表的實現以及運用。順序表中我認為最重要的是一個實型數組,和順序表的表長,不論是在一個數據的倒置、插入、刪除以及數據的排序過程中,都能將數據依次存入數組當中,利用數組下標之間的關系,就能實現數據的一系列操作了。在存儲棧中,給我留下最深刻的映像就是“先進后出”,由于它特殊的存儲特性,所以在括號的匹配,算術表達式中被大量應用。在存儲隊列之中,數據的刪除和存儲分別在表的兩端進行操作,所以存儲數據很方便。為節省隊列浪費閑置空間的這一大缺點,所以引入了循環隊列這一概念,很好用。
在第三章中,主要講的是鏈式存儲特性。它最突出的優點就是可以選擇連續或者不連續的存儲空間都行。所以,不管是數據在插入或者刪除一個數據時,會很方便,不會像順序表那樣,要移動數組中的諸多元素。所以鏈表利用指針能很方便的進行刪除或者插入操作。而鏈式在棧和隊列的基礎上,也有了多方面的應用,所以在這些方面有了更多的應用。
第四章字符串中,基本的數組內部元素的排序和字符串的匹配大部分代碼自己還是能夠理解,能夠看懂,如果真的要將所學的大量運用于實踐的話,那就要多花些功夫和時間了。在對稱矩陣的壓縮,三角矩陣的壓縮,稀疏矩陣在存儲中能夠合理的進行,能大大提高空間的開支。
在第五章遞歸當中,就是在函數的定義之中出現了自己本身的調用,稱之為遞歸。而遞歸設計出來的程序,具有結構清晰,可讀性強,便于理解等優點。但是由于遞歸在執行的過程中,伴隨著函數自身的多次調用,因而執行效率較低。如果要在追求執行效率的情況下,往往采用非遞歸方式實現問題的算法程序。
在第六章數型結構當中,這是區別于線性結構的另一大類數據結構,它具有分支性和層次性。它是數據表示,信息組織和程序設計的基礎和工具。在本章中,映像深刻的是樹的存儲結構。有雙親表示法,孩子表示法,以及孩子兄弟表示法。在表示怎樣存儲數據之后,接著要從數型結構中將數據讀取出來,于是,有了樹的遍歷,在遍歷當中,又分為前序、中序和后序遍歷,這三種遍歷各有各的特點。
在第七章中,說到了樹的擴展---二叉樹。二叉樹不同一般的樹型結構的另一種重要的非線性結構,它是處理兩種不同的數據結構,許多涉及樹的算法采用二叉樹表示和處理更加便捷和方便。其他的也是和一般的二叉樹差不多。還多了一個樹、森林和二叉樹之間的轉換。
第八章的圍繞著圖來展開,它是一種復雜的非線性結構,在人工智能、網絡工程、數學、并行計算和工業設計有著廣泛的應用。圖最重要的由一個非空的頂點集合和一個描述頂點之間的多對多關系的邊集合組成的一種數據結構。圖的存儲室通過鄰接矩陣老存儲圖的信息。而圖的讀取是通過深度優先遍歷和廣度優先遍歷實現。生成最小生成樹有Prim算法和Kruskal算法,相對于這兩種算法,后一種算法要更加易于理解。
在考試的時候,我以為老師只會出題作業部分。然后書中有一小部分就沒看,但是題中出現了一個二叉樹轉換為森林的時候,我有印象,但就是沒思路想法了,就沒做。從中我真的理解了老師說的,考試不代表學習的結束。或者你現在看的內容在生活中學習中暫時沒有太大的作用,但是到了某一特定的環境條件下,總會有作用。所以,學習是一個積累的過程,不懈怠,踏實的走下去,你才會有所收獲。
第四篇:數據結構與算法課程總結[模版]
數據結構與算法課程學習總結報告
11計本一班 許雪松 1104013018
數據結構與算法是計算機程序設計的重要理論技術基礎,它不僅是計算機科學的核心課程,而且也已經成為其他理工專業的熱門選修課。總的來說感觸還是比較深的,剛開始上的時候還蠻簡單的,越到后面感覺越難,算法也更復雜了,有時候甚至聽不懂,老師上課時講的也蠻快的,所以只能靠課下下功夫了。下面是我對本學期學習這門課的總結。
一、數據結構與算法知識點
第一章的數據結構和算法的引入,介紹了數據和數據類型、數據結構、算法描述工具、算法和算法評價四個方面的知識。
第二章具體地介紹了順序表的概念、基本運算及其應用。基本運算有:初始化表、求表長、排序、元素的查找、插入及刪除等。元素查找方法有:簡單順序查找、二分查找和分塊查找。排序方法有:直接插入排序、希爾排序、冒泡排序、快速排序、直接選擇排序及歸并排序等。最后介紹了順序串的概念,重點在于串的模式匹配。
第三章主要介紹的是線性邏輯結構的數據在鏈接存儲方法下數據結構鏈表的相關知識。主要是單鏈表、循環鏈表的數據類型結構、數據結構、基本運算及其實現以及鏈表的相關應用問題,在此基礎上介紹了鏈串的相關知識。在應用方面有多項式的相加問題、歸并問題、箱子排序問題和鏈表在字符處理方面的應用問題等。本章未完全掌握的是循環鏈表的算法問題和C的描述。
第四章介紹在兩種不同的存儲結構下設計的堆棧,即順序棧和鏈棧的相關知識,了解堆棧的相關應用,掌握應用堆棧來解決實際問題的思想及方法。本章主要內容是順序棧和鏈棧的概念、數據類型、數據結構定義和基本運算算法及其性能分析。本章堆棧算法思想較為簡單,所以能較好掌握。
第五章主要介紹順序存儲和鏈接存儲方法下的兩種隊列、順序(循環)隊列和鏈隊列的數據結構、基本運算及其性能分析以及應用。順序隊列(重點是循環隊列)和鏈隊列的概念、數據類型描述、數據結構和基本運算算法及其性能分析等。本章同堆棧有點類似,算法思想較為簡單,所以能較好掌握;但難點重在循環隊列隊空、隊滿的判斷條件問題。
第六章“特殊矩陣、廣義表及其應用”將學習數組、稀疏矩陣和廣義表的基本概念,幾種特殊矩陣的存儲結構及其基本運算,在此基礎上學習特殊矩陣的計算算法與廣義表應用等相關問題。本章的重點是相關數據結構的存儲結構及其基本運算算法。掌握了特殊矩陣的壓縮存儲結構,在該存儲結構下元素的定位方法,理解了稀疏矩陣的計算和廣義表的存儲結構。
第七章二叉樹及其應用。分為二叉樹的基本概念、二叉樹存儲結構、二叉樹的遍歷算法、線索二叉樹、二叉樹的應用(哈夫曼樹、二叉排序樹、堆和堆排序、基本算法)。基本算法包括二叉樹的建立、遍歷、線索化等算法。在此基礎上,介紹二叉樹的一些應用問題,包括哈夫曼編碼問題、(平衡)二叉排序樹問題和堆排序問題等。
第八章說的是樹和森林,首先我們要知道樹與二叉樹是不同的概念。課本介紹了樹和森林的概念、遍歷和存儲結構,還有樹、森林和二叉樹的相互關系,樹或森林怎樣轉化成二叉樹,二叉樹又如何轉換為樹和森林等算法。
第九章“散列結構及其應用”是邏輯結構“集合型”的數據元素在散列存儲方法下的數據結構及其應用知識內容。主要介紹散列函數的概念、散列結構的概念、散列存儲結構的概念---散列表、散列函數和散列表中解決沖突的處理方法---開放定址法、鏈地址法以及散列表的基本算法及其性能分析。本章概念較為多,所以掌握不太好。
第十章圖及其應用。分為圖的概念、圖的存儲結構及其基本算法、圖的遍歷及算法、有向圖的連通性和最小生成樹、圖的最小生成樹、非連通圖的生成森林算法、最短路徑、有向無環圖及其應用。
二、對各知識點的掌握情況
我對各知識點的掌握情況總結如下:
對于第一章對數據結構的概念理解頗深,大概是每次都要談論到吧。對算法的時間性能,空間性能基本了解。這些在后面的章節都會有運用。第二章本章重點和難點在查找和排序問題的算法思想上,6種排序方法的性能比較。本章未掌握的為希爾排序、快速排序、歸并排序的時間復雜度分析。第三章,對鏈表掌握還好,對其數據結構進行了分析,有循環鏈表,掌握的不是很好,對其中一些用法不熟練。第四章堆棧,本章堆棧算法思想較為簡單,所以能較好掌握,但表達式計算問題未掌握好的。第五章的循環隊列隊空、隊滿的判斷條件問題掌握的不是很好。第六章的重點是相關數據結構的存儲結構及其基本運算算法。掌握了特殊矩陣的壓縮存儲結構,在該存儲結構下元素的定位方法,理解了稀疏矩陣的計算和廣義表的存儲結構。第七章對二叉樹掌握較好,其概念,存儲,遍歷有很好的掌握。就是對二叉排序樹有點生疏,它的生成算法不是很會。第八章樹樹與二叉樹之間的轉換,森林與二叉樹的轉換算法思想基本掌握。第九章散列的一些知識,沒有深入學習,大概了解了散列存儲結構散列表,散列函數,沖突的處理方法。第十章了解了圖的逆鄰接表的存儲結構,關鍵路徑求解算法未能掌握好,不能靈活運用圖的不同數據結構和遍歷算法解決復雜的應用問題。
三、學習體會
剛剛接觸這門課時,看到課本中全是算法,當時就暈了,因為我的C語言學的不好,我擔心會影響這門課的學習,后來上課時老師說學習這門課的基礎是C語言,所以我當時就決定一定要好好補補,爭取不被拖后腿,在學習這門課的期間,也遇到了不少問。但是通過學習數據結構與算法,讓我對程序有了新的認識,也有了更深的理解。同時,也讓我認識到,不管學習什么,概念是基礎,所有的知識框架都是建立在基礎概念之上的,所以,第一遍看課本要將概念熟記于心,然后構建知識框架。并且,對算法的學習是學習數據結構的關鍵。在第二遍看課本的過程中,要注重對算法的掌握。對于一個算法,讀一遍可能能讀懂,但不可能完全領會其中的思想。掌握一個算法,并不是說將算法背過,而是掌握算法的思想。我們需要的是耐心。每看一遍就會有這一遍的收獲。讀懂算法之后,自己再默寫算法,寫到不會的地方,看看課本想想自己為什么沒有想到。對算法的應用上,學習算法的目的是利用算法解決實際問題。會寫課本上已有的算法之后,可以借其思想進行擴展,逐步提高編程能力。
四、對課程教學的建議
1、課程課時較緊,課堂上的練習時間較少,講解的東西越多,頭腦有時就很混亂。
2、感覺上課時的氣氛不是很好,雖然大部分人都在聽,可是效果不是很好。所以希望老師能在授課中間能穿插一些活躍課堂氛圍的話題,可以是大家都非常關心的一些內容,這樣既讓大家能在思考之余有一個放松,也能夠提高學生的學習積極性和學習效率。
3、學習的積極性很重要,有時候我們花了很長時間去寫實驗報告,也很認真的去理解去掌握,可是最后實驗報告可能就只得了一個C,抄的人反而得A,這樣的話很容易打擊學生的積極性,在后面的實驗報告中沒動力再去認真寫。所以希望老師能在這方面有所調整。
4、雖然講課的時間很緊,但是還是希望老師能在講述知識點的時候能運用實際的調試程序來給我們講解,這樣的話能讓我們對這些內容有更深刻的印象和理解。
第五篇:數據結構與算法個人總結
數據結構與算法
重點內容:排序運算的算法、檢索運算的算法,本部分所占分值較高,在11分左右; 考試點:數據順序存儲與鏈式存儲、棧與隊列的操作、二叉樹的存儲及遍歷(或周游)、霍夫曼算法及其應用、各類排序算法;
知識部分: 1.數據結構的內容:
數據的邏輯結構:分為線性結構和非線性結構
數據的存儲結構: 是數據的邏輯結構在存儲器里的實現;
數據的運算:插入、刪除、排序、查找等; 2.數據的存儲結構分為:順序存儲結構和鏈式存儲結構。3.單鏈表與雙鏈表的插入與刪除這里不再贅述,百度一下吧!
4.棧與隊列的基本運算有:插入、刪除、讀取頭元素到變量中,原棧或隊列保持不變、判斷是否為空、將棧或隊列置為空
5.串的基本運算有:鏈接、賦值、求長度、全等比較、求子串、求子串的位置及替換等。6.廣義表:廣義表是線性表的推廣,也稱列表。
廣義表的特點:
廣義表的元素可以使字表,且字表的元素還可以是字表;
廣義表可以被其他廣義表所共享;
廣義表可以是遞歸的表,機本身的一個字表;
7.多維數組與稀疏矩陣的存儲比較復雜,請用百度查找相關內容,不再贅述;
8.樹:樹并不重要,重要的知識點是二叉樹,對樹理解不透徹的同學,請用百度搜索。9.二叉樹:
二叉樹的重點內容包括:
二叉樹的遍歷:中序遍歷、前序遍歷、后續遍歷;(重點考察)完全二叉樹(定義):在一棵二叉樹中,若最多只有最下面兩層的節點數可小于2,且最下面一層的節點集中于最左邊的位置,則稱此二叉樹為完全二叉樹; 樹的先根次序周游對應于二叉樹的前序周游(遍歷),樹的后根次序周游對應于二叉樹的中序周游(遍歷)
10.二叉樹的存儲結構:鏈式存儲結構與順序存儲結構。
二叉樹的鏈式存儲:
是指二叉樹的各節點隨機存儲在內存空間中,節點之間的關系用指針標示;
二叉樹鏈表的節點包括三個:左指針,數據域,右指針;其中左指針指向左子節點,有指針指向右子節點;也可以是指一個父指針(parent)用于指向父節點; 二叉樹鏈表的重要知識點:一個n節點的二叉樹鏈表,有n+1個空指針域;
二叉樹的順序存儲:
二叉樹的順序存儲就是按一定的次序,用一組地址連續的存儲單元存儲二叉樹的節點元素;
完全二叉樹的順序存儲的性質:
用數組A[1….n]順序存儲完全二叉樹的各節點,則當i>0,且i<=[(n-1)/2]時,節點A[I]的右子女是節點A[2i+1],否則節點A[I]沒有右子女;同理當i>0且I<=[n/2],節點i的左子女節點是2i,否則沒有!11.哈夫曼樹: 基本定義術語:
節點的路徑長度:從根節點到該節點的路徑上分支的數目;
樹的路徑長度:樹中所有的節點的路徑長度之和;
哈夫曼樹:在有n個葉子節點,并帶有相同權值的二叉樹中,必定存在一個二叉樹,使其帶權路徑長度最短,這樣的二叉樹被稱為“最優二叉樹”或“哈夫曼樹”
如下圖:
12.排序算法:
常考的排序算法有:插入排序、冒泡排序、選擇排序、快速排序、堆排序
插入排序: 首先先建立一個空列表,然后放入一些已排序的有序數列(自定),然后然后從原列表中取出一個數,并放入新列表,仍使新列表保持有序;重復這個動作直到原列表為空;
冒泡排序:顧名思義,就像冒泡一樣(可以從小到大,也可以從大到小),大的升上去,小的降下來。首先將所有元素放入工作列表中,從列表的第一位數字到倒數第二位數字,逐個比較一個數和它的下一位,如果這個數大于它的下一位,則將它和它的下一位交換,重復該 步驟,直到不能交換
選擇排序:設數組中存儲了n個待排序數字,從數組中找到最小值和最大值分別放在數組的最左邊和最右端,然后選出次小值和次大值放到左數第二位和右數第二位,……,最后建立完整的順序;
快速排序:這是一種高效排序方法:
實踐證明,快速排序是所有排序算法中最高效的一種。它采用了分治的思想:先保證列表的前半部分都小于后半部分,然后分別對前半部分和后半部分排序,這樣整個列表就有序了。這是一種先進的思想,也是它高效的原因。因為在排序算法中,算法的高效與否與列表中數字間的比較次數有直接的關系,而“保證列表的前半部分都小于后半部分”就使得前半部分的任何一個數從此以后都不再跟后半部分的數進行比較了,大大減少了數字間不必要的比較。但查找數據得另當別論了。
堆排序:與前面的算法都不同,它是這樣的:
首先新建一個空列表,作用與插入排序中的“有序列表”相同。
找到數列中最大的數字,將其加在“有序列表”的末尾,并將其從原數列中刪除。
重復2號步驟,直至原數列為空。
堆排序的平均時間復雜度為nlogn,效率高(因為有堆這種數據結構以及它奇妙的特征,使得“找到數列中最大的數字”這樣的操作只需要O(1)的時間復雜度,維護需要logn的時間復雜度),但是實現相對復雜(可以說是這里7種算法中比較難實現的)。
看起來似乎堆排序與插入排序有些相像,但他們其實是本質不同的算法。至少,他們的時間復雜度差了一個數量級,一個是平方級的,一個是對數級的。
算法的時間復雜度:
平均時間復雜度
插入排序 O(n2)
冒泡排序 O(n2)
選擇排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
歸并排序 O(n log n)
基數排序 O(n)
希爾排序 O(n1.25)