[英]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
從陣列中0
到i - 1
。
Line2
搜索該value
從陣列中0
到i + 1
。
你應該做的是,
Line1
應該搜索的value
從陣列中0
到i - 1
。
Line2
應該搜索的value
的數組中的從i + 1
到陣列的端部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.