02142數據結構導論複習筆記

第一章 概論

  • 概論⭐⭐
    • 數據結構:計算機組織數據存儲數據的方式。
    • 數據結構:指一組相互之間存在一種或多種特定關係的數據的組織方式和它們在計算機內的存儲方式,以及定義在該組數據上的一組操作
  • 引言⭐⭐
    • 算法+數據結構=程序
  • 數據、數據元素和數據項⭐⭐⭐
    • 數據:所有被計算機存儲、處理的對象。
    • 數據元素:數據的基本單位,是運算的基本單位。常常又簡稱爲元素。
    • 數據項:是數據的不可分割的最小標識單位。在數據庫中數據項又稱爲字段。
    • 數據、數據元素、數據項之間的關係:從宏觀上來看,數據、數據元素和數據項實際上反映了數據組織的三個層次,數據可由若干個數據元素組成,而數據元素又可由若干數據項組成。
    • 數據結構是相互之間存在一種或多種特定關係的數據元素的組合。它包括數據的邏輯結構、數據的存儲結構和數據的基本運算
  • 數據的邏輯結構⭐⭐⭐
    • 集合:任意兩個結點之間都沒有鄰接關係,組織形式鬆散。(一盤散沙)
    • 線性結構:結點按邏輯關係依次排列形成一條“”,結點之間一個一個依次相鄰接。
    • 樹形結構:具有分支、層次特性,其形態像自然界中的樹,上層的結點可以和下層多個結點相鄰接,但下層結點只能和上層一個結點相鄰接。
    • 圖結構最複雜,其中任何兩個結點都可以相鄰接
  • 數據的存儲結構⭐⭐⭐
    • 順序存儲方式:指所有存儲結點存放在一個連續的存儲區裏。利用結點在存儲器中的相對位置來表示數據元素之間的邏輯關係。
    • 鏈式存儲方式:指每個存儲結點除了含有一個數據元素外,還包含指針,每個指針指向一個與本結點有邏輯關係的結點,用指針表示數據元素之間的邏輯關係。
    • 除了上述兩種存儲方式之外 ,還有索引存儲方式和散列存儲方式。但主要的存儲方式是:順序存儲方式和鏈式存儲方式。
  • 運算⭐
    • 運算包括:建立、查找、讀取、插入和刪除等。
    • 線性表、棧和隊列中的元素具有相同的邏輯結構(即線性結構),但有不同的運算集,它們是不同的數據結構。
  • 評價算法好壞的因素⭐⭐⭐
    • 正確性:能正確地實現預定的功能,滿足具體問題的需要。
    • 易讀性易於閱讀、理解和交流,便於調試、修改和擴充。
    • 健壯性:即使輸入非法數據,算法也能適當地做出反應或進行處理,不會產生預料不到的運行結果。
    • 時空性:指該算法的時間性能(或時間效率)和空間性能(或空間效率),前者是算法包含的計算量,後者是算法需要的存儲量
  • 時間複雜度⭐⭐⭐
    • 常見的時間複雜度的比較:
      • O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(nc)<O(2n)
        • O(1) 無循環、無遞歸
        • O(log2n) 無循環、有遞歸
        • O(n) 一層循環
        • O(nlog2n) 一層循環+遞歸
        • O(n^2) 雙層循環
        • O(n^c) c層循環
        • O(2^n) 實際不可計算的。
  • 空間複雜度⭐
    • 是對一個算法在運行過程中臨時佔用存儲空間大小的量度。存儲空間量應包括:
      • 程序代碼所佔用的空間;
      • 輸入數據所佔用的空間
      • 輔助變量所佔用的空間,估算時,一般只需要分析輔助變量所佔用的空間。

