【大話資料結構】 部分讀書筆記

來源:互聯網
上載者:User

標籤:

 

 

章節 筆記
1.資料結構緒論
  1. 資料結構:相互之間存在一種或多種特定關係的資料元素集合。

  2. 資料:是描述客觀事物的符號,電腦可以操作的對象,符號集合。

  3. 資料元素:是組成資料的、有一定意義的基本單位,也稱為記錄。如人類中的人。

  4. 資料項目:一個資料元素可以由若干個資料項目組成。如人的眼、耳。是不可分割的最小單位。

  5. 資料對象:是性質相同的資料元素的集合,是資料的子集。如人都有姓名等相同的資料項目。

  6. 邏輯結構:是指資料對象中資料元素之間的相互關係。含集合(無關聯)、線性(一對一)、樹形(一對多層次關係)、圖形(多對多)。

  7. 物理結構:是指資料的邏輯結構在電腦中的儲存形式。含順序儲存結構(地址連續的儲存單元,邏輯關係物理關係一致 數組)、鏈式儲存結構(存放在任意單元,可連續或不連續,無法反映邏輯關係,需要指標存放資料元素地址)。

  8. 資料類型:是指一組性質相同的值的集合及定義在此集合上的一些操作的總成,如整型。

  9. 抽象資料類型:是指一個數學模型及定義在該模型上的一組操作,如座標點,馬里奧(資料元素間邏輯關係、相關操作等)。

  10. 資料-->資料對象-->資料元素-->資料項目。

2.演算法
  1. 演算法:是解決特定問題求解步驟描述,在電腦中表現為指令的有限序列,並且每條指令表示一個或多個操作。

  2. 演算法特性:輸入(0或多個)、輸出(1個或多個)、有窮性(不會無限迴圈)、確定性(精準)和可行性(有限次數完成)。

  3. 演算法要求:正確性、可讀性、健壯性、高效率、低儲存。

  4. 演算法效率度量方法:事後統計方法(測試資料)、事前分析估算方法(策略、代碼品質、輸入規模、指令速度)。

  5. 一個程式的已耗用時間,依賴於演算法的好壞和問題的輸入規模,用基本運算元量表示成輸入規模的函數(如f(n)=n的2次方)。

  6. 函數漸進增長:給定2個函數f(n)[2n^3+1]和g(n),如果存在一個整數N,使得對於所有的n>N,f(n)總是比g(n)大,那麼就說f(n)的增長漸進快於g(n)。

  7. 判斷一個演算法效率時,函數中的常數和其他次要項常常可以忽略,而應該關注主項(最高階項的階數,n^x中的x),隨著n增加一個演算法會越來越優於或差於另一個演算法。

  8. 時間複雜度定義:語句的總執行次數T(n)是關於問題規模n的函數,進而隨n變化分析T(n)數量級。演算法的時間複雜度,也就是演算法的時間量度,記座T(n)=O(f(n))。它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱為時間複雜度。

  9. 推導大O階方法:1.用1取代所有加法常數;2.修改後的運行次數函數中,只保留最高階項;3.如果不是1則去除相乘的常數。就能得到大O階。

  10. 常數階:不會隨著n的變化而發生變化,其時間複雜度總是為O(1)。

  11. 線性階:分析迴圈結構中的運行情況,確定某個特定語句或語句集啟動並執行次數,如果只有一個迴圈且記憶體為O(1)的複雜度,則此演算法時間複雜度為O(n);

  12. 對數階:O(logn)表示,log為對數標誌( )。

  13. 平方階:比如嵌套迴圈,如內外迴圈次數相同O(n^2)、內外迴圈次數不同O(m*n)。

  14. 常用時間複雜度耗時從小到大排序:O(1)常數階<O(logn)對數階<O(n)線性階<O(n^2)平方階<O(n^3)立方階<O(2^n)指數階<O(n!)階乘階<O(n^n)。

  15. 對演算法分析有2中方法:1.是計算所有情況的平均值,稱為平均時間複雜度;2.是計算最壞情況下的複雜度,稱為最壞時間複雜度。一般均指最壞時間複雜度。

  16. 演算法空間複雜度:通過計算演算法所需的儲存空間實現,演算法空間複雜度的計算公式記作:S(n)=O(f(n)),其中n為的規模,f(n)為語句關於n所佔儲存空間的函數。

