【问题标题】:Recursive algorithm that returns a bool when checking if array[i] == i (must be O(log n))检查 array[i] == i 时返回 bool 的递归算法(必须为 O(log n))
【发布时间】:2015-06-16 08:40:11
【问题描述】:

我正在尝试编写一种递归算法,如果至少有一个array[i] == i,则该算法返回真。如果没有array[i] = i,则为 false。

另外,需要的参数是(int * arr, int start, int end)。所以我将用指针遍历数组。例如:

int A[] = {-50,-10,0,1,3,5,8,10};
cout << sameIndex(A,0,7) << endl; //displays 1 (true) since A[5] == 5

我遇到很多麻烦的部分是使它成为 O(log n)。我看不出将数组分成 2 个每个函数调用会得到正确的解决方案。想出这个算法的结构让我头疼。有人可以指出我正确的方向吗?我不是在寻找答案,我只是不知道如何开始递归解决这个问题,更不用说 O(log n) 时间了。

忘了说是的,整数是不同的并且是排序的。

我想通了!长颈鹿船长和亨里克是正确的,但他们使用的方法略有不同。我选择了长颈鹿船长的方法,因为它使用二分搜索更容易和更直观。 Henrik 使用了一个小“技巧”​​,通过减去 array[i] - i 来检查它们是否等于 0。无论如何这里是解决方案:

bool sameIndex(int * A, int start, int end)
{
    int mid = (start + end)/2;

    if(start <= end)
    {
        if(*(A + mid) == mid)
            return true;
        else if(*(A + mid) > mid)                   //search left
            return sameIndex(A, start, mid - 1);
        else                                        //search right
            return sameIndex(A, mid + 1, end);
    }
    return false;
}

我让它变得比实际更难。

【问题讨论】:

  • 这怎么可能在log(n) 中运行?您必须检查每个条目才能知道没有array[i] == i
  • 如果您的数组始终是排序的,您还可以丢弃低于第一个索引 0 的值,以及高于最后一个索引 (size-1) 的值。
  • 是的,忘了提到它们是有序的和不同的。我刚刚编辑了帖子。
  • 所以你基本上只是在问如何实现普通数组的二进制搜索。
  • @Lundin 事情是在二进制搜索中,您输入要搜索的内容。在这里你不知道你在找什么。您只是检查当前索引是否对应于数组中该索引处的元素。也许我遗漏了一些明显的东西?

标签: c++ arrays algorithm recursion


【解决方案1】:

执行常规二分搜索,但使用 (array[i] == i) 条件而不是搜索特定值。

If (array[i] > i)
   move left
else
   move right

当然,这需要对值进行排序,但您的示例表明情况确实如此。

【讨论】:

  • 您建议使用 array[i] == i 进行二进制搜索,但您的代码示例有 array[i] > i。如果 array[i] == i 假设存在外部条件检查,我是否正确?
  • @Ghost_Stark 你确实是。此检查在if (found) return true; 之后进行。
  • 但我不明白如果函数已经找到解决方案,为什么还要进行检查。
  • @Ghost_Stark if (array[i] == i) return true; 结束算法并出现在代码中的分支之前。与任何其他二进制搜索实现进行比较。您需要做的就是更改条件。
  • 哦,我明白了。好吧,我认为这正是我所需要的。我对递归有点陌生,所以在我回到这个之前给我一些时间。
【解决方案2】:

@Captain Giraffe 的回答是正确的。原因如下:

如果array[i] 是按升序排列的不同整数序列,则array[i] - i 是按升序排列的(不一定不同)整数序列。因此,您可以使用二进制搜索在第二个序列中搜索0

If (array[i] - i == 0)
    return true;
If (array[i] - i > 0)
    serach left
else
    search right

【讨论】:

  • 谢谢。这有助于更好地理解长颈鹿船长的意思。
猜你喜欢
  • 2020-03-23
  • 2022-01-13
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2014-06-29
  • 2020-12-28
相关资源
最近更新 更多