簡體   English   中英

隨機二進制搜索算法

[英]Randomized binary search algorithm

下面的算法應該是二元搜索的變體,而不是選擇中間選擇和比較隨機索引。 該算法漸漸變差,但這只是一項任務。 算法考慮當隨機索引i處的元素等於搜索值時的情況,在這種情況下它返回true,而第二種情況是當索引i處的元素大於搜索值時,在這種情況下我們遞歸地調用搜索在i - 1的輸入n上。如果元素總是大於或等於搜索值,那么算法工作正常。

然而,當隨機索引處的元素小於搜索值時會發生什么? 直觀地,我認為輸入n應該增加i + 1,即使檢查n是否大於數組大小,我似乎得到了stackoverflows ..

public static boolean search(int[] keys, int value, int n) {
    if(n <= 0 || n > keys.length) 
        return false;
    else {
        Random random =   new Random();
        int i       =   random.nextInt(n);

        if(keys[i] == value) 
            return true;
        else if(keys[i] > value) 
            return search(keys, value, i - 1);
        else 
            return search(keys, value, i + 1);
    }
}

您的代碼根本就是錯誤的(我認為)。 根據你的說法(你的問題陳述中的條件),這應該是代碼:

public static boolean search(int[] keys, int value, int l, int r)
{
    if(l < 0 || r >= keys.length || l>r) return false;
    else
    {
        Random random =   new Random();
        int i       =   l + random.nextInt(r-l);

        if(keys[i] == value) return true;
        else if(keys[i] > value) return search(keys, value, l, i - 1);
        else return search(keys, value, i + 1, r);
    }
}

看到你的代碼的這一部分,

 else if(keys[i] > value) 
     return search(keys, value, i - 1); //Line1
 else 
     return search(keys, value, i + 1); //Line2

在這兩種情況下,您都在搜索數組的相同部分。

Line1搜索該value從陣列中0i - 1
Line2搜索該value從陣列中0i + 1

你應該做的是,

Line1應該搜索的value從陣列中0i - 1
Line2應該搜索的value的數組中的從i + 1到陣列的端部。

暫無
暫無

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

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