數據結構與算法

數據結構部分
1.概念
  數據定義:
  數據:是描述客觀事物的數值,字符以及能輸入機器能被處理的各類符號集合。
  數據元素:組成數據的基本單位,一個數據元素可由一個或者多個數據項組成,數據項是有獨立含義的最小單位。
  數據對象:是性質相同的數據元素的集合,是數據的一個子集。
  數據結構:是指相互之間存在一種或者多種特定關係的數據元素集合。html

  算法定義:
  特性:
  (1)有限性:有限步驟以內正常結束,不能造成無窮循環
  (2)肯定性:算法中的每一步必須有肯定含義,無二義性
  (3)輸入:有多個或者零個輸入
  (4)輸出:至少一個輸出
  (5)可行性:原則上能精確進行算法

2.線性表
2.1 基本概念
  定義:由n個類型相同的數據元素組成的有限序列
  特色:
  同一性:線性表由同類型數據元素組成
  有窮性:線性表由有限個數據元素組成
  有序性:相連元素之間存在序偶關係,除首尾元素外,每一個元素都存在惟一的首元素和惟一的尾元素數組

2.2 線性表的存儲結構
2.2.1 順序存儲結構
  定義:指用一組地址連續的存儲單元依次存儲線性表中的各元素,使得線性表中在邏輯結構上相鄰的數據元素存儲在相鄰的物理存儲單元中
  基本運算:查找、插入、刪除、合併
  優勢:
  (1)無需爲表示節點間的邏輯關係而增長額外的存儲空間(邏輯上相鄰的元素其存儲的物理位置上也相連)
  (2)可方便隨機存取表中的任一元素
  肯定:
  (1)插入和刪除運算不方便,除尾部的位置外,在表中其它位置進行操做時必須移動大量的元素
  (2)存儲分配只能預先進行靜態分配,當表長變化較大時,難以肯定合適的規模緩存

2.2.2 鏈式存儲結構
  分類:單鏈表、雙向鏈表和循環鏈表
  單鏈表:包含兩個域,數據域(用來存儲結點的值)和指針域(用來存儲數據元素的直接後繼的位置),因爲鏈表的每一個結點只有一個指針域,故稱爲單鏈表
  基本運算:初始化,查找,插入,刪除,求長度
  雙向鏈表:包含三個域,前驅指針域(用來存儲數據元素的直接前驅的位置),數據域(用來存儲結點的值)和後驅指針域(用來存儲數據元素的直接後繼的位置)
  基本運算:插入,刪除,交換
  循環鏈表:循環鏈表是(單、雙)鏈表的另外一種形式,它是一個首尾相連的鏈表數據結構

  比較:順序表和鏈表
  基於空間考慮:線性表的長度變化較大,難以估計其存儲規模是,採起動態鏈表結構存儲,反之,採用順序表存儲
  基於時間考慮:主要執行查詢操做,不多作插入和刪除,採用順序表存儲,反之,鏈表存儲dom

3 限定性線性表
3.1 棧
3.1.1 定義
  棧是一種限定性線性表,是將線性表的插入和刪除操做限制在表的一端進行。容許插入和刪除操做的一端稱爲棧頂,另外一端稱爲棧底。插入也叫做入棧,刪除叫出棧函數

3.1.2 基本操做和特色
  基本操做:初始化,判空,判滿,,讀棧頂元素,入棧和出棧
  特色:先進後出性能

3.1.3 棧的實現存儲結構
  順序棧、鏈棧
  順序棧:用順序存儲結構實現的棧,因爲棧的操做的特殊性,必須設一個位置指針top(棧頂指針)來動態表示棧頂元素在順序棧中的位置。一般以top = -1表示空棧。
  鏈棧:採用鏈表做爲存儲結構實現的棧。編碼

3.1.4 典型應用
  - 括號匹配
實現:
  (1)設置一個棧,讀取括號序列
  (2)如果左括號,直接入棧,等待相匹配的同類右括號
  (3)如果右括號,且與當前棧頂的左括號同類型,則兩者匹配,將棧頂的左括號出棧,不然屬於不合法的狀況,判斷結束
  (4)輸入序列已讀盡,而棧中仍有等待匹配的左括號,屬於不合法狀況,判斷結束spa