3.線性表
  1. 線性表:零個或多個資料元素的有限序列,第一個元素無前驅,最後一個元素無後繼,中間元素均知曉前驅和後繼。用線性表的個數n(n>=0)定義為線性表的長度,當n=0時稱為空白表。

  2. 線性表產用操作:初始化空表、判斷是否為空白、清空、擷取指定位置元素、尋找元素是否存在、插入、刪除、返回元素個數。

  3. 線性表的順序儲存結構,指的是用一段地址連續的儲存單元依次儲存線性表的資料元素,其實位置、最大容量、當前長度。

  4. 數組長度是存放線性表的儲存空間的長度,不可變的。線性表的長度是其中元素的個數,可變的。

  5. LOC表示獲得儲存位置的函數,隨機儲存結構的效能為O(1) 

  6. 線性表的順序儲存結構讀、寫的複雜度為O(1),插入或刪除為O(n)。優點:無需額外空間,快速存取;缺點:插入刪除要移動大量元素,當長度變化大時難以確定空間容量,造成儲存空間片段。

  7. 單鏈表:儲存映像包含資料域和指示後繼資訊位置的指標(或鏈),n個節點(a下標i的儲存映像)連結組成一個鏈表,即為線性表的鏈式儲存結構,因每個節點中只含一個指標域,所以叫做單鏈表。對於插入或刪除資料頻繁的操作,單鏈表比線性表效率高。

  8. 頭指標是鏈表只想第一個的指標,前端節點是放在第一個元素節點之前的節點(可有可無,方便對第一個節點的統一操作)。

  9. 單鏈表插入刪除:從第一個節點開始尋找,當到指定位置後,將節點指標執行後繼的後繼或新增節點地址,然後取值釋放記憶體。

  10. 單鏈表建立有頭插法和尾插法,刪除的話要從頭開始先將next對象賦值給臨時變數後釋放對象,然後繼續下一個next的刪除。

  11.  

  12. 線性表分為順序儲存結構可隨機存取如數組通過下標得到值稱為順序表,鏈式儲存的線性表稱為單鏈表是順序存取,因為要通過指標域尋找下一個元素。

  13. 如果元素個數已知,且插入刪除較少應用順序結構,若頻繁增刪且個數未知則應用鏈式結構。

  14. 用數組描述的鏈表叫做靜態鏈表(是給無法操作指標的進階語言設計的一種實現單鏈表能力的方法)。優點:插入刪除時只需要修改遊標;缺點:無隨機讀取及長度難以確定。

  15. 迴圈鏈表:將單鏈表中終端節點的指標端由null 指標改為指向前端節點(可有可無前端節點),形成一個環稱為單迴圈鏈表。

  16. 雙向鏈表:在單鏈表的每個節點中,再設定一個指向其前驅節點的指標域。

4.棧與隊列
  1. 棧(stack)是限定僅在表尾進行插入和刪除操作的線性表(彈夾),隊列是只允許在一端進行插入操作、而在另一端進行刪除操作的線性表。

  2. 允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),棧又稱為後進先出的線性表LIFO結構。插入(push)叫作壓棧、入棧,刪除(pop)叫作出棧、彈棧。

  3. 棧的順序儲存O(1):順序棧將下標為0的一端作為棧底,若棧長度為StackSize則top必須小於他,空棧判定條件為top等於-1。

  4. 若一端增加一端減少則可使棧橫向結合共用空間。

  5. 棧的鏈式儲存結構O(1):鏈棧,無需前端節點,top=null為空白棧,棧頂放在單鏈表頭部,不存在棧滿情況。

  6. 如果棧在使用過程中元素變化不可預料最好用鏈棧,如果變化在可控範圍則用順序棧。

  7. 棧應用:1.遞迴(斐波那契數列,前面2數和是下一個數);2.四則運算(1.符號在中間的角中綴運算式;2.運算子在2個數之後的角尾碼運算式,逆波蘭)。

