在O(log n)中的未排序数组中搜索值

时间:2018-08-27 12:27:06

标签: arrays algorithm search big-o

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

  

例如,您将获得一个未排序的数组,其中整数值成对出现,而1个值作为单个出现:

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

输出为:7

现在,我知道二进制搜索可以通过 O(log n)来做到这一点,但需要对数组进行排序。

那么如何在未排序数组的 O(log n)中完成此操作?

3 个答案:

答案 0 :(得分:3)

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

由于可以在恒定时间内找到任意元素所属的对的奇偶校验,因此确实有可能进行二分法查找奇偶校验跃迁。

这仅在相邻对不同或相等对的行数不超过长度O(1)的情况下成立。例如,在所有8对中只有一个7搜索可以做到。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

让我们考虑一下辅助数组,该数组由其他所有数字组成,如果等于下一个则分配0,否则分配1。

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

此辅助数组已明确排序,可以通过二进制搜索找到第一个。

当然,不能显式构造数组,因为这会占用O(N)。