- 遞歸調用
  原理:遞歸函數調用時,應按照「後調用 先返回」的原理處理調用過程,所以上述之間的信息傳遞和控制轉移必須經過棧來實現。系統整個程序運行時所需的數據空間安排在一個棧中,每當調用一個函數時,就爲它分配一個存儲區,每當從一個函數退出時,就釋放它的存儲區。當前正在運行的函數的數據區必在棧頂。

  問題1:數據結構中的棧和堆,與內存中的棧區和堆區的區別是什麼?
  參考:https://www.cnblogs.com/jzssuanfa/p/7068147.html

3.2 隊列
3.2.1 定義
  是一種限定性的線性表,它只容許在表的一端插入,而在另外一端刪除。容許插入的一端叫作 隊尾,容許刪除的一端叫作 隊頭。

3.2.2 基本操做和特色
  基本操做:初始化、判空、進隊、出隊、取隊頭元素、隊列置空、隊列銷燬
  特色:先進先出

3.2.3 隊列的實現存儲結構
  順序隊列和鏈式隊列
  鏈式隊列:採用帶頭結點的鏈表結構,並設置一個隊頭指針和一個隊尾指針,隊頭指針始終指向頭結點,隊尾指針始終指向當前最後一個元素。空的鏈式隊列的隊頭指針和隊尾指針均指向頭結點。
  循環隊列:是隊列的一中順序表示和實現方法。

3.2.4 應用
  - 鍵盤輸入緩衝區問題

4 字符串
  說明: 字符串(簡稱串),能夠將其看做是種特殊的線性表,其特殊性在於線性表的數據元素的類型老是字符,字符串的數據對象約束爲字符集。

4.1 定義
  是零個或者多個字符組成的有限序列,S = "a1a2...an"(n >= 0),其中 S 是串名,引號中字符序列是串的值,ai 能夠是字母、數字、或其餘字符。
  空串:n = 0 時的串
  子串:串中任意連續的字符組成的子序列
  主串:包含子串的串,即S
  相等:兩個串長度相等,且對應位置的字符相等
  空格串:由一個或者多個空格字符組成的串,其長度爲空格的個數。注意區別與 空串

4.2 基本操做
初始化、插入、刪除、複製、判空、合併、替換、判斷長度

4.3 串實現的存儲結構
  定長順序串、堆串、塊鏈串
  定長順序串:與線性表順序存儲結構相似,用一組連續地址單元存儲串的字符序列
  堆串:仍然以一組地址連續的存儲單元存放串的字符序列,但他們的存儲空間在執行過程當中動態分配
  塊鏈串:採用鏈式存儲,因爲串的特殊性,在實現是,每一個結點既能夠存放一個字符,也能夠放多個字符。每一個結點稱爲塊。整個鏈表稱爲塊鏈結構。

5 數組和廣義表
5.1 定義
  數組能夠當作通常線性表的擴充,二維數組能夠當作線性表的線性表。其特殊性不像棧和隊列那樣對數據元素的操做受限,而是反映在數據元素的構成上。線性表中,每一個數據元素是不可再分的原子類型;而數組和廣義表的數據元素能夠推廣爲一種特定結構的數據。

5.2 數組操做
  (1)獲取特定位置的元素值
  (2)修改特定位置的元素值

5.3 數組的順序存儲結構
  原理:內存的結構是一維的,用一維內存表示多維數組,必須按某種次序,將數組元素排成一個線性序列,而後將這個線性序列存放在存儲器中。
  實現:
  數組順序存儲結構有兩種:按行存儲、按列存儲

5.4 特殊矩陣壓縮存儲
  矩陣一般能夠用二維數組的形式來描述。有些高階矩陣中,非零元素較少,此時若仍採用二維數組存放就不合適了。壓縮原則就是對有規律的元素和值相同的元素只分配一個存儲空間,對零元素不分配空間。

