簡體   English   中英

為什么我在Java中執行二進制搜索要比順序搜索慢?

[英]Why my implementation of binary search in Java slower than sequential search?

我問是因為我基本上只是將python代碼轉換為java,而當我在python中進行測試時,結果如預期的那樣(二進制搜索比順序搜索快)。 但是,在Java中並非如此。 為什么我的二分查找效率如此之低?

import java.util.Arrays;
import java.util.stream.IntStream;
public class Chap5exe1 {
    private static boolean sequential_search(int[] iterable, int item){
         boolean found = false;
         boolean stop = false;
         int current_position = 0;
         while ((current_position < iterable.length) & (!found) & (!stop)){     //!found is found == false
             if (iterable[current_position] == item){
                 found = true;
             }
             else if (iterable[current_position] > item){
                stop = true;
        }
        else {
            current_position += 1;
        }
    }
    return found;
}

private static boolean binary_search(int[] iterable, int item) {
    if (iterable.length == 0) {
        return false;
    }
    int mid_point = iterable.length / 2;
    if (iterable[mid_point] == item){
        return true;
    }
    else if (iterable[mid_point] > item){
        return binary_search(Arrays.copyOfRange(iterable, 0, mid_point), item);
     }
     else {
        return binary_search(Arrays.copyOfRange(iterable, mid_point+1, iterable.length), item);
    }
}


public static void main(String[] args) {
    for(int i = 1000; i <= 10000000; i += 1000){
        int[] list = IntStream.range(0, i).toArray();
        long startTime1 = System.nanoTime();
        sequential_search(list, i);
        long stopTime1 = System.nanoTime();
        long startTime2 = System.nanoTime();
        binary_search(list, i);
        long stopTime2 = System.nanoTime();
        String output = String.format("Sequential search:%d / Binary search:%d", stopTime1-startTime1, stopTime2-startTime2);
        System.out.println(output);
    }
}}

如評論中所述,Arrays.copyOfRange()方法調用導致開銷。 嘗試改用以下代碼:

private static boolean binary_search(int[] iterable, int item) {
    if (iterable.length == 0) {
        return false;
    }
    return binary_search(iterable, item, 0, iterable.length);
}

private static boolean binary_search(int[] iterable, int item, int start, int end) {
    int mid_point = (start + end) / 2;
    if (iterable[mid_point] == item){
        return true;
    } else if (start == end) {
        return false;
    }
    else if (iterable[mid_point] > item){
        return binary_search(iterable, item, start, mid_point);
     }
     else {
        return binary_search(iterable, item, mid_point+1, end);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM