【问题标题】:Randomized binary search algorithm随机二分搜索算法
【发布时间】:2015-09-09 05:59:51
【问题描述】:

下面的算法应该是二分搜索的一种变体,它不是选择中间,而是选择并比较随机索引。该算法渐进地更糟,但这只是一项任务。该算法考虑随机索引 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);
    }
}

【问题讨论】:

  • 你的keys[] 1-indexed 了吗?如果不是(我觉得不是),请将您的 if 条件更改为 if(n &lt; 0 || n &gt;= keys.length)
  • 我刚刚编辑了您的代码以在答案中发布这个想法。它现在应该可以工作了。
  • 我没有在索引中使用 n,它被用作随机数的界限,因此如果没有元素 (n = 0),则该元素不存在于数组中。我还将 n 作为 keys.length 传递,因此 if(n >= keys.length) 将始终返回 false。
  • 让我们说随机返回 1 并且值等于键 [0],然后您将 0 传递给下一个递归调用。然后它将返回false。如果这是您的假设(对于 n),无论如何,您都是从索引 0 到 (i-1) 或 (i+1) 搜索数组的下部,而不是第二部分。所以,那里也是错的。
  • 我认为在每次调用该方法时初始化一个新的Random 是不好的做法。应该重复使用单个 Random 实例。

标签: java algorithm


【解决方案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-s,因为if-s 以return结尾,所以它们在这里没用。
  • 是的,确实如此。我只是复制并粘贴了他的代码并进行了最少的编辑以获得正确的答案。 :)
【解决方案2】:

查看这部分代码,

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

在这两种情况下,您都在数组的同一部分进行搜索。

Line1 在从0i - 1 的数组中搜索value
Line2 在从0i + 1 的数组中搜索value

你应该做的是,

Line1 应该在从0i - 1 的数组中搜索value
Line2 应该在从i + 1 到数组末尾的数组中搜索value

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 2021-03-23
    • 2017-07-02
    • 1970-01-01
    • 2023-03-11
    • 2017-01-06
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多