5.4.1 有規律的特殊矩陣
  (1)上三角矩陣
  (2)下三角矩陣
  (3)帶狀矩陣
  方法:找到矩陣的位置特色,只存放非零元素到一維數組中

5.4.2 無規律的特殊矩陣
  - 稀疏矩陣:矩陣中大多數元素爲零的矩陣
方法:
(1)三元組表表示法

(2)十字鏈表(鏈式存儲)技巧:由於分佈沒規律,因此必須儲存一些輔助信息,即行號row和列號col

  right:用於連接同行中的下一個元素
  down:用於連接同列中的下一個元素

  note:在進行加、減、乘除等操做運算時,相比三元組表,可避免了大量移動元素

5.5 廣義表
  特色:
  廣義表中的數據元素既能夠是單個元素,也能夠是子表。

6 樹和二叉樹
6.1 樹的定義
  樹是 n 個結點的有限集合,當 n - 0 時,稱爲空樹;當 n > 0 時,知足以下條件:
  (1)必有一個稱爲 根 的節點,它沒有直接前驅,但有零個或多個直接後繼。
  (2)其他 n-1 個節點能夠劃分紅 m 個互不相交的有限集,稱爲 根 的子樹。每一個子樹的根結點有且僅有一個直接前驅,但有零個或多個直接後繼。
  特色:一 對 多

6.2 有關樹的術語
  結點:包含一個數據元素及若干指向其它結點的分支信息
  結點的度:一個結點子樹個數稱爲結點的度
  葉結點:度爲0的結點
  分支結點:度不爲0的結點
  孩子結點:一個結點的直接後繼稱爲該結點的孩子結點
  父結點:一個結點的直接前驅稱爲該結點的父節點
  兄弟結點:同一個父節點的孩子結點之間稱爲兄弟結點
  樹的度:樹種全部結點的度的最大值
  結點的層次:從根結點開始定義,根結點層次爲1,根直接後繼結點爲2,以此類推
  樹的高度(深度):樹種全部結點的層次的最大值
  有序樹:各子樹之間是有前後次序的
  森林:m 棵互不相交的樹的集合

6.3 基本操做
  增刪改查

6.4 二叉樹
6.4.1 定義
  (1)每一個節點的度都不大於2
  (2)每一個結點的孩子不能任意顛倒

  滿二叉樹:深度爲 k 且有 2^k - 1 個結點的二叉樹。
  徹底二叉樹:深度爲 k ,結點爲 n 的二叉樹,若是其結點1-n 的位置序號與滿二叉樹的結點位置序號一一對應,則爲徹底二叉樹
  二叉查找樹:又被稱爲二叉搜索樹。設x爲二叉查找樹中的一個結點,x節點包含關鍵字key,節點x的key值記爲key[x]。若是y是x的左子樹中的一個結點,則key[y] <= key[x];若是y是x的右子樹的一個結點,則key[y] >= key[x]。

6.4.2 二叉樹性質
  性質1:在二叉樹第 i 層上至多有 2^(i-1) 個結點
  性質2:深度爲 k 的二叉樹至多有 2^k-1 個結點
  性質3:對任意一棵二叉樹,若葉結點數爲 n0,其度數爲2的結點爲 n2,則 n0 = n2 + 1.
  性質4: 具備 n 個結點的徹底二叉樹的深度爲[log2n] + 1
  性質5:n 個結點的徹底二叉樹,按照從上向下和從左到右的順序對二叉樹的全部結點從1開始順序編號,則對任意的序號爲i的節點有
  (1)i = 1,則序號爲i的結點爲根結點,無雙親結點;如 i > 1,則序號爲 i 的 雙親結點序號爲[i/2]
  (2)2 * i > n,則i結點無左孩子,反之 2*i 爲其左孩子
  (3)2 * i + 1 > n,則i結點無左孩子,反之 2*i+1 爲其左孩子

6.4.3 二叉樹的存儲結構
  順序存儲結構和鏈式存儲結構
  順序存儲結構:用一組連續的存儲單元存放二叉樹的數據元素