第二章 線性表

  • 線性表的基本概念⭐⭐
    • 概念:線性表是一種線性結構,由n(n≧0)個數據元素組成的有窮序列,數據元素又稱結點。結點個數 n 稱爲表長。a1稱爲起始節點,an稱爲終端結點。
    • 基本特徵:線性表中結點具有一對一的關係,如果結點數不爲零,則:
      • 除起始結點沒有直接前驅外,其他每個結點有且僅有一個直接前驅
      • 除終端結點沒有直接後繼外,其他每個結點有且僅有一個直接後繼
  • 順序表實現算法的分析⭐⭐⭐
  • 單鏈表的類型定義⭐⭐⭐
    • 結點結構
      • 數據域(data),用於存儲線性表的一個數據元素
      • 指針域或鏈域(next),用於存放一個指針,該指針指向本結點所含數據元素的直接後繼結點。
    • 單鏈表:所有結點通過指針鏈接形成鏈表。
      • 頭指針:head稱爲頭指針變量,該變量的值是指向單鏈表的第一個結點的指針。
      • 首結點:鏈表中第一個數據元素稱爲鏈表的首結點。
      • 尾結點:鏈表中最後一個數據元素結點稱爲尾結點或終端結點。尾結點指針域的值NULL稱爲空指針,它不指向任何結點,表示鏈表結束。
    • 帶頭結點的單鏈表:在單鏈表的第一個結點之前增設一個類型相同的結點,稱爲頭結點。
  • 線性表的基本運算在單鏈表上的實現⭐⭐⭐
    • 插入:插入p指向新結點的操作
      • ① p->next=q->next; ② q->next=p;
    • 刪除:刪除*p結點的操作
      • q->next=p->next;
  • 循環鏈表⭐⭐
    • 在單鏈表中,如果讓最後一個結點的指針域指向第一個結點可以構成循環鏈表。
      • 判斷p所指結點的尾結點的條件:p->next==head;
      • 判斷指針p所指結點爲首結點的條件:p==rear->next->next;
      • 判斷鏈表是否爲空的條件:head->next==head;
  • 雙向循環鏈表⭐⭐⭐
    • 每個結點有兩個指針,next指針指向直接後繼結點;prior指針指向直接前驅結點。
    • 帶頭結點的雙向循環鏈表L爲空的條件:(L->next==L) && (L->prior==L)
    • 刪除
      • 設p指向待刪結點,刪除*p的操作:
        • p->prior->next=p->next;
        • p->next->prior=p->prior;
        • free(p)
        • 以上前兩條語句順序可顛倒。
    • 插入
      • 在p所指結點的後面插入一個新結點 *t 的操作:
        • t->prior=p;
        • t->next=p->next;
        • p->next->prior=t;
        • p->next=t;
  • 順序實現與鏈接實現的比較⭐

