检查所有元素是不是与分而治之相同
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】:与您的递归方案相同,如果您只有一个元素的数组,则答案通常是“是”。
如果你有两个元素,如果它们相等则为“是”。
如果有更多,请在 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)
【讨论】:
以上是关于检查所有元素是不是与分而治之相同的主要内容,如果未能解决你的问题,请参考以下文章
给定已排序的数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i