存儲以下:


  note:存儲時按照徹底二叉樹,若是不是徹底二叉樹,則用空格補全

存儲以下:

 

 

 

  鏈式存儲結構:存儲單元能夠不連續,存放二叉樹的數據元素至少包含如下三個域

  LChild:指向該結點的左孩子
  Data:記錄該結點的信息
  RChild:指向該結點的右孩子

  爲了方便,有時還能夠設置成以下結構:

6.4.4 二叉樹的遍歷
  定義:按照必定規律對二叉樹每一個結點進行訪問且僅訪問一次
  經常使用的三種遍歷方式:對根的訪問前後順序定的,執行時按照遞歸的原則進行
  - 先序遍歷(DLR):
  (1)訪問根結點
  (2)按先序遍歷左子樹
  (3)按先序遍歷右子樹
  - 中序遍歷(LDR)
  (1)按中序遍歷左子樹
  (2)訪問根結點
  (3)按中序遍歷右子樹
  - 後序遍歷(LRD)
  (1)按後序遍歷左子樹
  (2)按後序遍歷右子樹
  (3)訪問根結點

6.5 紅黑樹
6.5.1 定義
  全稱是Red-Black Tree,又稱爲「紅黑樹」,它一種特殊的二叉查找樹。紅黑樹的每一個節點上都有存儲位表示節點的顏色,能夠是紅(Red)或黑(Black)。

6.5.2 性質
  (1)每一個節點或者是黑色,或者是紅色。
  (2)根節點是黑色。
  (3)每一個葉子節點(NIL)是黑色。 [注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點!]
  (4)若是一個節點是紅色的,則它的子節點必須是黑色的。
  (5)從一個節點到該節點的子孫節點的全部路徑上包含相同數目的黑節點。

注意:
  (1) 特性(3)中的葉子節點,是隻爲空(NIL或null)的節點。
  (2) 特性(5),確保沒有一條路徑會比其餘路徑長出倆倍。於是,紅黑樹是相對是接近平衡的二叉樹
  示意圖:

 

6.5.3 應用
  紅黑樹的應用比較普遍,主要是用它來存儲有序的數據,它的時間複雜度是O(lgn),效率很是之高。
  例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虛擬內存的管理,都是經過紅黑樹去實現的。

6.5.4 基本操做
  - 左、右旋轉
  紅黑樹的基本操做是添加、刪除。在對紅黑樹進行添加或刪除以後,都會用到旋轉方法。爲何呢?道理很簡單,添加或刪除紅黑樹中的節點以後,紅黑樹就發生了變化,可能不知足紅黑樹的5條性質,也就再也不是一顆紅黑樹了,而是一顆普通的樹。而經過旋轉,可使這顆樹從新成爲紅黑樹。簡單點說,旋轉的目的是讓樹保持紅黑樹的特性

  - 插入
  首先,將紅黑樹看成一顆二叉查找樹,將節點插入;而後,將節點着色爲紅色;最後,經過旋轉和從新着色等方法來修正該樹,使之從新成爲一顆紅黑樹

  - 刪除
  首先,將紅黑樹看成一顆二叉查找樹,將該節點從二叉查找樹中刪除;而後,經過"旋轉和從新着色"等一系列來修正該樹,使之從新成爲一棵紅黑樹

  6.6 哈夫曼樹及其應用
  6.6.1 哈夫曼樹
  定義:又稱最優二叉樹,是由 n 個帶權葉子結點構成的全部二叉樹中帶權路勁長度WPL最短的二叉樹。

  基本概念:
  路徑:從一個結點到另外一個結點之間的分支序列
  路徑長度:從一個結點到另外一個結點所通過的分支數目
  結點的權:每一個結點賦予一個具備某種實際意義的實數
  帶權路徑長度:從樹根到某一點的路徑長度與該結點權的乘積
  樹的帶權路徑長度:全部葉子結點的帶權路徑長度之和,即爲WPL

  哈夫曼算法:
  給定數列{w1,...,wn},以n個權值構成n棵單根樹的森林F;將F={T1,...,Tn}按權從大到小排列;取T1和T2合併成一棵樹,使其根結點的權值 T= T1 + T2,再按大小插入F,直到爲一棵樹爲止。
  特色:權值越大的葉子離根越近

