time-complexity - 计算 big-O 时如何处理本机函数的时间复杂度
问题描述
我正在学习时间复杂度,并注意到我看到的教程没有考虑本机函数的时间复杂度(本例中为 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)。
推荐阅读
- node.js - PascalCase 的正则表达式问题没有击中第一个单词
- javascript - Javascript对象结构区别
- mysql - 如何从 Digital Ocean 管理的数据库中导出 MySQL 数据库
- python - 如何在熊猫对象的价格列中附加一个字符
- node.js - 如何优化具有大量节点模块的反应应用程序的 docker 构建
- c - 编译错误:语句无效
- opc-ua - OPC UA TranslateBrowsePathsToNodeIds:如何稳定/易失地解析 NodeID
- python - 如何更改数据在 mongoDB 数据字段中的位置?
- linux - 从特定用户拥有的特定目录中删除 Linux 中的文件的命令是什么?
- vue.js - 在 Vue 中,如何将特殊的 $event 变量作为参数传递?