【问题标题】:search value in unsorted array in O(log n)在 O(log n) 中的未排序数组中搜索值
【发布时间】:2019-02-01 23:52:34
【问题描述】:

我的朋友在测试中遇到了一个问题,问题是:

你会得到一个未排序的数组,其中整数值是对的,1 个值是单个的,例如:

[1,1,5,5,2,2,4,4,7,12,12,8,8]

输出为:7

现在我知道二分查找可以用 O(log n) 来完成,但是需要对数组进行排序。

那么如何在 O(log n) 在这个未排序的数组上完成呢?

【问题讨论】:

  • 关闭的原因很可笑。
  • 值总是成对的吗?
  • @Satpal:查看示例。
  • 是搜索任何整数值还是只搜索没有“另一半”的孤独数字?
  • “我知道二进制搜索可以用 O(log n) 来完成,但数组需要排序”:恐怕这句话是错误的,对元素进行排序无助于找到单例.

标签: arrays algorithm search big-o


【解决方案1】:

如果值对彼此相邻,您也可以在未排序的数组中进行二分搜索

  1. 拆分必须有2n + 1个元素的数组如下:<n elements> <1 element> <n elements>:
  2. 比较中间元素第一部分的最后一个元素第二部分的第一个元素
    • 如果不等于两者,则已找到单个元素
    • 否则,将中间元素添加到具有相同元素的部分(如果等于第一部分的最后一个元素,则将其附加到第一部分,否则将其添加为第一个元素到第二部分)
  3. 具有奇数个元素的部分重复这些步骤

【讨论】:

  • 如果相邻的对数相等怎么办?
  • @YvesDaoust 那么它们将不再是(可分隔的)对,而是一组四个。我就是这么理解这个问题的。
  • 如果允许怎么办?
  • @YvesDaoust 那么它在 O(log n) 中是不可行的。如果单个值等于相邻对的值,该算法也将不起作用。
【解决方案2】:

如果足以注意到单例左侧的所有对都在偶数/奇数索引上,而右侧的所有对都在奇数/偶数索引上。

由于可以在恒定时间内找到任意元素所属的对的奇偶性,因此找到奇偶性转换的二分法确实是可能的。

这仅在相邻对不同或相等对的游程不超过长度 O(1) 时才成立。 例如,在所有 8 对中只有一个 7,只有线性搜索可以。

【讨论】:

  • @I:我说过了,不是吗?
【解决方案3】:

让我们考虑由每隔一个数字组成的辅助数组,如果等于下一个则分配 0,否则分配 1。

[1,1,5,5,2,2,4,4,7,12,12,8,8]
[0,  0,  0,  0,  1,   1   ]

这个辅助数组排序清晰,可以通过二分查找找到前1个。

当然不能显式构造数组,因为这需要 O(N)。

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 2020-10-18
    • 2012-04-16
    • 2014-10-23
    • 2012-05-08
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多