【问题标题】:finding an index i such that a[i] = i [duplicate]找到一个索引 i 使得 a[i] = i [重复]
【发布时间】:2011-07-24 11:23:28
【问题描述】:

可能重复:
Interview question - Search in sorted array X for index i such that X[i] = i

给你一个排序的整数数组和数组的长度。现在你必须找到一个索引i,这样a(i)=i。 如果给出索引,我可以在 o(logn) 中执行此操作,但如果未提及索引 i 怎么办?

【问题讨论】:

  • 如果给定我,我可以在恒定时间内完成 :)
  • 我已经使用修改后的二进制搜索完成了,您的解决方案...
  • @prp 你是如何在 O(log n) 时间内对数组进行排序的?
  • mid = (low+high)/2 if [ a[mid]=mid ] 然后返回 mid FindIndex_Value(array,low,mid-1) FindIndex_Value(array,mid+1,high)
  • @paxdiablo & david 数组已经排序...:)

标签: c algorithm


【解决方案1】:

正如 Alexandre 在评论中所说,索引的预知意味着它是 O(1),而不是 O(log N)

而且,除非您没有告诉我们某些信息,否则您需要 O(n) 时间在没有预知的情况下执行此操作:

for x = 0 to len(a) - 1:
    if a[x] = x:
        return x

澄清:最初的问题没有说明该列表已排序,这是后来添加的。由于这会使问题与this one 重复,因此您应该查看那里的答案以获得解决方案。

这个答案将保持原样,因为复制其他答案没有意义,而且它与未排序的情况有关。

【讨论】:

  • @paxdiablo 你的意思是说如果索引 i 没有给出,我们将在 o(n) 中执行它,我是对的..
  • 想必多出来的信息就是数组排序好了。
  • @prp,是的。我正在回答“如果未提及索引 i”位。其他人已经说过,如果你已经有了索引,那就是 O(1)。
  • @David,那将是一件事。其他可能是上限和下限、没有重复或其他十几个限制中的任何一个。
  • @paxdiablo 我怀疑没有重复。
【解决方案2】:

根据给出的信息,您需要检查值直到找到匹配项。最坏的情况(没有匹配,或在最后一个单元格中找到匹配)是 O(n)。 如果数组已经排序,则可以进行二分查找,即 O(log n)。

您的声明要么是错误的,要么是您遗漏了一些信息。

【讨论】:

  • -1:你不能用标准的二分搜索来解决这个问题。
  • 正确,您不能按原样在数组上使用 bsearch()。如果要保留解决方案的 O(log n) 属性,则必须执行自己的二进制搜索。如果修改数组(原地或副本)并从 a[i] 中减去 i,则可以使用 bsearch()。这样做的复杂性是 O(n)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2012-07-05
  • 2012-10-20
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
相关资源
最近更新 更多