二进制搜索2个排序整数数组

时间:2015-12-06 20:48:45

标签: algorithm binary-search

有一个大数组,由2个小整数数组组成,一个在另一个末尾。两个小数组都按升序排序。我们必须尽可能快地在大数组中找到一个元素。我的想法是通过大数组中的binsearch找到左数组的结尾,然后在小数组上实现2个binsesearch。问题是我不知道如何找到目的。如果你有一个想法,如何在不找到较小阵列的边界的情况下找到元素,那么欢迎你!

有关数组的信息:两个小数组都有整数元素,两者都按升序排序,它们的长度都可以从0到任意正整数,但只有一个元素的副本。 以下是大型数组的一些示例:

  1. 1 2 3 4 5 6 7(第二个数组的所有元素都比第一个数组的最大值大)

  2. 100 1(两个数组只有一个元素)

  3. 1 3 5 2 4 62 4 6 1 3 5(最常见的情况)

1 个答案:

答案 0 :(得分:1)

保证时间复杂度比O(n)更快无法解决这个问题,对某些数组来说根本无法解决。二进制搜索在O(log n)中运行,用于排序数组,但不保证大数组的排序,并且在最坏的情况下需要对每个元素进行一次或多次比较,即O(n)。最好的保证时间复杂度是O(n)和平凡的算法:将每个项目与其邻居进行比较,直到找到A[i] > A[i+1]的“转折点”。但是,如果您使用广度优先搜索,您可能会很幸运,并提前找到“转折点”。

证明某些数组无法解决问题:让数组M = [A B]成为我们的大数组。为了找到数组相遇的点,我们正在寻找一个i的索引M[i] > M[i+1]。现在让我A=[1 2 3]B=[4 5]。条件成立的数组M中没有索引,因此某些数组的问题无法解决。

前者的非正式证明:让M=[A B]A=[1..x]以及B=[(x+1)..y]成为两个排序数组。然后在x中交换元素yM的位置。没有(在最坏的情况下)检查每个索引,我们无法找到x的索引,因此问题是O(n)。

二进制搜索依赖于能够通过每次比较消除一半的解空间,但在这种情况下,我们无法从数组中消除任何内容,因此我们无法做到比线性搜索更好。

(从实际的角度来看,你不应该在程序中这样做。两个数组应该是分开的。如果这不可能,将任一数组的长度追加到更大的数组。)

修改:在问题更新后更改了我的答案。对于某些数组,它可能比线性时间更快,但不是所有可能的数组。以下是我使用广度优先搜索算法的想法:

Start with the interval [0..n-1] where n is the length of the big array.
Make a list of intervals and put the starting interval in it.
For each interval in the list:
    if the interval is only two elements and the first element is greater than the last
        we found the turning point, return it
    else if the interval is two elements or less
        remove it from the list
    else if the first element of the interval is greater than the last
        turning point is in this interval
        clear the list
        split this interval in two equal parts and add them to the list
    else
        split this interval in two equal parts and replace this interval in the list with the two parts

我认为广度优先方法会增加找到A[first] > A[last]早期间隔的几率。请注意,如果转折点介于两个间隔之间,则此方法将不起作用,但这可以帮助您入门。我会自己测试一下,但不幸的是我现在没有时间。