1.基本概念
查找表:一種數據結構
靜態查找表:對查找表沒有修改操作;動態查找表:有
關鍵字:記錄中某個數據項的值,用來識別某個記錄
主關鍵字:唯一標識數據元素;次關鍵字:可以識別多個數據元素
評價指標:關鍵字的平均比較字數=平均搜索長度ASL
2.線性表的查找
①順序查找(次序查找)
查找成功時:設概率相等-(1+2+……n)/n=(1+n)/2
查找不成功時:n+1
查找概率相等時,ASL相同;
查找概率不等時,如果從前向後查找,則按查找概率由大到小排列的有序表其ASL要比無序表ASL小。
②折半查找-適用於順序結構的有序表
若k=R[mid].key,查找成功
若k<R[mid].key,high=mid-1;
若k>R[mid].key,low=mid+1;
直至low>high,查找失敗
時間複雜度O(log2 n)高於順序查找
3.樹表的查找
二叉排序樹:空樹或者滿足左子樹值<根節點<右子樹,左右子樹本身也是一棵二叉排序樹
中序遍歷二叉樹-得到一個關鍵字的遞增序列
查找:=關鍵字,成功;<關鍵字,查其左結點;>關鍵字,查其右結點
插入:若樹爲空,插入的爲根節點;否則繼續在左右子樹上查找;樹中已有不再插入,樹中沒有,直至找到爲空
生成:不同插入次序會生成不同形態的二叉排序樹
刪除:將因刪除結點而斷開的二叉樹重新連接起來,防止重新連接的樹的高度增加
最後一種情況是左右子樹都不缺
平均查找長度:
提高查找效率-AVL樹-平衡二叉樹-所有結點的左右子樹深度之差的絕對值<=1
平衡因子:該結點左子樹和右子樹的高度差。任意結點的平衡因子只能取-1,0,1
插入:需要調整平衡=平衡旋轉
旋轉:
轉載:AVL旋轉操作-
http://blog.csdn.net/collonn/article/details/20128205
平衡的擴充二叉樹-紅黑樹,插入刪除爲O(log2 n)
根節點黑色,不允許兩個紅色的連一起,紅色結點的兩個子結點爲黑色;深度特徵:對於每個結點,從該結點到其所有子孫葉結點的路徑中所包含的黑色結點數量必須相同
4.哈希表的查找
記錄存儲位置和關鍵字之間的對應關係Loc(i)=H(keyi)-查找速度極快O(1),效率與元素個數無關。
衝突不可避免-構造好的哈希函數和制定一個好的衝突解決方案
哈希函數構造方法:
① 直接定址法-Hash(key)=a*key+b
② 數字分析法
③ 平方取中法
④ 摺疊法
⑤ (優)除留餘數法-最常用-Hash(key)=key mod p (p爲一整數)p<=m且爲質數(m爲表長)
⑥ 隨機數法
衝突解決方案:-可用於建立哈希表
① 開放地址法-有衝突就尋找下一個空的哈希地址
線性探測法
Hi=(Hash(key)+di)mod m(1<=i<m,di爲增量序列,di=i;1,2,……m-1),算出得到Hi值爲空,則放入
二次探測法
Hi=(Hash(key)±di)mod m
其中:m爲哈希表長度,m要求是某個4k+3的質數;
di爲增量序列 1^2,-1^2,2^2,-2^2,…,q^2
僞隨機探測法
Hi=(Hash(key)+di)mod m ( 1≤i < m )
其中:m爲哈希表長度
di 爲隨機數
② (優)鏈地址法-相同哈希地址的記錄鏈成一單鏈表,m個哈希地址就設m個單鏈表,然後用用一個數組將m個單鏈表的表頭指針存儲起來,形成一個動態的結構
ASL與裝填因子 有關
ACM:判斷兩片雪花是否相同
採用一種折中的方案,取一個自定義的素數,儘可能大,但不又超大,如99991,即定義一個99991個空間的數組,將各雪花總長度與99991取模,作爲該雪花的存放組,而每一個組採用升序鏈表存儲。該方法即採用哈希查找方法,哈希函數爲H(Key)=K%99991。