第三章 棧、隊列和數組

  • 棧、隊列和數組⭐⭐

    • 棧和隊列可看作是特殊的線性表。它們是運算受限的線性表。棧和隊列也同樣有兩種存儲結構(順序存儲結構和鏈式存儲結構)。
  • 棧的基本概念⭐⭐⭐

    • 棧:這種線性表上的插入和刪除運算限定在表的某一端進行。允許進行插入和刪除的一端稱爲棧頂,另一端稱爲棧底。不含任何數據元素的棧稱爲空棧
    • 棧的修改原則:後進先出,棧又稱爲後進先出線性表,簡稱後進先出表。
    • 棧的基本運算:
      • 初始化 InitStack(S):構建一個空棧S;
      • 判棧空 EmptyStack(S):若棧S爲空棧,則結果爲1,否則結果爲0;
      • 進棧 Push(S, x):將元素 x 插入到棧S中,使x成爲棧S的棧頂元素;
      • 出棧 Pop(S):刪除棧頂元素;
      • 取棧頂 GetTop(S):返回棧頂元素。
  • 棧的順序實現⭐⭐

    • 下溢:當空棧,棧頂下標值 top=0,如果此時做出棧運算,則產生“下溢”。
    • 上溢:當棧中的數據元素已經填滿了,如果再進行進棧操作,會發生“上溢”。
    • 初始化:
    • 判棧空:
    • 進棧:
    • 出棧:
    • 取棧頂元素:
  • 隊列的基本概念⭐⭐⭐

    • 是一種先進先出的線性表,新加入的數據元素插在隊列尾端,出隊列的數據元素在隊列首部被刪除。
  • 隊列的順序實現⭐⭐⭐

    • 循環隊列:爲了避免元素的移動,將存儲隊列元素的一維數組首尾相接,形成一個環狀。
    • 入隊列操作語句:SQ.rear=(SQ.rear+1) % maxsize; SQ.data[SQ.rear]=x;
    • 出隊列賦值語句:SQ.fronts(SQ.front+1) % maxsize;
    • 循環隊列滿:((CQ.rear +1) % maxsize == CQ.front) 成立
    • 隊列空條件:(CQ.rear==CQ.front) 成立
    • 隊列中元素個數公式:數組Q[n] 表示一個循環隊列,設 f 爲隊列中第一個元素的位置,r 爲隊列中實際隊尾的位置加1,則隊列中元素的個數公式:(r-f+n) %n
  • 隊列的鏈接實現⭐

    • 由於鏈接實現需要動態申請空間,故鏈隊列在一定範圍內不會出現隊列滿的情況。
    • 隊列判空:當 (LQ.front==LQ.rear) 成立時,隊列中無數據元素,此時隊列爲空
    • 在實現隊列的鏈表結構中,僅設置尾指針的單循環鏈表的時間複雜度最優
  • 數組的存儲結構⭐⭐⭐

    • 數據元素的存儲位置是下標的線性函數:對於二維數組 a[m][n],如果每個元素佔 k 個存儲單元,以行爲主序爲例,討論數組元素 a[i][j]位置與下標的關係:
      • 由於下標從0開始,元素a[i][j]之前已經有 i 行元素,每行有n個元素,在第 i 行,有 j+1 個元素,總共有 n*i+j+1 個元素,第一個元素與 a[i][j] 相差 n*i+j+1-1 個位置,故a[i][j] 的位置爲:loc[i, j]=loc[0, 0]+(n*i+j)*k
  • 矩陣的壓縮存儲⭐⭐⭐

    • 爲了節省存儲空間,對這類矩陣採用多個值相同的元素只分配一個存儲空間,零元素不存儲的策略,這一方法稱爲矩陣的壓縮存儲。
    • 特殊矩陣:如果值相同的元素或者零元素在矩陣中的分佈有一定規律,稱此類矩陣爲特殊矩陣。
      • 對稱矩陣:若一個 n 階方陣A中的元素滿足下述條件:則稱A爲對稱矩陣。
        • 對稱矩陣有近一半的元素可以通過其對稱元素獲得,爲每一對對稱元素只分配一個存儲單元,則可將n2個元素壓縮存儲到含有n(n+1)/2個元素的一維數組中。
      • 三角矩陣:以主對角線爲界的上(下)半部分是一個固定的值c或零,這樣的矩陣叫做下(上)三角矩陣。(哪邊不爲c或0就是該方向的三角矩陣)
      • 稀疏矩陣:非零元素很少的矩陣。
      • 三元組表示法:用三個項來表示稀疏矩陣中的非零元素aij,即(i, j, aij),其中 i 表示行序號,j 表示列序號,aij 是非零元素的值,通常稱爲三元組。