6.6.2 典型應用
  - 哈夫曼編碼
  利用哈夫曼樹能夠獲得平均長度最短的編碼。從而減小程序的總長度和增長指令所能表示的操做信息和地址信息。

6.7 B樹和B+樹
  B+ 樹的優勢:
  因爲B+樹在內部節點上不包含數據信息,所以在內存頁中可以存放更多的key。 數據存放的更加緊密,具備更好的空間局部性。所以訪問葉子節點上關聯的數據也具備更好的緩存命中率。
  B+樹的葉子結點都是相鏈的,所以對整棵樹的便利只須要一次線性遍歷葉子結點便可。並且因爲數據順序排列而且相連,因此便於區間查找和搜索。而B樹則須要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,因此緩存命中性沒有B+樹好

  B樹的優勢:
  B樹的每個節點都包含key和value,所以常常訪問的元素可能離根節點更近,所以訪問也更迅速

7 圖
7.1 定義
  G = (V,R)
  其中,V稱爲頂點,R稱爲頂點之間的關係。
  分類:有向圖和無向圖(根據R有無方向性劃分)
  特色:多對多

7.2 基本術語
  無向徹底圖:每一個頂點和剩餘n-1 個頂點都有邊相連
  有向徹底圖:每一個頂點和剩餘n-1 個頂點都有弧相連
  鄰居點:G=(V,{E}),若是邊(v1,v2)∈E,則稱頂點v一、v2互爲鄰居點
  度:頂點v的度是指與v相關聯邊的數目,即TD(v)
  入度:有向圖中,頂點v爲弧頭的弧的數目稱爲該頂點的入度,即ID(v)
  出度:頂點v爲弧尾的弧的數目稱爲該頂點的出度,即OD(v)
  TD = ID + OD
  e = all(TD)/2
  權:每一條邊都有與它相關的樹,稱爲權
  網:將帶權的圖叫作賦權圖或網
  路徑:從頂點v1到vn是一個頂點序列,若表示路徑的頂點序列中的頂點各不相同,則稱爲簡單路徑
  迴路:v1 = vn 時,該路徑爲一個迴路,若除了第一個和最後一個頂點外,其他各頂點均不重複的迴路稱爲簡單迴路
  連通圖:對於圖中任意兩個頂點都是連通的,則稱該無向圖G爲連通圖
  強連通:對任意兩個頂點vi、vj,從vi到vj和vj到vi都有路徑,則稱該有向圖爲強連通圖
  生成樹:一個連通圖的生成樹是指一個極小連通子圖,它包含圖中的所有頂點,若是在一棵生成樹上添加一條邊,則一定構成一個環。

7.3 基本操做
  建立、插入、刪除、查找

7.4 圖的存儲結構
7.4.1 鄰接矩陣表示法
  定義:採用兩個數組來表示圖:一個是用來存儲頂點信息的一維數組;另外一個是用來存儲圖中頂點之間關聯關係的二維數組,這個關聯關係數組被稱爲鄰接矩陣
  性質:
  (1)對無向圖而言,其鄰接矩陣第i行元素之和就是圖中第i個頂點的度
  (2)對於有向圖而言,其鄰接矩陣第i行元素之和就是圖中第i個頂點的出度
  (3)對於有向圖而言,其鄰接矩陣第i列元素之和就是圖中第i個頂點的入度
  優勢:運算方便
  缺點:對於稀疏圖來說,用鄰接矩陣的表示法會形成存儲空間的很大浪費

7.4.2 鄰接表表示法(不太清楚)
  定義:對於圖G中的每一個頂點vi,該方法把全部鄰接於vi的頂點vj鏈成一個帶頭結點的單鏈表,這個單鏈表就稱爲頂點vi的鄰接表(Adjacency List);
  特色:其實是圖的一種鏈式存儲結構,基本思想是隻存儲有關聯的信息,對於圖中存在的邊信息則存儲,不相連的的頂點則不保存。
