查詢表是由同一型別的資料元素或記錄構成的集合。
關鍵字是資料元素或記錄中某個資料項的值,用它可以標識乙個資料元素或記錄;
若乙個關鍵字可以唯一地標識乙個記錄,則稱之為主關鍵字;反之,稱用以識別若干記錄的關鍵字為次關鍵字。
當資料元素只有乙個資料項時,其關鍵字為該資料元素的值。
查詢是指根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的記錄或資料元素。若表中存在這樣乙個記錄,則稱查詢成功,否則稱查詢不成功。
若在查詢的同時對錶做修改操作(如插入和刪除),則相應的表稱之為動態查詢表,否則稱之為靜態查詢表。
為確定記錄在查詢表中的位置,需和給定值進行比較的關鍵字個數的期望值,稱為查詢演算法在查詢成功時的平均查詢長度。
pi為查詢表中第i個記錄的概率,且
ci為找到表中其關鍵字與給定值相等的第i個記錄時,和給定值已進行過比較的關鍵字個數。
查詢過程:按順序從表的一端向另一端查詢,依次將表中記錄的關鍵字和給定值進行比較,若某個表中值和給定值相等,則查詢成功;反之,若整個表掃瞄完畢也未找到和給定值相等的記錄,則查詢失敗。
順序查詢適用於線性表的順序儲存結構和鏈式儲存結構。
typedef struct
int search_seq(sstable st,keytype key)
return 0; //未找到則返回0
}
把查詢的最後一位設為給定值,免去了每次判斷是否越界的問題
int search_seq(sstable st,keytype key)
return 0;
}
時間複雜度:o(n);
優點:簡單,對錶結構無任何要求;
缺點:平均查詢長度較大,查詢效率低。
也稱二分查詢,要求線性表必須採用順序儲存結構,且表中元素按關鍵字有序排列。
查詢過程:從表的中間記錄開始,如果給定值和中間記錄的關鍵字相等,則查詢成功;如果給定值大於或者小於中間記錄的關鍵字,則在表中大於或小與中間記錄的那一半中查詢,這樣重複操作,直到查詢成功,或者在某一步中查詢區間為空,則代表查詢失敗。
//以low和high來表示當前查詢區間的下界和上界,mid為區間的中間位置
int search_bin(sstable st,keytype key)(n+1)-1" class="mathcode" src=""/>(可以以滿二叉判定樹為例計算出)
因此,折半查詢的時間複雜度:o(log2(n));
優點:比較次數少,查詢效率高;
缺點:對錶結構要求高,只能用於順序儲存的有序表。查詢前需要排序,而排序本身也費時。同時,折半查詢也不適用於資料元素經常變動的線性表,因為為保持順序表的有序性,插入和刪除操作平均要比較和移動表中一半元素。
又稱索引順序查詢,效能介於順序查詢和折半查詢之間。分塊查詢是將表中記錄分成幾個子表(或稱塊),對每個子表建立乙個索引項,包括該子表的最大記錄以及第乙個記錄在表中的位置,各個子表的索引項組成乙個索引表,索引表中「分塊有序」,如第二個子表的最小值大於第乙個子表的最大值,以此類推。查詢時先確定待查記錄所在的塊(子表),然後在塊中順序查詢。
確定塊的查詢可以用順序查詢或折半查詢,在塊中只能用順序查詢,分塊查詢中
優點:由於塊內無序,插入刪除比較容易;
缺點:要增加乙個索引表的儲存空間,並對初始索引表進行排序運算。
資料結構複習之 線性表
線性表簡單地說就是資料元素的序列,即一對一關係 讀取 o 1 插入 刪除 o n 實現 package org.xiazdong.list public class myarraylist public myarraylist int length public myarraylist tarr e...
資料結構複習之線性表
基本概念 從邏輯上可以把資料結構分為線性結構和非線性結構兩大類。對於給定的n個元素,可以構造出的邏輯結構有 集合,線性結構,樹形結構,圖狀結構或網狀結構。乙個資料元素可以由若干個資料項組成。資料項是最小單位。線性表的順序表示指的是用一組位址連續的儲存單元依次儲存線性表的資料元素。構建乙個空的線性表 ...
複習資料結構 線性表
線性表實現 陣列方式 隨機訪問很快,常數級別。但是增刪慢了,n級別。預先要知道線性表的大小 鍊錶方式 隨機訪問不急,n級別。但是增刪快,常數級別。就是c 的new delete操作效能不怎樣,可以用free list來維護增刪的節點。對於new delete操作有5倍左右提公升吧。基於陣列 指標構造...