查詢演算法簡介

2021-10-08 01:19:39 字數 2012 閱讀 7316

有乙個數列: ,判斷數列中是否包含此值【順序查詢】 要求如果找到,則並給出下標值

**參考

請對乙個有序陣列進行二分查詢 ,輸入乙個數看看該陣列是否存在此數,並且求出下 標,如果沒有就提示"沒有這個數"。

首先確定該陣列中間的下標

mid = (left + right) / 2

然後讓需要查詢的數findvalue和arr[mid]比較

什麼時候結束

**參考

插值查詢原理介紹:

插值查詢演算法類似於二分查詢,不同的是插值查詢每次從自適應 mid 處開始查詢。

將折半查詢中的求mid索引的公式,low表示左邊索引left,high表示右邊索引right.key 就是前面我們講的 findval

int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/對應前面的**公式:

int mid = left + (right – left) * (findval – arr[left]) / (arr[right] – arr[left])

舉例說明插值查詢演算法 1-100 的陣列

陣列 arr=[1,2,3,4…,100]

加入我們需要查詢的值為1

使用二分查詢的話需要查詢多次,才能找到1

使用插值查詢

int mid = left + (right - left) * (findvalue - arr[left]) / (arr[right] - arr[left])

int mid = 0 + (99 - 0) * (1 - 1)/(100 - 1) = 0 + 99 * 0 / 99 = 0

比如我們查詢的值100

int mid = 0 + (99 - 0) * (100 - 1) = 0 + 99* 99 / 99 = 0 + 99 = 99

請對乙個有序陣列進行插值查詢 ,輸入乙個數看看該陣列是否存在此數,並且求出下 標

**參考

1.對於資料量較大,關鍵字分布比較均勻的查詢表來說,採用插值查詢, 速度較快.

2.關鍵字分布不均勻的情況下,該方法不一定比折半查詢要好

3.以上的求mid值的實際類似於等差數列求下標,因此需要分布均勻

**分割點是指把一條線段分割為兩部分,使其中一部分與全長之比等於另一部分與這部分之比。取其前三位 數字的近似值是 0.618。由於按此比例設計的造型十分美麗,因此稱為**分割,也稱為中外比。這是乙個神 奇的數字,會帶來意向不大的效果。

斐波那契數列發現斐波那契數列的兩個相鄰數的比例,無限接近**分割值 0.618

斐波那契查詢原理與前兩種相似,僅僅改變了中間結點(mid)的位置,mid 不再是中間或插值得到,而是位

於**分割點附近,即 mid=low+f(k-1)-1(f 代表斐波那契數列),如下圖所示

對f(k-1)的理解

由斐波那契數列f[k]=f[k-1]+f[k-2]的性質,可以得到(f[k]-1)=(f[k-1]-1)+(f[k-2]-1)+1。該式說明:

只要順序表的長度為 f[k]-1,則可以將該錶分成長度為 f[k-1]-1 和 f[k-2]-1 的兩段,即如上圖所示。從而中間位置為 mid=low+f(k-1)-1

類似的,每一子段也可以用相同的方式分割

但順序表長度n不一定剛好等於f[k]-1,所以需要將原來的順序表長度n增加至f[k]-1。這裡的k值只要能使

得 f[k]-1 恰好大於或等於 n 即可,由以下**得到,順序表長度增加後,新增的位置(從 n+1 到 f[k]-1 位置), 都賦為 n 位置的值即可。

while(n>fib(k)-1)

k++;

**參考

Linq查詢簡介

查詢是一種從資料來源檢索資料的表示式。查詢通常用專門的查詢語言來表示。隨著時間的推移,人們已經為各種資料來源開發了不同的語言 例如,用於關聯式資料庫的 sql 和用於 xml 的 xquery。因此,開發人員不得不針對他們必須支援的每種資料來源或資料格式而學習新的查詢語言。linq 通過提供一種跨各...

C Linq查詢簡介

查詢是一種從資料來源檢索資料的表示式。linq 通過提供一種跨各種資料來源和資料格式使用資料的一致模型。所有 linq 查詢操作都由以下三個不同的操作組成 獲取資料源。建立查詢。執行查詢。2.建立查詢.var numquery from num in numbers where num 2 0 se...

SQL聯合查詢簡介

資料 庫版本 oracle9i 連線n個表,至少需要n 1個連線條件。例如 連線三個表,至少需要兩個連線條件。表testa,testb,testc,各有 a,b 兩列 a b 001 10a 002 20a a b 001 10b 003 30b ab 001 10c 004 40c 連線分為兩種 ...