1、列表:由同一型別的資料元素組成的集合。
2、關鍵碼:資料元素中的某個資料項,可以標識列表中的乙個或一組資料元素。
3、鍵值:關鍵碼的值。
4、主關鍵碼:可以唯一地標識乙個記錄的關鍵碼。
5、次關鍵碼:不能唯一地標識乙個記錄的關鍵碼。
6、查詢 :在具有相同型別的記錄構成的集合中找出滿足給定條件的記錄。
7、查詢的結果 :若在查詢集合中找到了與給定值相匹配的記錄,則稱查詢成功;否則,稱查詢失敗。
(一)靜態查詢 :不涉及插入和刪除操作的查詢 。
靜態查詢適用於:查詢集合一經生成,便只對其進行查詢,而不進行插入和刪除操作; 或經過一段時間的查詢之後,集中地進行插入和刪除等修改操作;
(二)動態查詢 :涉及插入和刪除操作的查詢。
動態查詢適用於:查詢與插入和刪除操作在同乙個階段進行,例如當查詢成功時,要刪除查詢到的記錄,當查詢不成功時,要插入被查詢的記錄。
查詢結構 :面向查詢操作的資料結構 ,即查詢基於的資料結構。
線性表:適用於靜態查詢,主要採用順序查詢技術、折半查詢技術。
樹表:適用於動態查詢,主要採用二叉排序樹的查詢技術。
雜湊表:靜態查詢和動態查詢均適用,主要採用雜湊技術。
查詢演算法的效能 :
查詢演算法時間效能通過關鍵碼的比較次數來度量。
平均查詢長度:將查詢演算法進行的關鍵碼的比較次數的數學期望值定義為平均查詢長度。計算公式為:
(一)順序查詢:
普通的順序查詢方法
帶監視哨的順序查詢方法
#include
using
namespace std;
const
int maxsize =
100;
class
linesearch
//析構函式為空
intseqsearch
(int k)
;//順序查詢
intbinsearch1
(int k)
;//折半非遞迴查詢
intbinsearch2
(int low,
int high,
int k)
;//折半遞迴查詢
private
:int data[maxsize]
;//查詢集合為整型
int length;
//查詢集合的元素個數};
linesearch ::
linesearch
(int a,
int n)
順序查詢 (線性查詢)
(二)基本思想:
從線性表的一端向另一端逐個將關鍵碼與給定值進行比較,若相等,則查詢成功,給出該記錄在表中的位置;若整個表檢測完仍未找到與給定值相等的關鍵碼,則查詢失敗,給出失敗資訊。
int linesearch ::
seqsearch
(int k)
(二)改進的順序查詢
基本思想:設定「哨兵」。
哨兵就是待查值,將哨兵放在查詢方向的盡頭處,免去了在查詢過程中每一次比較後都要判斷查詢位置是否越界,從而提高查詢速度。
int linesearch ::
seqsearch
(int k)
1、記錄每個資料的訪問頻率,把訪問頻率高的資料移向順序表的右端
可以減少查詢成功時所進行的比較次數,提高效率
2、構造有序的順序表
減少查詢失敗時所進行的比較次數,提高查詢效率
int linksearch::
seqsearch2
(node *first,
int k)if(
!p)else
}
(三)順序查詢的優點:
演算法簡單而且使用面廣。
對錶中記錄的儲存結構沒有任何要求,順序儲存和鏈結儲存均可;
對錶中記錄的有序性也沒有要求,無論記錄是否按關鍵碼有序均可。
順序查詢的缺點:
平均查詢長度較大,特別是當待查詢集合中元素較多時,查詢效率較低。
1、基本思想:
在有序表中(low, high,low<=high),
取中間記錄作為比較物件,
若給定值與中間記錄的關鍵碼相等,則查詢成功;
若給定值小於中間記錄的關鍵碼,則在中間記錄的左半區繼續查詢;
若給定值大於中間記錄的關鍵碼,則在中間記錄的右半區繼續查詢。
不斷重複上述過程,直到查詢成功,或所查詢的區域無記錄,查詢失敗。
//查詢失敗,返回0
}int linesearch ::
binsearch2
(int low,
int high,
int k)
}2、折半查詢的判定樹
判定樹:折半查詢的過程可以用二叉樹來描述,
樹中的每個結點對應有序表中的乙個記錄,
結點的值為該記錄在表中的位置。
通常稱這個描述折半查詢過程的二叉樹為折半查詢判定樹,簡稱判定樹。
判定樹的構造方法
⑴ 當n=0時,折半查詢判定樹為空;
⑵ 當n>0時,
折半查詢判定樹的根結點為mid=(n+1)/2,
根結點的左子樹是與有序表r[1] ~ r[mid-1]相對應的折半查詢判定樹,
根結點的右子樹是與r[mid+1] ~ r[n]相對應的折半查詢判定樹。
判定樹的特點:
任意兩棵折半查詢判定樹,若它們的結點個數相同,則它們的結構完全相同
具有n個結點的折半查詢樹的高度為
任意結點的左右子樹中結點個數最多相差1
任意結點的左右子樹的高度最多相差1
任意兩個葉子所處的層次最多相差1
資料結構 順序表查詢(折半查詢 差值查詢)
include include include define maxsize 10 首先構造乙個陣列,由隨機數生成,同時確保沒有重複元素。為了排序之後查詢時候方便 為了確保沒有重複的元素使用了乙個簡單的查詢函式 用陣列的0號元素來作為哨兵 化簡了操作 int search0 int a,int le...
資料結構4 順序查詢與折半查詢
順序查詢 針對無序的資料,有序的資料可以用更高效的資料查詢方式 在無序的資料查詢中,順序查詢是最入門 最簡單的演算法,該演算法雖然簡單,但是當資料量增多時,查詢效率較低。比如在100萬資料中,平均需要查詢大約50萬次,從演算法角度來說,是很難接受的。從演算法角度來說,很自然要考慮到演算法的優化。經過...
資料結構 查詢 折半查詢
簡單介紹下折半查詢,折半查詢僅適用於有序的順序表。查詢成功的平均查詢長度為log2 n 1 1 折半查詢判定樹的樹高為log2 n 1 向上取整 下面投放折半查詢 include include define maxsize 50 define keytype int 順序表結構體 typedef ...