【问题标题】: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;
}

【问题讨论】:

    标签: c recursion time-complexity divide-and-conquer master-theorem


    【解决方案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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 2011-09-01
        • 2016-01-08
        • 2015-05-30
        • 2015-02-12
        相关资源
        最近更新 更多