基本概念:

 

 

 

7.4.3 十字鏈表
7.4.4 鄰接多重表

7.5 圖的遍歷
  定義:就是從圖中的某個頂點出發,按照某種方法對圖中的全部頂點訪問且僅訪問一次
  可參考:https://www.cnblogs.com/weizhixiang/p/5815994.html
7.5.1 深度優先搜索
  基本思想:相似於樹的先根遍歷
  (1)從圖中某店v0 出發,首先訪問v0
  (2)找出剛訪問過的頂點的第一個未被訪問的鄰接點,而後訪問該點,以該點爲新頂點,重複本步驟,直到當前頂點無未被訪問的鄰接點爲止
  (3)返回前一個訪問過的且仍有未被訪問的鄰接點的頂點,找出並訪問該頂點的下一個未被訪問的鄰接點,而後執行步驟(2)

7.5.2 廣度優先搜索
  基本思想:相似於樹的層次遍歷
  (1)從圖中某個頂點v0出發,首先訪問v0
  (2)依次訪問v0的各個未被訪問的鄰接點
  (3)分別從這些鄰接點出發,依次訪問他們的各個未被訪問的鄰接點

7.6 圖的連通性


算法部分
8 查找
8.1 基本概念
  平均查找長度:
  ASL = P1C1 +... + PnCn ,其中P1 爲查找列表中第i個元素的機率,Ci爲找到列表中第i個元素時,
  已經進行過的關鍵字比較次數
  查找基本方法:比較式查找和計算式查找
  比較式查找:分爲 基於線性表的查找法 和 基於樹的查找法
  計算式查找法:HASH(哈希)查找法

8.2 基於線性表的查找法
  分爲:順序查找、折半查找、分塊查找
8.2.1 順序查找
  基本思想:用所給關鍵字與線性表中各元素的關鍵字逐個比較,直到成功或失敗。
8.2.2 折半查找(二分查找)
  基本思想:將表中間的位置記錄的關鍵字與查找關鍵字比較,若是相等,則查找成功,不然將表分爲前、後兩個子表,若是中間位置
  記錄的關鍵字大於查找關鍵字,則進一步查找前半子表(假設從前外後依次增大),不然查找後半子表。
  特色:這種方法要求帶查找的列表必須是按照關鍵字大小有序排列的順序表
  優勢:比較次數少,查找速度快
  缺點:要求待查表爲有序表,且插入刪除困難,適用於不常常變更且查找頻繁的有序表
8.2.3 分塊查找

8.3 基於樹的查找法
  分爲:二叉排序樹,平衡二叉樹,B_樹
8.3.1 二叉排序樹
  定義:二叉排序樹或者是一棵空樹,或者具備以下性質:
  (1)左子樹非空,則左子樹上全部結點的值均小於根結點的值
  (2)右子樹非空,則右子樹上全部結點的值均大於根結點的值
  (3)他的左右子樹也分別是二叉排序樹
8.3.2 平衡二叉樹
  定義:平衡二叉樹或者是一棵空樹,或者具備以下性質
  (1)左子樹與右子樹的高度差的絕對值小於等於1
  (2)左子樹和右子樹也是平衡二叉樹
8.3.3 B_樹
  - m路查找樹
  定義:一棵m路查找樹,或是一棵空樹,或者知足以下性質:
  (1)每一個結點最多有m棵子樹,m-1個關鍵字,結構以下:
  

  其中n爲關鍵字個數,Pi爲指向子樹根結點的指針,Ki爲關鍵字
  (2)Ki<Ki+1 ,1<= i <= n-1
  (3)子樹Pi中的全部關鍵字均大於Ki,小於Ki+1
  (4)子樹P0中的關鍵字均小於K1,而子樹Pn中的全部關鍵字均大於Kn
  (5)子樹Pi也是m路查找樹

  - B_樹
  定義:一棵B_樹是一棵平衡的m路查找樹,它或是空樹,或知足以下性質
  (1)樹中每一個結點最多有m棵子樹
  (2)根結點至少有兩顆子樹
  (3)除根結點外,全部非葉子結點至少[m/2]棵子樹
  (4)全部葉子結點出如今同一層而且不包含信息,一般稱爲失敗結點。

