我有一个在下面编写的函数。这个函数本质上是一个归并排序。
public static long nlgn(double[] nums) {
if(nums.length > 1) {
int elementsInA1 = nums.length/2;
int elementsInA2 = nums.length - elementsInA1;
double[] arr1 = new double[elementsInA1];
double[] arr2 = new double[elementsInA2];
for(int i = 0; i < elementsInA1; i++)
arr1[i] = nums[i];
for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
arr2[i - elementsInA1] = nums[i];
nlgn(arr1);
nlgn(arr2);
int i = 0, j = 0, k = 0;
while(arr1.length != j && arr2.length != k) {
if(arr1[j] <= arr2[k]) {
nums[i] = arr1[j];
i++;
j++;
} else {
nums[i] = arr2[k];
i++;
k++;
}
}
while(arr1.length != j) {
nums[i] = arr1[j];
i++;
j++;
}
while(arr2.length != k) {
nums[i] = arr2[k];
i++;
k++;
}
}
return nuts;
}
由于这是一个合并排序,我从我的研究中知道这个算法的大O复杂度是O(n lgn)。然而,当我运行计时测试时,我得到的结果并不表明它在 O(n lgn) 时间内运行。不过,这似乎是 O(n lgn) 时间,因为直到我们到达开头的两个 for 循环的末尾。它运行时间为 O(n)。一旦超过这个时间,它应该在 O(lgn) 时间内运行,因为它对每个元素进行排序。
我的问题是,有人可以确认这段代码在 O(nlogn) 时间内运行吗?如果没有,我想知道我的理解哪里出了问题。
O(nlogn) 是渐近紧界。这意味着,只有当n足够大时,其运行时间才接近复杂度。当n很小时,由于函数调用开销和许多其他因素,界限并不紧密。
您可以使 n 更大,并比较输入之间的比率,看看它是否接近 O(nlogn)。虽然我真的怀疑你必须让n有多大......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)