#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)
改進(帶哨兵的)
基本思想:設定「哨兵」。
哨兵就是待查值,
將哨兵放在查詢方向的盡頭處,
免去了在查詢過程中每一次比較後都要判斷查詢位置是否越界,從而提高查詢速度。
}適用條件:
線性表中的記錄必須按關鍵碼有序;
必須採用順序儲存。
基本思想:
在有序表中(low, high,low<=high),
取中間記錄作為比較物件,
若給定值與中間記錄的關鍵碼相等,則查詢成功;
若給定值小於中間記錄的關鍵碼,則在中間記錄的左半區繼續查詢;
若給定值大於中間記錄的關鍵碼,則在中間記錄的右半區繼續查詢。
不斷重複上述過程,直到查詢成功,或所查詢的區域無記錄,查詢失敗。
非遞迴
int linesearch ::
binsearch1
(int k)
return0;
//查詢失敗,返回0
}
遞迴法
int linesearch ::
binsearch2
(int low,
int high,
int k)
}
判定樹:折半查詢的過程可以用二叉樹來描述,
樹中的每個結點對應有序表中的乙個記錄,
結點的值為該記錄在表中的位置。
通常稱這個描述折半查詢過程的二叉樹為折半查詢判定樹,簡稱判定樹。
⑴ 當n=0時,折半查詢判定樹為空;
⑵ 當n>0時,
折半查詢判定樹的根結點為mid=(n+1)/2,
根結點的左子樹是與有序表r[1] ~ r[mid-1]相對應的折半查詢判定樹,
根結點的右子樹是與r[mid+1] ~ r[n]相對應的折半查詢判定樹。
任意結點的左右子樹中結點個數最多相差1
任意結點的左右子樹的高度最多相差1
任意兩個葉子所處的層次最多相差1
查詢成功:在表中查詢任一記錄的過程,即是折半查詢判定樹中從根結點到該記錄結點的路徑,和給定值的比較次數等於該記錄結點在樹中的層數。
查詢成功時的平均查詢長度asl:
查詢不成功:
查詢失敗的過程就是走了一條從根結點到外部結點的路徑,
和給定值進行的關鍵碼的比較次數等於該路徑上內部結點的個數(失敗情況下的平均查詢長度等於樹的高度)。
資料結構之線性表的查詢
話不多說,直接上 1 include stdafx.h 2 include3 using namespace std 4 define maxsize 10056 int f 100 7 8 無哨兵順序查詢,a為陣列,n為要查詢的陣列個數,key為要查詢的關鍵字 9int sequential se...
資料結構(線性表)
1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...
資料結構 線性表
參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...