【问题标题】:Finding the duplicate element in a (sorted) Array in less than O(n) time?在少于 O(n) 的时间内找到(排序的)数组中的重复元素?
【发布时间】:2017-01-26 00:15:47
【问题描述】:

我想知道是否可以在 JavaScript 数组上执行 O(log n) 的二进制搜索以找到单个重复元素。

// Example
  // Input: var arr = [1, 3, 4, 4, 6, 9, 11, 12, 14]
  // Output: 4

我知道如何在线性时间内解决这个问题,但我一直在尝试在 O(log n) 中编写一个解决方案,但我不确定如何在减少要搜索的数组块方面继续进行每次迭代。有什么建议吗?

【问题讨论】:

  • 你提前知道 4 是重复的值吗?
  • 如果您没有要搜索的特定值,这不能比 O(n) 更快地完成。最坏的情况是没有重复,在这种情况下,您将始终需要查看整个数组。
  • 这个类似的问题可能会有所帮助(虽然它不是重复的,因为它的数字是连续的,没有间隙),因为其中一个答案提到了这种情况。 stackoverflow.com/questions/9673658/…
  • 如果您肯定有主题中提到的“单个”重复项(元素是单数),即使它们是最后一对,您也绝对可以在不迭代所有项目的情况下找到它。

标签: javascript arrays algorithm big-o


【解决方案1】:

只有当你知道你正在寻找的元素(或者,更准确地说,当你选择了你的轴心点时你能分辨出它在哪一半)时,二分搜索才有效。 p>

您的问题中似乎没有任何内容表明您有这方面的知识,因此,基于此,O(n) 是您目前能做的最好的事情。

如果有一些额外的信息,则有可能,例如一个范围内的所有数字都被表示,除了一个,或者重复的数字在一个特定的范围内。

但是,根据目前的信息,情况并非如此。

【讨论】:

  • 我就是这么想的。是的,谢谢。你是对的,二分搜索需要一些东西来搜索(那是一个 duh 时刻)。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2015-01-15
  • 1970-01-01
  • 2012-05-08
  • 2011-11-28
相关资源
最近更新 更多