--------------------------------------------------------------------------------------

  1. 隊列是一種先進先出的線性表,簡稱(First in First Out,FIFO),允許插入的一端為隊尾,允許刪除的為隊頭。

  2. 隊列的順序儲存:順序儲存每次刪除一個元素後,後續所有元素均要前移以為,使用2個指標指向隊頭隊尾的話則可能出現假溢出現象。

  3. 隊列順序儲存的迴圈隊列:為解決假溢出,把隊列的頭尾相接的順序儲存結構稱為迴圈隊列。

  4. 隊列滿的條件(front指向隊頭指標,rear指向下一個可用位置指標):(rear-front+QueueSize)%QueueSize==front,(rear可能比front大,也可能比front小)。

  5. 鏈隊列:隊列的鏈式儲存結構,其實就是線性表的單鏈表,只不過它只能尾進頭出而已。

  6. 在可以確定隊列長度最大值的情況下,建議用迴圈隊列,否則用鏈隊列。

  7. 棧:順序棧(兩棧共用空間)、鏈棧;隊列:順序隊列、迴圈隊列、鏈隊列。

5.串
  1. 串:string是由零個或多個字元組成的有限序列,又名叫字串。

  2. ASCII通過8位二進位表示一個字元共256個字元,能滿足英文,Unicode為16位65萬字元含各民族文字。

  3. 串中元素僅由一個字元組成,相鄰元素具有前驅和後繼關係。

  4. 串的順序儲存結構:用一組地址連續的儲存單元來儲存串中的字元序列,一般用定長數組來定義。

  5. 串的鏈式儲存結構:一個節點儲存多個字元,最後一個節點未佔滿時可用特殊字元補全,總體不如順序儲存。

  6. 樸素的模式比對演算法:子串的定位操作通常稱為串的模式比對。最壞複雜度O((n-m+1)*m)。

  7. KMP(克努特、莫裡斯、普拉特)模式比對演算法:根據子串重複度自動跳過已匹配過的主串位置。

6.樹
  1. 樹:Tree是n(n>=0)個節點的有限集。n=0時稱為空白樹。在任意一棵非空樹中:1.有且僅有一個特定的稱為根(Root)的節點;2.當n>1時,其餘節點可分為m(m>0)個互不相交的有限集T1、T2,其中每一個集合本身又是一棵樹,並且稱為根的子樹(SubTree)。

9.排序
  1. 排序的穩定性:若排序前r1領先r2,如果排序後r1仍領先r2則為穩定的,反之排序方法是不穩定的。

  2. 內排序:所有記錄放在記憶體中;外排序:記憶體外多次資料交換。

  3. 冒泡排序、簡單選擇排序和直接插入排序屬於簡單演算法,而希爾排序、堆排序、歸併排序、快速排序為改進演算法。

  4. 冒泡排序:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。最小順序表O(n)最大逆序表O(n^2);

  5. 簡單選擇排序演算法:就是通過n-i次關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和i(1<=i<=n)個記錄交換之。複雜度為O(n^2),效能上優於冒泡演算法。

  6. 直接插入排序:將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。效能好於冒泡和簡單選擇排序的效能。

  7. 希爾排序演算法:將元素根據一個增量進行分組,對分組進行插入排序,然後合并分組後再進行插入排序。

  8. 堆是具有下列性質的完全二叉樹:每個結點的值都大於或等於其左右孩子的值,稱為大頂堆;或每個結點的值都小於或等於其左右孩子節點的值,成為小頂堆。

  9. 歸併演算法:兩兩組合成有序表,然後再和其他兄弟表組合,直到合并為一個有序表。

  10. 快速排序:通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄進行繼續排序,以達到整個序列有序的目的。

   
   

【大話資料結構】 部分讀書筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.