最優的的四種查詢演算法

2021-10-05 06:20:35 字數 3398 閱讀 7083

public

void

seqsearch()

;// 沒有順序的陣列

int value =

11,index =-1

;for

(int i =

0; i < arr.length; i++)if

(index ==-1

)else

}

public

void

binarysearch()

;int resindex =

binarysearch

(arr,

0, arr.length -1,

1000);

system.out.

println

("resindex="

+ resindex);}

public

static list< integer>

binarysearch

(int

arr,

int left,

int right,

int findval)

int mid =

(left + right)/2

;int midval = arr[mid];if

(findval > midval)

else

if(findval < midval)

else

}

插值查詢原理介紹:插值查詢演算法類似於二分查詢,不同的是插值查詢每次從自適應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])

插值查詢注意事項:

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

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

public

void

insertvaluesearch()

;int index =

insertvaluesearch

(arr,

0, arr.length -1,

1000);

system.out.

println

("index = "

+ index);}

public

static

intinsertvaluesearch

(int

arr,

int left,

int right,

int findval)

int mid = left +

(right - left)

*(findval - arr[left])/

(arr[right]

- arr[left]);

int midval = arr[mid];if

(findval>midval)

else

if(findval

else

}

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

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

斐波那契(**分割法)原理:

由斐波那契數列fib[k]=fib[k-1]+fib[k-2]的性質,可以得到(fib[k]-1)=(fib[k-1]-1)+(fib[k-2]-1)+1。該式說明:只要順序表的長度為fib[k]-1,則可以將該錶分成長度為fib[k-1]-1fib[k-2]-1的兩段,即如上圖所示。從而中間位置為mid=low+fib(k-1)-1

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

順序表長度n不一定剛好等於fib[k]-1,所以需要將原來的順序表長度n增加至fib[k]-1。這裡的k值只要能使得fib[k]-1恰好大於或等於n即可,由以下**得到,順序表長度增加後,新增的位置(從n+1到fib[k]-1位置),都賦為n位置(最末尾的數)的值即可。

public

void

fibonaccisearch()

;int key=

1000

;int

fib =

newint[20

];fib[0]

=1; fib[1]

=1;for

(int i =

2; i <

20; i++

)int low =0;

int high = arr.length -1;

int k =0;

//表示斐波那契分割數值的下標

int mid =0;

//獲取到斐波那契分割數值的下標

while

(high > fib[k]-1

)//因為 f[k] 值 可能大於 arr 的 長度,不足的部分會使用arr最後一位數填充

int[

] temp = arrays.

copyof

(arr, fib[k]);

for(

int i = high +

1; i < temp.length; i++

)while

(low<=high)

else

if(key>temp[mid]

)else

else

break;}

}}

查詢 四種查詢演算法

順序查詢 sequential search 又叫線性查詢,是最簡單直接暴力的查詢方法。就是從頭至尾挨個尋找,找到位置。當遍歷完沒找到就說明要找的資料不存在。它不要求資料有序。該演算法的時間複雜度為o n public static int seqsearch int arr,int value r...

四種基本的查詢演算法

public class demo1 int i seqsearch arr,3 if i 1 else public static intseqsearch int arr,int value return 1 要求是有序陣列 public class demo2 system.out.print...

SQL的四種連線查詢

一 內連線 inner join 或者 join 交集 二 外連線 1 左連線 left join 或者 left outer join 2 右連線 right join 或者 right outer join 3 完全外連線 full join 或者 full outer join 並集 4 舉例...