【问题标题】: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】:
与您的递归方案相同,如果您只有一个元素的数组,则答案通常是“是”。
如果你有两个元素,如果它们相等则为“是”。
如果有更多,请在 start 和 end 之间选择一个中点,递归确保中点之前的所有元素都相同,并且中点之后的所有元素都相同。两边检查的中点也将确保两边相等。
我不擅长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)