第四章 樹和二叉樹

  • 樹的概念⭐

    • 樹是n(n≥0)個結點的有限集合,一棵樹滿足以下兩個條件:
      • 當n=0時,稱爲空樹
      • 當n>0時,有且僅有一個稱爲根的結點,除根結點外,其餘結點分 m(m≥0)個互不相交的非空集合 T1, T2, ..., Tm,這些集合中的每一個都是一棵樹,稱爲根的子樹。
  • 樹的相關術語⭐⭐⭐

    • 結點的度:樹上任一結點所擁有的子樹的數目稱爲該結點的度。
    • 葉子:度爲0的結點稱爲葉子或終端結點。
    • 樹的度:一棵樹中所有結點的度的最大值稱爲該樹的度。
    • 一個結點的子樹的根稱爲該結點的孩子(或稱子結點)。相應地該結點稱爲孩子的雙親(也稱父結點)。父結點相同的結點互稱爲兄弟
    • 結點的層次:從根開始算起,根的層次爲1,其餘結點的層次爲其雙親的層次加1。
    • 樹的高度:一棵樹中所有結點層次數的最大值稱爲該樹的高度或深度。
    • 對於任一個樹都有:結點數=分支樹+1
  • 二叉樹的基本概念⭐

    • 二叉樹是n(n≥0)個元素的有限集合,該集合或者爲空,或者由一個根及兩棵互不相交的左子樹和右子樹組成,其中左子樹和右子樹也均爲二叉樹。
    • 注意:左右子樹次序不可換,都可爲空
  • 二叉樹的性質⭐⭐⭐

    • 滿二叉樹:深度爲 k(k≥1)且有2k-1個結點的二叉樹稱爲滿二叉樹。由性質2知,滿二叉樹上的結點數已達到了二叉樹可以容納的最大值。
    • 完全二叉樹:如果對滿二叉樹按從上到下,從左到右的順序編號,並在最下一層刪去部分結點(刪後最後一層仍有結點),如果刪除的這些結點的編號是連續的且刪除的結點中含有最大編號的結點,那麼這棵二叉樹就是完全二叉樹。
  • 二叉樹的順序存儲結構⭐

    • 二叉樹的順序存儲結構可以用一維數組來實現。
    • 如果需要順序存儲的非完全二叉樹,首先必須用某種方法將其轉化爲完全二叉樹,爲些可增設若干個虛擬結點。會造成空間的浪費。
  • 二叉樹的鏈式存儲結構⭐⭐⭐

    • 二叉樹有不同的鏈式存儲結構,其中最常用的是二叉鏈表三叉鏈表。其結點形式如下:
    • 二叉鏈表:具有n個結點的二叉樹中,共有2n個指針域,其中只有 n-1 個用來指向結點的左、右孩子(因爲沒有指向根結點的指針域),其餘的 n+1 個指針域爲 NULL
  • 二叉樹遍歷的遞歸實現⭐⭐⭐

  • 應用舉例⭐

    • 由一個二叉樹的後序序列中序序列,可以唯一確定一棵二叉樹。
    • 由一個二叉樹的先序序列中序序列,也可以唯一確定一棵二叉樹。
    • 注意:必須要有中序序列。
  • 樹的存儲結構⭐

    • 孩子鏈表表示法:樹上的一個結點 X 以及該結點的所有孩子結點組成一個帶頭結點的單鏈表。
      • 頭結點含有兩個域:數據域和指針域。其中,數據域用於存儲結點 X 中的數據元素,指針域用於存儲指向 X 第一個孩子結點的指針。
      • 表結點也含兩個域:孩子域(child)和指針域(next),孩子域存儲其中一個孩子的序號,指針域指向其下一個孩子的結點。
    • 孩子兄弟鏈表表示法:存儲時每個結點除了數據域外,還有指向該結點的第一個孩子和下一個兄弟結點的指針。
      • 注意:孩子兄弟鏈表的結構形式與二叉鏈表完全相同,但結點中指針的含義不同。二叉鏈表中結點的左、右指針分別指向左、右孩子;而孩子兄弟鏈表中結點的兩個指針分別指向孩子和兄弟。
    • 雙親表示法:由一個一維數組構成。數據的每個分量包含兩個域:數據域和雙親域
      • 數據域用於存儲樹上一個結點中的數據元素,雙親域用於存儲本結點的雙親結點在數組中的序號值(下標值)。
  • 樹、森林與二叉樹的關係⭐

    • 樹轉換成二叉樹
      • 將所有兄弟結點連接起來;
      • 保留第一個兄弟結點與父結點的連接,斷開其他兄弟結點與父結點的連接
      • 然後以根結點爲軸心按順時針的方向旋轉45⁰ 角。
    • 森林轉換成二叉樹
      • 將每棵樹轉換成相應的二叉樹;
      • 將上邊得到的各棵二叉樹的根結點看作是兄弟連接起來。
    • 二叉樹轉換成森林
      • 在待轉換的二叉樹中,斷開根結點與右孩子的連線,得到兩棵二叉樹,其中一棵是以二叉樹B的根結點爲根的二叉樹,另一棵是以根結點的右孩子E 爲根結點的二叉樹。
  • 森林的遍歷⭐⭐

  • 分類與判定樹⭐

    • 分類:一種常用運算,其作用是將輸入數據按預定的標準劃分成不同的種類。
    • 判定樹:用於描述分類過程的二叉樹。
  • 哈夫曼(Huffman)樹與哈夫曼算法⭐⭐⭐

    • 哈夫曼樹:給定一組值 p1 ..., pk,如何構造一棵有 k 個葉子且分別以這些值爲樹的判定樹,使得其平均比較次數(WPL)最小。滿足上述條件的判定樹稱爲哈夫曼樹。其中Pi 是第 i 個結點的權值,li 是第 i 個結點的比較次數。
    • 哈夫曼算法:哈夫曼給出的一個求哈夫曼樹的簡單而有效的方法,稱爲哈夫曼算法。具體方法如下:
      • ①由給定的值{p1, ..., pk} 構造森林 F={T1, ..., Tk},其中每個Ti爲一棵只有根結點且其權爲pi的二叉樹。
      • ②從F中選取根結點的權最小的兩棵二叉樹Ti、Tj,構造一棵分別以Ti 和Tj 爲左、右子樹的新的二叉樹Th,置Th根結點的權爲Ti 和 Tj 根結點的樹值之和。
      • ③從F中刪去Ti 、Tj,並將Th 加入F。若F中仍多於一棵二叉樹,則返回②,直到F中只含一棵二叉樹爲止,這棵二叉樹就是哈夫曼樹。
      • 結論:最終求得的哈夫曼樹中共有結點總數:2n-1 個。其中,n個葉結點是初始森林中的n個結點,合併 n-1 次共產生 n-1 個新結點,且哈夫曼樹中沒有度數爲1的分支結點。

