查找表 是由同一類型的數據元素 構成的集合,它是一種以查找爲「核心」,同時包括其餘運算的很是靈活的數據結構。算法
上面概念中的集合和數學上的定義是一致的,簡單地說就是由任意一些可分辨的對象構成的總體數據結構
做爲一個數學概念,集合的元素是沒有任何限制。函數
做爲一種數據結構,查找表的邏輯結構是集合,對查找表進行的操做包括 查找表中的某一元素
,讀取表中特定數據元素
,插入和刪除一個數據元素
等。動畫
若對查找表只進行前兩項操做,則稱此類查找表爲 靜態查找表
。
若在查找過程當中,向表中插入不存在的數據元素,或者從表中刪除某個數據元素,則稱此類查找表爲動態查找表
。code
順序表上的查找對象
具體的代碼就不實現了,有興趣的能夠自行查閱,主要說的是概念與邏輯blog
對於查找運算,其基本操做是「數據元素的鍵值與給定值的比較」,因此一般用「數據元素的鍵值與給定值的比較次數」做爲衡量查找算法好壞的依據,稱上述比較次數爲
查找長度
。可是查找長度與鍵值在順序表中的位置有關,且差異很大。例如,若鍵值在順序表的第n個位置上,則查找長度爲1,而若是鍵值在順序表的第1個位置上,查找長度爲n。排序
基於上述內容引入一個新的概念,叫作「查找成功時的平均查找長度(記做ASL)」
索引
它的定義是這樣的:爲找到數據元素在查找表中的位置,與給定值進行比較的鍵值個數的指望值。
當查找表有n個元素時,有get
$$ASL=\sum_{r=1}^nP_iC_i$$
其中Pi爲查找第i個元素(即給定值key與順序表中第i個元素的鍵值相等)的機率,且$\sum_{r=1}^nP_i=1$,Ci表示在找第i個元素時,與給定值已進行比較的鍵值個數。
假設順序表爲(b1,b2,b3)查找b1,b2,b3的機率分別是0.2,0.2,0.6,則順序查找法的平均查找長度爲 $0.2 * 3+0.22+0.61 = 1.6$ 即平均須要1.6 次鍵值與給定值的比較才能找到待查元素。
因爲多種元素Pi值很差肯定,因此一般讓Pi機率相等,即對全部的i,有 $P_i =\frac{1}{n}$,並在此假設下肯定查找算法的平均查找長度。
$$ASL=\sum_{r=1}nP_iC_i=\sum_{r=1}n\frac{1}{n}*(n-i+1)=\frac{n+1}{2}$$
上述內容記住結論便可。
若是順序表中數據元素是按照鍵值大小的順序排列的,則稱爲有序表。
這種存儲結構,查找運算能夠用效率更高的二分查找法
直接看例題便可
如今有一個含有9個數據元素的有序表(關鍵字即爲數據元素的值)
(10,13,17,20,30,55,68,89,95)用二分查找算法查找key=17的過程
第一步,找到查找區間,合計9個數據元素,那麼[1,9]就是區間
(1+9)/ 2 = 5
找到位置5的數據元素30,30>17 進入第二步
第二步,縮小查找區間,合計4個數據元素,那麼[1,4]就是區間
(1+4)/ 2 = 2.5 去尾法 等於2
找到位置2的數據元素13,13<17 進入第三步
第三步,縮小查找區間,那麼[3,4]就是區間
(3+4) / 2 = 3.5 去尾法 等於3
找到位置3的數據元素17,正好是待查元素,查找成功,返回結果爲mid=3
索引順序表由兩部分組成:一個索引表和一個順序表
其中 順序表在組織形式上與普通的順序表徹底相同,而索引表自己在組織形式上也是一個順序表。
索引表經過索引將順序表分割爲若干塊,而順序表呈現出「按塊有序」
的形式
若靜態查找表用索引順序表表示,則查找操做可用分塊查找來實現,也稱爲 索引順序查找
。
分爲兩步進行:
(1)先肯定待查數據元素所在的塊
(2)而後在塊內順序查找
結論:
靜態查找表 有順序查找、二分查找、分塊查找
三種特色分別爲:
一棵二叉排序樹(又稱二叉查找樹)具有以下性質
二叉排序樹的案例以下圖所示
關於二叉排序樹,教材中涉及了部分代碼,分別以下
須要記住的一些小點以下
二叉排序樹上的平均查找長度是介於O(n)和O($\log_2n$)之間。
如下兩個樹的平均查找長度分別爲
一些基本概念要普及一下
數據元素的鍵值和存儲位置之間創建的對應關係H成爲散列函數
,
用鍵值經過散列函數獲取存儲位置的這種存儲方式構造的存儲結構成爲散列表
,這一映射過程稱爲散列
若是選定了某個散列函數H及其對應的散列表L,則對每一個數據元素X,函數值H(H.Key)就是X在散列表L中的存儲位置,這個存儲位置也稱爲散列地址。
構造散列函數的方法,瞭解一下
直接用例題與動畫來解釋吧
題目要求
設散列表長度爲11,散列函數H(key) = key mod 11(mod爲求餘運算),給定的健值序列爲(3,12,13,27,34,22,38,25),試畫出採用線性探測法解決衝突時所構造的散列表,並求出在等機率的狀況下查找成功時的平均查找長度。
線性探測法 就是 求餘數,而後放到對應的位置上,若是位置上有數據元素了,那麼就向後移動,移動到沒有數據元素的位置上,而後佔坑
平均查找長度 ASL 就是把元素查找次數加起來總和/散列表長度 = 16/11
二次探測法,核心在於二次上,說白了,就是當你取餘獲得的位置由數據元素的時候,須要進行二次的偏移探測
例如,仍是上述的題目,當計算到34的時候,發現位置1已經有元素了,接下來就要進行二次探測了
用1的位置分別進行+12,-12,+22,-22...
第一步,探測1+12 = 2 ,位置2是否存在元素,發現有
第二步,探測1-12 = 0,位置0是否存在元素,發現無,那麼好,把34放在位置0那裏,假設位置0也有元素了
第三步,探測1+22 = 5,位置5是否存在元素,發現無,把34放過去。
能夠經過一個案例來簡單說明一下
選定一個散列函數H(key) = key mod 13 ,鍵值爲26,41,25,05,07,15,12,49,51,31,62
而後咱們把求到的餘數,依次對應到鄰接表裏面,以下圖(直接截取教材圖了,就不畫了)
更多圖示: https://dwz.cn/r4lCXEuL
本章在自考或者期末考試中,核心內容是二分查找方法;二叉排序樹的構建,散列表的查找方法,重點會考察線性探測法和二次探測法,重點看一下吧。
BYEBYE~