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]-1和fib[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 舉例...