第五章 圖

  • 圖的定義和術語⭐⭐
    • 無向完全圖:任何兩點之間都有邊的無向圖稱爲無向完全圖。一個具有n個頂點的無向完全圖的邊數爲 n(n-1) /2。
    • 有向完全圖:任何兩點之間都有弧的有向圖稱爲有向完全圖。一個具有n個頂點的有向完全圖的弧數爲 n(n-1)。(有向圖的邊稱爲弧)
    • 度:
      • 無向圖的度:無向圖中頂點v的度是與該頂點相關聯的邊的數目,記爲 D(v)。
      • 有向圖的入度:有向圖中以頂點v爲終點的弧的數目稱爲v的入度,記爲 ID(v)
      • 有向圖的出度:有向圖中以頂點v爲始點的弧的數目稱爲v的出度,記爲 OD(v)
      • 有向圖的度:有向圖中頂點v的度爲入度和出度之和,即 D(v)=ID(v)+OD(v)
    • 連通:在無向圖中,如果從頂點v到頂點v’ 有路徑,則稱v和v’ 是連通的。
    • 連通圖:如果圖中的任意兩個頂點vi和vj都是連通的,則稱G爲連通圖。
    • 連通分量:是無向圖中的極大連通子圖
    • 強連通圖:對於有向圖來說,如果圖中任意一對頂點vi和vj(其中i≠j)都有頂點vi 到頂點 vj的路徑,也有從vj 到vi 的路徑,即兩個頂點間雙向連通
    • 強連通分量有向圖極大強連通子圖
    • 生成樹:一個連通圖的生成樹,是含有該連通圖的全部頂點的一個極小連通子圖
  • 鄰接矩陣⭐⭐⭐
    • 用矩陣來描述圖中頂點之間的關聯關係,用二維數組來實現矩陣。設G=(V, E)是一個圖,其中V={v0, v1, ..., vn-1},那麼G的鄰接矩陣A定義爲如下n階方陣:
    • 無向圖的鄰接矩陣是一個對稱矩陣
    • 有向圖
      • 頂點vi出度 OD(vi) 是鄰接矩陣中第 i 行元素之和
      • 頂點vi入度 ID(vi) 是鄰接矩陣中第 i 列元素之和
  • 鄰接表⭐
    • 鄰接表是順序存儲與鏈式存儲相結合的存儲方法。
  • 圖的遍歷⭐⭐⭐
    • 深度優先搜索
      • 類似於樹的先序遍歷
      • 基本思想:假定以圖中某個頂點vi 爲出發點,首先訪問出發點 vi,然後任選一個vi 的未訪問過的鄰接點 vj,以vj 爲新的出發點繼續進行深度優先搜索,依此類推,直至圖中所有頂點都被訪問過。深度優先搜索遍歷類似於樹的先序遍歷。圖的深度優先搜索可以看成一個遞歸過程。
      • 注意兩點:
        • 1、搜索到達某個頂點時(圖中仍有頂點未被訪問),如果這個頂點的所有鄰接點都被訪問過,那麼搜索就要回到前一個被訪問過的頂點,再從該頂點的下一未被訪問的領接點開始深度優先搜索;
        • 2、深度搜索的頂點的訪問序列不是唯一的。
      • 時間複雜度
        • 採用鄰接矩陣作爲存儲結構的圖的時間複雜度:O(n2),其中n 爲圖的頂點數。
        • 採用鄰接表作爲存儲結構的圖的時間複雜度:O(n+e),其中n 爲圖的頂點數,e爲圖的邊數。
    • 廣度優先搜索
      • 類似於樹的按層次遍歷的過程。
      • 基本思想:從圖中某個頂點vi 出發,在訪問了vi 之後依次訪問vi 的所有鄰接點,然後依次從這些鄰接點出發按廣度優先搜索方法遍歷圖的其他頂點,重複這一過程,直至所有頂點都被訪問到。類似於樹的按層次遍歷的過程。
  • 最小生成樹⭐⭐
    • 一個圖的最小生成樹是圖所有生成樹中權總和最小的生成樹。
    • 最小生成樹的算法有:Prim算法克魯斯卡爾(Kruskal)算法
    • 求單源最短路徑——迪傑斯特拉(Dijkstra)算法
  • 拓撲排序⭐⭐
    • AOV網:如果以圖中的頂點來表示活動,有向邊表示活動之間的優先關係,這種用頂點表示活動的有向圖稱爲 AOV網。AOV網中的弧表示了活動之間存在着的制約關係。
    • 拓撲排序:拓撲排序的算法的時間複雜度爲O(n+e),n是圖的頂點個數,e是圖的弧的數目。

