我正在学习时间复杂性,并注意到我所看到的教程并未考虑本地函数的时间复杂性(此示例中的Javascript)
下面的函数将删除数组中的重复值并返回排序后的数组,其时间复杂度为O(n)而不是O(n + nlogn)。 O(n)是否正确?计算时间复杂度时,是否应该考虑本机函数的时间复杂度?
function uniqueSort(arr) {
const store = {};
const result = [arr[0]];
for(let i =0; i < arr.length; i++) {
if(!store[arr[i]]) {
result.push(arr[i]);
store[arr[i]] = true;
}
}
return result.sort((a,b) => a - b);
}
答案 0 :(得分:0)
O(n)正确吗?
O(N)不正确。在评估函数的时间复杂度时,必须逐行考虑函数中所有操作的时间复杂度,包括本机函数的时间复杂度。如果您要做的只是在自己的函数内部调用各种本机函数(可能会非常昂贵!),则调用函数O(1)并没有多大意义。
您提供的摘录功能为O(n + nlog(n)),因为存在循环遍历数组(O(N))的操作以及使用javascript本地函数nlog( n)。
通常,我们通常以最慢的操作对函数进行分类,因此您也可以将函数描述为O(nlogn)。