查詢演算法之二分查詢
1. 概念
二分查詢(Binary Search)演算法,也叫折半查詢演算法、二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為0。類似生活中猜字遊戲,它的時間複雜度是O(logn),適用於經常查詢的、但是不變的(增刪)的有序列表。雖然查詢效率很高,但也有一定的侷限性,二分查詢依賴順序表結構,那麼只能使用陣列作為底層資料結構,陣列按照下標隨機訪問資料的時間複雜度是O(1),而連結串列隨機訪問的時間複雜度是O(n),並且資料量太大和太小也不適合二分查詢。
2.原理
1)找出位於陣列中間的值,並存放在一個變數中mid中,並和target進行比較
2)如果target值大於mid,則把陣列中間位置作為下一次計算的起點進行比較。
3)如果target值小於mid,則把陣列中間位置作為下一次計算的終點進行比較。
4)如果target值等於mid,則返回陣列下標
3.演算法分析
時間複雜度:O(logn)
4.參考連結
https://www.jianshu.com/p/78b505a6abf4
5.測試用例
public class BinarySearchDemo {
/**
* 普通版本 參考 Arrays.binarySearch0
* @param a
*@param fromIndex
* @param toIndex
* @param target
* @return
*/
private static int binarySearch0(int[] a, int fromIndex, int toIndex, int target) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
// int mid = (low + high) >>> 1;
//這種不容易記憶體溢位
int mid = low + ((high - low) >> 1);
int midVal = a[mid];
if (midVal < target){
low = mid + 1;
}else if (midVal > target){
high = mid - 1;
}else{
// key found
return mid;
}
}
// key not found.
return -(low + 1);
}
/**
* 遞迴實現
* @param array
* @param fromIndex
* @param toIndex
* @param target
* @return
* @throws Exception
*/
public static int binarySearch(int[] array, int fromIndex, int toIndex, int target) {
if (fromIndex <= toIndex) {
int middle = (fromIndex + toIndex) >>> 1;
if (array[middle] == target) {
return middle;
} else if (array[middle] < target) {
return binarySearch(array, middle+1, toIndex, target);
} else {
return binarySearch(array, fromIndex, middle-1, target);
}
}
return -1;
}
public static void main(String[] args) {
int[] array=new int[]{2,3,4,5,6,7};
int result = binarySearch(array,0,array.length,3);
System.out.println(result);
}
}
相關文章
- 小白懂演算法之二分查詢演算法
- 查詢演算法__二分查詢演算法
- 查詢演算法之二分法演算法
- 死磕演算法之二分查詢法演算法
- 力扣之二分查詢力扣
- 查詢——二分查詢
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- 每週一演算法之二分查詢(Kotlin描述)演算法Kotlin
- 查詢演算法__Fibonacci查詢演算法
- HBase學習之二: hbase分頁查詢
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- 查詢演算法__插值查詢演算法
- 【演算法】二分查詢演算法
- 演算法->二分查詢演算法
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版演算法優化索引PHP
- 分組查詢
- LeetCode演算法—二分查詢LeetCode演算法
- elasticsearch查詢之大資料集分頁查詢Elasticsearch大資料
- 演算法 - 查詢演算法
- 查詢演算法演算法
- 二分查詢(一)——純粹的二分查詢
- MySQL——優化巢狀查詢和分頁查詢MySql優化巢狀
- 二分查詢
- group by分組查詢
- Elasticsearch 分頁查詢Elasticsearch
- 二分查詢演算法詳解演算法
- 演算法(一):二分查詢法演算法
- SQL查詢的:子查詢和多表查詢SQL
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- Java 查詢演算法Java演算法
- 查詢演算法(上)演算法
- 查詢演算法(下)演算法
- 二分查詢及其變種演算法演算法
- Java實現二分查詢演算法Java演算法
- 複雜查詢—子查詢
- AntDesignBlazor示例——分頁查詢Blazor