數據結構知識點歸納

1.數據結構的定義:
  數據在計算機中的組織。包括邏輯結構,存儲結構,數據運算。
  邏輯結構:與具體的計算機無關。
  一、順序表:
  線性表(a1,a2…,an)有唯一的第一個和最後一個元素(n≥0)。其餘的有唯一的前驅和後繼。
  順序表定義:用一組地址連續的存儲單元依次存放的數據元素。
  在順序表的第i個位置前插入一個數據元素,需要向後移動n - i +1個元素,刪除第i個位置的元素需要向前移動n- i個元素。
  二、棧和隊列
  1.棧:允許在表的一端插入和刪除的線性表。棧底,不允許操作,棧頂,允許操作。
  棧的操作原則:LIFO後進先出
  【例】設進棧順序是(a,b,c,d),不可能的出棧序列是:( C )
  A. (a,b,c,d) B.(a,c,b,d)  C. (a,d,b,c)  D. (d,c,b,a)
  2.隊列:允許在表的一端插入,另一端刪除的線性表
  隊尾:插入端 隊首:刪除端
  隊列的操作原則:FIFO先進先出
  三、數組:
  1.數組的定義:
  A.一維數組:具有相同特性的元素集合。A[4] 數組元素下標A[0] A[1] A[2] A[3]
  B.二維數組 矩陣 A= {a11 a12
  a21 a22
  a31 a32}
  C語言 A = {a[0][0] a[0][1]
  a[1][0] a[1][1]
  a[2][0] a[2][1]}
  矩陣下界爲1。C語言中二維數組下界爲0。如A[3][2] 指3行2列。
  C. 存儲方式:行優先次序(行主)
  設一個數據元素佔S個存儲單元
  二維數組尋址公式:a[m][n]
  LOC(a[i][j])= LOC(a[0][0])+(i×n+j)×s
  a[i][ j]指存放相應元素的首地址
  【例】二維數組A[4][3],首地址A[0][0]是SA,每個元素佔2個存儲單元,按行優先次序,求A[3][2]與A[2][1]存放地址。
  解: A[3][2]:SA+(3×3+2)×2 = SA+22  A[2][1]: SA+(2×3+1)×2=SA+14
  2.下三角矩陣壓縮存儲方法:(下三角是非0元素,其餘爲0。)
  A = { a11      0
  a21 a22    0
  a31 a32 a33   0
  a41 a42 a43 a44 0}
  n階下三角矩陣元素個數:(n+1)n/2
  n階下三角矩陣壓縮存儲於一維數組F(m) ,則 m=(n+1)n/2
  F數組
  A11 A21 A22 A31 A32 A33 A41 A42 A43 A44
  0 1 2 3 4 5 6 7 8 9
  3.稀疏矩陣的三元組表示: 非0元素相對較少,且無規律。
  A = { 3 0 1 0
  0 0 2 0
  0 0 0 0
  0 1 0 0
  0 0 0 1}
  描述一個非零元素的(r行c列v值)三元組
  稀疏矩陣的三元組表:按行優先次序進行轉換
  r c v
  5 4 5
  1 1 3
  1 3 1
  2 3 2
  4 2 1
  5 4 1
  轉置矩陣
  A-= {3 0 0 0 0
  0 0 0 1 0
  1 2 0 0 0
  0 0 0 0 1}
  R C V
  4 5 5
  1 1 3
  2 4 1
  3 1 1
  3 2 2
  4 5 1
  四、樹和二叉樹
  1.樹的定義和術語
  n≥0個結點的有限集合。
  n>0 有且只有一個根結點,其餘結點分爲m≥0個互不相交的有限集T1~Tm 。
  每個集合Ti又是一棵樹。稱爲根的子樹。
  雙親,子女,祖先,子孫。
  兄弟:同一個雙親的子女互爲兄弟。
  結點的度: 結點的子樹數目。
  樹的度:結點度的最大值
  葉結點: 度爲0的節點
  分支結點:度不爲0的節點
  結點的層次:根結點在第一層。其它結點層次=雙親層次+1
  樹高度(深度):樹的葉子的最大層次
  例: 設在樹中結點X是結點y的雙親時,用(x,y)表示樹中的邊。邊的集合是{(a,b),(a,c), (a,d) , (b,e) ,(b,f) ,(c,g) ,(d,h), (d,i)  ,(d,j) },用樹形表示法畫出此樹。
  2.二叉樹
  性質:
  1.二叉樹中i層(i>=1)上最多有2 i—1個結點
  2.高度爲k的二叉樹最多有2 k –1個結點
  3.滿二叉樹,高度爲k的二叉樹具有2 k–1個結點
  4.完全二叉樹
  層次編號: 滿二叉樹按自頂向下,從左到右的次序進行編號。
  n個結點的完全二叉樹結點的排列順序與滿二叉樹的層次編號次序一一對應(滿二叉樹是完全二叉樹的子集)
  完全二叉樹的特點:
  ①除最高層可以不滿外,其餘層都充滿結點,每一層結點的個數是上一層結點個數的兩倍。最高層上的結點集中在左部。
  ②完全二叉樹中,如果一個結點沒有左子女,就一定是葉結點
  ③高度爲k的完全二叉樹最少有2 k-1個結點。
  ④層次編號爲i 的結點:
  雙親:若 i =1爲根,無雙親。否則雙親爲 [i/2] 。
  [i/2]指不≥i/2的最大整數。下取等。
  左子女:若2i>n則無左子女,否則左子女是2i。
  右子女:若2i+1>n則無右子女,否則右子女是2i+1。
  5.二叉樹的遍歷
  先序遍歷:根,左,右
  中序遍歷:左,根,右
  後序遍歷:左,右,根
  層次遍歷:訪問根,再從左到右訪問第i層上的結點。
  先序序列:ABDFICEJGH
  中序序列:DBFIAEJCHG
  後序序列:DIFBJEHGCA
  層次序列:ABCDFEGIJH
  6.樹與二叉樹的轉換
  樹轉換成二叉樹:
  1.加線:從左子女起,沿右子女之間加線。
  2.抹線:抹除雙親至右子女之間的連線。
  3.調整: 旋轉45°
  4.轉換後根結點一定沒有右子。因爲無右鄰兄弟。
  二叉樹還原爲樹:
  1.加線:從左子女起,沿右子女走,與雙親之間加線。
  2.抹線:抹除左子女與右子女之間的連線。
  3.調整: 端平。
  森林與二叉樹之間的轉換與還原
  森林:n棵樹的集合。n≥0
  1.先將每棵樹轉成二叉樹。
  2.根結點之間連線
  3.旋轉45°
  森林:若第一棵樹m1個結點,第二棵樹m2個,第三棵樹m3個結點。則左子樹爲m1-1個結點,右子樹爲m2 + m3 個結點。
  二叉樹 →  森林
  還原方法:
  ①根+左子樹還原成第一棵樹
  ②根的右子樹作爲新的二叉樹
  ③重複①②
  二叉樹的遍歷與轉換森林
  5.查找
  二分法查找
  前提:順序存儲的有序表
  基本思想:待查值與中間元素比較:m= ( i + j ) /2
  例{10,15,22,36,45,52,63,96}
  1  2  3  4  5  6  7  8
  i :待查子表起始位置。 j :待查子表結束位置。
  r[m](m位置的元素)
  k = r[m] 查找成功
  k < r[m] 繼續在表的前半查找,j = m-1 [j爲表尾]
  k>r[m]繼續在表的右半查找 i = m+1  [i爲表頭]
  當待查子表爲空,則查找失敗。
  平均檢索長度 = 總比較次數/元素個數
  ( ASL )
  比較次數  元素個數
  1 1 =2 0
  2 2 =2 1
  3 4 =2 2
  4 1 = 總數-(2 n-1-1) =8-(2 3-1)
  ASL = (1×1+2×2+3×4+4×1)/ 8 = (1+4+12+4)/8 = 21/8
  【例】將有序表存於A[20],比較4次,5次查找成功的元素個數爲  8 , 5 。
  ASL= (1×1+2×2+3×4+4×8+5×5)/ 20 = (1+4+12+32+25)/20 = 3.7
  6. 散列法
  d  = H  ( key )
  散列 散列  鍵值
  地址 函數
  衝突:用散列函數給不同值算出的地址相同。
  解決思路:先來先佔位。從散列地址開始順次找空位。(直到有空位爲止)
  d i = ( h (key) +i ) % m   i = 1,2,3,………m ( m爲表長)
  【例】散列函數h(key)=key%7,散列地址空間爲0到9,用線性探查法處理衝突。
  給定鏈值序列爲{6,21,41,40,18,9,16,27},畫出散列表。
  解:{6,21,41,40,18,9,16,27}
  d=6,0, 6, 5, 4 ,2,2, 6
  7.排序:將序列按從小到大的次序排列一次。
  給定的整數序列{40,32,58,34,20,90,98,18},請寫出直接選擇排序,直接插入排序,起泡排序和歸併排序的第一趟排序結果:
  直接選擇:一趟結果(選最小值與第一個元素進行交換)
  {18,32,58,34,20,90,98,18}
  直接插入一趟結果:(將前兩個元素進行排序)
  {[32,40],58,34,20,90,98,18}
  起泡排序:(順次兩兩鍵值進行比較,逆序則交換)
  {32,40,34,20,58,90,18,98}
  歸併排序:(兩兩相鄰的元素進行排序)
  {[32,40],[34,58],[20,90],[18,98]}

發佈了37 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章