8.4 計算式查找法-哈希法
  8.4.1 基本思想和概念
  基本思想:在元素的關鍵字k和元素存儲位置p之間創建一個對應關係,是的p=H(k),H稱爲哈希函數,
  之後當查找元素k時,利用哈希函數計算除該元素的存儲地址,從而達到按關鍵字直接存取元素的目的。

  衝突:關鍵字不一樣的元素k一、k2,可能會映射到哈希表的同一個地址上,這種現象叫作衝突
  同義詞:k1和k2就是同義詞

8.4.2 哈希函數的構造方法
  原則:(1)函數自己便於計算;(2)計算出來的地址分佈均勻,即對任一關鍵字k,H(k)對應不一樣地址的機率相等,目的是爲減小衝突;

  1.數字分析法
  2.平方取中法
  3.分段疊加法
  4.除留取餘法
  基本思想:
  5.僞隨機數法
  基本思想:採用一個僞隨機函數做爲哈希函數,即H(key)=random(key)

8.4.3 處理衝突的方法
  構造性能良好的哈希函數,能夠減小衝突,但不能徹底避免
  1.開放定址法(再散列法)
  基本思想:由關鍵碼獲得的哈希地址一旦產生了衝突,也就是說,該地址已經存放了數據元素,按照某種探測規則去尋找下一個空的哈希地址,
  只要哈希表足夠大,空的哈希地址總能找到,並將數據元素存入。
  探測規則:線性探測、二次探測、僞隨機探測

2.再哈希法
  基本思想:同時構造多個不一樣的哈希函數,Hi=RHi(key),當哈希地址H1發生衝突時,在計算H2...直到衝突再也不產生

3.鏈地址法
  基本思想:將全部哈希地址爲i的元素構成一個稱爲同義詞鏈的單鏈表,並將單鏈表的頭指針存在哈希表的第i個單元中,所以
  查找、插入和刪除主要在同義詞鏈中進行。適用於常常插入和刪除的狀況。

4.創建公共溢出區
  基本思想:將哈希表分爲基本表和溢出表兩部分,凡是與基本表發生衝突的元素一概填入溢出表。

8.4.4 哈希表查找過程
  基本思想:查找過程與建立過程是一致的。當查找關鍵字爲K的元素時,首先計算Po = H(K),若Po爲空,則所查元素不存在,反之,則找到所查元素;
  不然重複解決衝突的過程,按解決衝突的方法,找出下一個哈希地址pi,若是pi爲空,則所查元素不存在,反之,找到所查元素。

8.4.5 哈希法性能分析
  哈希法中影響關鍵字比較次數的因素有三個:哈希函數、處理衝突的方法、哈希表的裝填因子。
  哈希表裝填因子 a = 哈希表中元素個數/哈希表的長度

9 排序
9.1 基本概念
  內部排序:整個排序過程徹底在內存中進行
  外部排序:排序時須要藉助外部存儲設備才能完成
  穩定排序:待排序的記錄序列中可能存在兩個或兩個以上關鍵字相等的記錄。排序前的序列中Ri領先於Rj(即i<j).若在排序後的序列中Ri仍然領先於Rj,則稱所用的方法是穩定的
  不穩定排序:穩定的相反狀況

9.2 插入類排序
  基本思想:在一個已排好序的記錄子集上,每一步將下一個待排序的記錄有序的插入已排好序的記錄子集中,直到全部待排序記錄所有插入爲止。
9.2.1 直接插入排序
  基本思想:把n個待排序的元素當作一個有序表和一個無序表,第一趟比較前兩個數,而後把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從前向後掃描,
  把第三個數按大小插入到有序表中依次進行下去,進行了(n-1)趟掃描之後就完成了整個排序過程。
  時間複雜度:T = O(n^2)
  空間複雜度:S = O(1)
  穩定性:穩定