第六章 查找

  • 基本概念⭐⭐
    • 查找表(Search Table)是由同一類型的數據元素構成的集合,它是一種以查找爲“核心”,同時包括其他運算的非常靈活的數據結構。其分類有:
      • 靜態查找表:建表、查找 、讀表中元素
      • 動態查找表:初始化、查找、讀表中元素、插入、刪除
  • 順序表上的查找⭐⭐
    • 靜態查找表簡單的實現方法是以順序表作爲存儲結構,即鏈式存儲結構
    • 查找成功時的平均查找長度,記爲ASL:,其中,Pi爲查找第i個元素(即給定值key與順序表中第i個元素的鍵值相等)的概率,且,Ci 表示在找到第 i 個元素時,與給定值已進行比較的鍵值個數。
  • 有序表上的查找⭐⭐⭐
    • 有序表:如果順序表中數據元素是按照鍵值大小的順序排列的,則稱爲有序表。適用於二分查找。
    • 二分查找:用給定值key與處在中間位置的數據元素T.elem[mid]的鍵值T.elem[mid].key 進行比較,可根據三種比較結果區分三種情況:
      • key=T.elem[mid].key,查找成功,T.elem[mid]即爲待查元素;
      • key<T.elem[mid].key,說明若待查元素在表中,則一定排在T.elem[mid] 之前;
      • key>T.elem[mid].key,說明若待查元素在表中,則一定排在T.elem[mid] 之後。
    • 平均查找長度:二分查找的平均查找長度爲
    • 二分查找算法平均時間複雜度:O(log2n)
  • 二叉排序樹⭐⭐
    • 定義:一棵二叉排序樹(又稱二叉查找樹)或者是一棵空二叉樹,或者是具有下列性質的二叉樹:
      • 若它的左子樹不空,則左子樹上所有結點的鍵值均小於它的根結點鍵值;
      • 若它的右子樹不空,則右子樹上所有結點的鍵值均大於它的根結點鍵值;
      • 根的左、右子樹也分別爲二叉排序樹。
    • 二叉排序樹上平均查找長度是介於O(n)O(log2n)之間的。
  • 散列表⭐
    • 數據元素的鍵值和存儲位置之間建立的對應關係 H 稱爲散列函數,用鍵值通過散列函數獲取存儲位置的這種存儲方式構造的存儲結構稱爲散列表
    • 設有散列函數 H 和鍵值 k1、k2(k≠k2),若 H(k1)=H(k2),則這種現象稱爲“衝突”,且稱鍵值 k1 和 k2 互爲同義詞。
  • 常用散列法⭐⭐
    • 數字分析法:又稱數據選擇法,其方法是收集所有可能出現的鍵值,排列在一起,對鍵值的每一位進行分析,選擇分佈較均勻的苦幹位組成散列地址。所取的位數取決於散列表的表長,見表長100,則取2位即可。
    • 除留餘數法:是一種簡單有效且最常用的構造方法,其方法是選擇一個不大於散列表長n的正整數p,以鍵值除以p所得的餘數作爲散列地址,即H(key)=key mod p (p≤n),注意:通常選p爲小於散列表長度n的素數。
    • 平方取中法:以鍵值平方的中間幾位作爲散列地址。通常在選定散列函數時不一定能知道鍵值的分佈情況。所得散列地址比較均勻。
    • 基數轉換法:將鍵值看成另一種進制的數再轉換成原來進制的數,然後選其中幾位作爲散列地址。
  • 散列表的實現⭐⭐
    • 線性探測法:對任何鍵值key,設H(key)=d,設散列表的容量爲m,則線性探測法生成的後繼散列地址序列爲 d+1,d+2, ..., m-1, 0, 1, ..., d-1
    • 二次探測法:生成的後繼散列地址不是連續的,而是跳躍式的,以便爲後續數據元素留下空間從而減少堆積。按照二次探測法,鍵值key的散列地址序列爲d0=H(key); d1=(d0+i) mod m。其中,m爲散列表的表長,i=12,-12,22,-22,...,\(\pm\) k2(k≤m/2)。

第七章 排序

  • 概述⭐⭐
    • n個記錄的序列爲{R1, R2, ..., Rn},其相應的鍵值序列爲{k1, k2, ..., kn},假設ki=kj,若在排序前的序列中Ri在Rj之前,即 i<j,經過排序後,Ri 仍在Rj 之前,則稱所用的排序方法是穩定的;反之,則稱所用的排序方法是不穩定的
    • 穩定性是排序方法本身的特性,與數據無關。
  • 4種排序方法⭐⭐⭐
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章