Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays O中未排序数组中的搜索值(日志n)_Arrays_Algorithm_Search_Big O - Fatal编程技术网

Arrays O中未排序数组中的搜索值(日志n)

Arrays O中未排序数组中的搜索值(日志n),arrays,algorithm,search,big-o,Arrays,Algorithm,Search,Big O,我的朋友在一次测试中遇到了一个问题,问题是: 您将得到一个未排序的数组,其中整数值成对,1个值为单个,例如: [1,1,5,5,2,2,4,4,7,12,12,8,8] 输出为:7 现在我知道二进制搜索可以用O(logn)完成,但是数组需要排序 那么,在这个未排序的数组上,如何在O(logn)中进行此操作呢?如果单例左侧的所有对都在偶数/奇数索引上,而右侧的对都在奇数/偶数索引上,这就足够了 由于任意元素所属对的奇偶性可以在恒定的时间内找到,因此找到奇偶转换的二分法过程确实是可能的 仅当相邻对

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

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

[1,1,5,5,2,2,4,4,7,12,12,8,8]
输出为:
7


现在我知道二进制搜索可以用O(logn)完成,但是数组需要排序


那么,在这个未排序的数组上,如何在O(logn)中进行此操作呢?

如果单例左侧的所有对都在偶数/奇数索引上,而右侧的对都在奇数/偶数索引上,这就足够了

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


仅当相邻对不同或相等对的运行长度从未超过长度O(1)时,此选项才有效。例如,对于所有8对中的单个7,只有线性搜索可以执行。

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

  • 必须包含2n+1个元素的数组拆分如下:
  • 将中间元素与第一部分的最后一个元素和第二部分的第一个元素进行比较
    • 如果不等于两者,则已找到单个元素
    • 否则,将中间元素添加到具有相同元素的零件中(如果它等于第一个零件的最后一个元素,则将其附加到第一个零件,否则将其作为第一个元素添加到第二个零件)
  • 对元素数为奇数的零件重复上述步骤

  • 让我们考虑由其他数构成的辅助阵列,如果等于下一个,则分配0,否则为1。

    [1,1,5,5,2,2,4,4,7,12,12,8,8]
    [0,  0,  0,  0,  1,   1   ]
    
    这个辅助数组被清晰地排序,第一个1可以通过二进制搜索找到


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

    关闭的原因是荒谬的。值总是成对的吗?@Satpal:检查这个例子。搜索的是任何整数值,还是只搜索没有“另一半”的孤立数字?我知道二进制搜索可以用O(logn)来完成“但是数组需要排序”:恐怕这句话是错误的,对元素进行排序无助于找到单例。@I:我是这么说的,不是吗?万一相邻的成对数相等怎么办?@Yvesdao那么它们将不再是(可定界的)对,而是一组四个。这就是我对这个问题的理解。如果这是允许的呢?@YvesDaoust那么在O(logn)中就不可行了。如果单个值等于相邻对的值,则该算法也不起作用。