9.2.2 折半插入排序(直接插入的改良版)
  基本思想:與直接插入排序同樣,與直接插入算法的區別在於:在有序表中尋找待排序數據的正確位置時,使用了折半查找/二分查找
  時間複雜度:T = O(n^2)
  穩定性:穩定

9.2.3 表插入排序
  基本思想:採用鏈表存儲結構進行插入排序。先在帶插入記錄以前的有序子鏈表中查找應插入位置,而後將帶插入記錄插入鏈表。
  因爲只修改指針,因此表插入排序提升排序效率
  時間複雜度:T = O(n^2)
  穩定性:穩定

9.2.4 希爾排序(直接插入的改良版)
  基本思想:先將待排序記錄序列分割成若干個「較稀疏的」子序列,分別進行直接插入排序。通過上述粗略調整,整個序列中的記錄
  已經基本有序,最後再對所有記錄進行一次直接插入排序。
  穩定性:不穩定

9.3 交換類排序法
  基本思想:經過交換逆序元素進行排序的方法
9.3.1 冒泡排序
  基本思想:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。
  而後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至所有排序完成
  穩定性:穩定
  時間複雜度:O(n^2)
  空間複雜度:O(1)

9.3.2 快速排序(冒泡排序改良版)
  基本思想:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據
  分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。
  穩定性:不穩定
  時間複雜度:logn - n^2

9.4 選擇類排序
  基本思想:每一趟在n-i+1個記錄中選取關鍵字最小的記錄做爲有序序列中第i個記錄
9.4.1 簡單選擇排序
  基本思想:第i趟簡單排序是指經過n-i次關鍵字比較,從n-i+1個記錄中選出最小的記錄,並與第i個記錄進行交換,直到全部記錄排序完爲止。
  穩定性:不穩定
  時間複雜度:O(n^2)

9.4.2 樹形選擇排序
  基本思想:首先把待排序的n個記錄關鍵字兩兩比較,取較小者,而後再在[n/2]個較小者中,採起一樣方法進行比較,選出每兩個中的較小者,
  如此反覆,直到選出最小關鍵字爲止。再重複上述過程,直到全部記錄所有輸出爲止。
  穩定性:
  時間複雜度:nlogn

9.4.3 堆排序(樹形選擇排序的改良)
  基本思想:堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關
  鍵字的記錄變得簡單。
  大根堆:根結點(亦稱爲堆頂)的關鍵字是堆裏全部結點關鍵字中最大者的堆
  小根堆:根結點(亦稱爲堆頂)的關鍵字是堆裏全部結點關鍵字中最小者的堆

  須要解決的兩個問題:
  - 堆調整
  將徹底二叉樹根結點中的記錄移除,此時根結點至關於空結點,從空結點的左右子結點中選出一個關鍵字較大(小)的記錄,若是該記錄的關鍵字大於待調
  整記錄的關鍵字,則將該記錄上移至空結點中。此時,原來關鍵字較大的子結點至關於空結點,重複上述移動,直到空結點左右子結點的關鍵字均不大於待調整
  記錄關鍵字,此時將待調整記錄放入空結點便可。


  - 初建堆
  一個任意序列能夠當作對應的徹底二叉樹,因爲葉子結點能夠視爲單元素的堆,於是能夠反覆利用堆調整,自底向上逐層把全部以非葉子結點爲根的子樹調
  整爲堆,直到將整個徹底二叉樹調整爲堆。

  穩定性:不穩定
  時間複雜度:nlogn


9.5 歸併排序
  基本思想:將兩個或兩個以上的有序表合成一個新的有序表。
  穩定性:穩定
  時間複雜度:nlogn
  空間複雜度:n

9.6 分配類排序
9.6.1 多關鍵字排序
9.6.2 鏈式基數排序

9.7 各類排序方法的綜合比較

 

相關文章
相關標籤/搜索