C 为什么这些函数具有不同的时间复杂性?
我知道mergeSort函数采用Ologn,merge函数采用Ologn,因此总的复杂度仅为OnlognC 为什么这些函数具有不同的时间复杂性?,c,time-complexity,mergesort,C,Time Complexity,Mergesort,我知道mergeSort函数采用Ologn,merge函数采用Ologn,因此总的复杂度仅为Onlogn void mergeSort(int arr[], int l, int r){ if(l >= r){ return; } int m = (l + r) / 2; mergeSort(arr, l, m); mergeSort(arr, m+1, r); merge(arr, l, m, r); } 现在让我们假
void mergeSort(int arr[], int l, int r){
if(l >= r){
return;
}
int m = (l + r) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
现在让我们假设我使用相同的逻辑来实现以下数组元素和的代码
int arraySum(int arr[], int l, int r){
if(l == r){
return arr[l];
}
int mid = (l + r) / 2;
int one = arraySum(arr[], l, mid);
int two = arraySum(arr[], mid + 1, r);
return one + two;
}
现在,这个arraySum函数与mergeSort函数相同,只是合并部分不同。
那么,arraySum的时间复杂性不应该是Ologn吗。但我知道这是不可能的,因为有n个元素,每个元素都是在O1中访问的,并且必须打开。
现在我对这两种逻辑感到困惑。
为什么mergeSort采用Ologn[忽略合并函数],而此arraySum采用,即使它们相同。arraySum的时间复杂度为On,而mergeSort的时间复杂度为logn。请注意|的每个实例都返回1+2;|具有复杂性O1,而| mergearr,l,m,r;|的每个实例具有复杂性或-l
对于n个元素,arraySum将执行n-1次添加,而mergeSort将执行n次添加⌈log2n⌉ 移动。arraySum的时间复杂度为On,而mergeSort的时间复杂度为logn。请注意|的每个实例都返回1+2;|具有复杂性O1,而| mergearr,l,m,r;|的每个实例具有复杂性或-l 对于n个元素,arraySum将执行n-1次添加,而mergeSort将执行n次添加⌈log2n⌉ 移动