检查所有元素是不是与分而治之相同

Posted

技术标签:

【中文标题】检查所有元素是不是与分而治之相同【英文标题】:Check if al elements are the same with divide and conquer检查所有元素是否与分而治之相同 【发布时间】:2019-01-09 17:21:14 【问题描述】:

我想检查数组中的所有元素是否相同。我递归地做了,但我想用分而治之的方法来做。我也希望时间复杂度为 O(n)。如何用主定理解释?

bool same_elements(int* array,size_t start, size_t end)
    if(start==end) return true;

    if(array[start]==array[start+1])
        return same_elements(array,start+1,end);
    
    return false;

【问题讨论】:

【参考方案1】:

与您的递归方案相同,如果您只有一个元素的数组,则答案通常是“是”。

如果你有两个元素,如果它们相等则为“是”。

如果有更多,请在 startend 之间选择一个中点,递归确保中点之前的所有元素都相同,并且中点之后的所有元素都相同。两边检查的中点也将确保两边相等。

我不擅长Master Theorem,但直觉上-计算比较次数,N=1的情况下为零,N=2的情况下为1;在 N=3 的情况下,我们将问题拆分为 T(2)+T(2) = 1+1 = 2 等。很容易看出,总是会有 N-1 个元素比较。

【讨论】:

【参考方案2】:

我试图修复我所做的。这是我现在的代码:

bool same_elements(int* array,size_t start, size_t end)
   if(start==end) return true;

   int m = (start + end) / 2;

   if(array[m]==array[start] && array[m]==array[end])
      return same_elements(array,start,m-1) && same_elements(array,m+1,end);
   
   return false;

时间复杂度约为 O(n)。

主定理:

A=2 B=2 C=0 => n^c=n^0=1

T(n)=2T(n/2) + O(1)

A>B^C => O(n^logB(A)) = O(n^log2(2)) = O(n)

【讨论】:

以上是关于检查所有元素是不是与分而治之相同的主要内容,如果未能解决你的问题,请参考以下文章

分而治之检查重复项

快速排序算法

给定已排序的数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i

使用C使用分而治之查找数组中的多数元素

SIGABRT(信号 6)在使用分而治之的数组中查找多数元素时出错

分而治之 - 比较所有可能的组合