划分和征服算法 - 二进制搜索变体

时间:2015-12-06 17:14:25

标签: algorithm binary-search divide-and-conquer

这是理解Divide和征服算法的实践问题。

您将获得N个排序整数的数组。除了一个元素外,所有元素都是不同 元素重复两次。设计一个O(log N)算法来找到该元素。

我认为需要对该数组进行划分,看看是否在下一个索引中找到了相等的对应物,我相信是二进制搜索的一些变体。但我无法找到任何解决方案或指导。

2 个答案:

答案 0 :(得分:3)

你不能在O(log n)时间内完成它,因为即使你将数组分为2个部分,任何步骤都无法决定哪个部分需要考虑进一步处理,哪个部分应该留下。 另一方面,如果连续数字全部出现在数组中,那么通过查看索引和索引中的值,我们可以决定重复的数字是在数组的左侧还是右侧。

答案 1 :(得分:0)

D&C应该看起来像这样

int Twice (int a[],int i, int j) {
    if (i >= j)
       return -1;
    int k = (i+j)/2;
    if (a[k] == a[k+1]) 
       return k;
    if (a[k] == a[k-1])
       return k-1;
    int m = Twice(a,i,k-1);
    int n = Twice(a,k+1,j);
    return m != -1 ? m : n;
}


int Twice (int a[], int n) {
    return Twice(a,0,n);
}

但是它具有复杂度O(n)。如上所述,无法找到针对该问题的O(lg n)算法。