淺談二分法查找和原始算法查找的效率對比
我就廢話不多說了,大家還是直接看代碼吧!
import java.text.MessageFormat;
public class AppTest {
static int length = 70000000;
static int[] array = new int[length];
static {
for (int i = 0; i < length; i++) {
array[i] = i;
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int target = (int) (Math.random() * length * 2);
long start_f1 = System.currentTimeMillis();
int index_f1 = findIndex(array, target);
long end_f1 = System.currentTimeMillis();
long time_f1 = end_f1 - start_f1;
long start_f2 = System.currentTimeMillis();
int index_f2 = findIndexByFor(array, target);
long end_f2 = System.currentTimeMillis();
long time_f2 = end_f2 - start_f2;
System.out.println(MessageFormat.format("目標(biāo)數(shù)據(jù):{0}\t二分法耗時(shí):{1}\t普通方法耗時(shí):{2}\t二分法結(jié)果:{3}\t普通方法結(jié)果:{4}",
target, time_f1, time_f2, index_f1, index_f2));
}
}
public static int findIndex(int[] arr, int target) {
return findIndex(arr, 0, arr.length, target);
}
public static int findIndex(int[] arr, int start, int end, int target) {
int middle = (start + end) / 2;
if (target == arr[middle]) {
return middle;
} else if (start > end ||
target < arr[0] ||
target > arr[arr.length - 1]) {
return -1;
} else if (target < arr[middle]) {
return findIndex(arr, start, middle - 1, target);
} else if (target > arr[middle]) {
return findIndex(arr, middle + 1, end, target);
}
return -1;
}
public static int findIndexByFor(int[] arr, int target) {
int index = 0;
for (int i : arr) {
if (i == target) {
return index;
}
index++;
}
return -1;
}
}
查找結(jié)果:

總結(jié):
總結(jié)過我們可以看出,二分法查找?guī)缀跏遣缓臅r(shí),所以方法是很重要的
補(bǔ)充知識:順序查找與二分查找時(shí)間復(fù)雜度的比較
注意要點(diǎn):通過System.currentTimeMills();來獲取當(dāng)前時(shí)間,來計(jì)算該算法運(yùn)行運(yùn)算時(shí)間 順序查找的時(shí)間復(fù)雜度為O(n)
二分查找的時(shí)間復(fù)雜度為O(log(n))
但兩者的運(yùn)行時(shí)間的結(jié)果卻千差萬別,可知當(dāng)計(jì)算量很大的情況下算法優(yōu)化的必要性。
import java.util.Arrays;
public class Main {
public static int a[] = new int[10000*10000];
public static void main(String[] args) {
for(int i = 0; i < 10000* 10000; i ++) {
a[i] = i + 1;
}
int target = 10000 * 10000;
//計(jì)算順序查找所用時(shí)間
long start = System.currentTimeMillis();
find(target);
long end = System.currentTimeMillis();
System.out.println(end - start + "ms");
//計(jì)算二分查找所用時(shí)間
start = System.currentTimeMillis();
Arrays.binarySearch(a, target);
end = System.currentTimeMillis();
System.out.println(end - start + "ms");
}
private static void find(int target) {
for(int i = 0; i < 10000 * 10000; i ++) {
if(a[i] == target) {
return;
}
}
}
}
運(yùn)行結(jié)果:
55ms
0ms
以上這篇淺談二分法查找和原始算法查找的效率對比就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹前中后序遍歷非遞歸的具體實(shí)現(xiàn)詳解
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機(jī)構(gòu)都可用樹形象表示2021-11-11
Java elasticSearch-api的具體操作步驟講解
這篇文章主要介紹了elasticSearch-api的具體操作步驟講解,本文通過詳細(xì)的步驟介紹和圖文代碼展示講解了該項(xiàng)技術(shù),需要的朋友可以參考下2021-06-06
Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解
這篇文章主要為大家介紹了Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Java 泛型 Generic機(jī)制實(shí)例詳解
這篇文章主要為大家介紹了Java 泛型 Generic機(jī)制實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
關(guān)于RedisTemplate之opsForValue的使用說明
這篇文章主要介紹了關(guān)于RedisTemplate之opsForValue的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
SpringBoot實(shí)現(xiàn)數(shù)據(jù)源動態(tài)切換的最佳姿勢
這篇文章主要為大家詳細(xì)介紹一下SpringBoot實(shí)現(xiàn)數(shù)據(jù)源動態(tài)切換的最佳姿勢,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
JavaWeb?Listener?利用Session統(tǒng)計(jì)在線人數(shù)
這篇文章主要為大家介紹了JavaWeb?Listener?利用Session統(tǒng)計(jì)在線人數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

