我正在学习时间复杂度,并注意到我看到的教程没有考虑本机函数的时间复杂度(在本例中为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);
}
O(n( 正确吗?
O(N( 不正确。当您评估函数的时间复杂度时,您必须考虑函数中所有操作的时间复杂度,包括本机函数的时间复杂度。如果你所做的只是在你自己的函数中调用各种本机函数(这可能非常昂贵!(,那么调用函数 O(1( 就没有多大意义了。
您提供的函数片段将是 O(n + nlog(n((,因为有遍历数组 (O(N(( 的操作和使用 javascript 的本机函数 nlog(n( 进行排序的操作。
通常,在 Big-O 表示法中,我们只是根据其最慢的操作对函数进行分类,因此您也可以将该函数描述为 O(nlogn(。