【问题标题】:Big O of a simple function简单函数的大 O
【发布时间】:2021-06-03 10:24:21
【问题描述】:

我正在学习数据结构,对这个游戏很陌生。我知道为 n 次迭代运行的单个循环具有 O(n) 时间复杂度。但是如果我在 for 循环中使用splice,它会是 O(n2) 时间复杂度吗?我很肯定它是 O(n2) 但想确定一下。

这是我正在处理的示例代码:

var createTargetArray = function(nums, index) {
    let target = []
    for (let i=0; i< index.length; i++){
        let idx = index[i]
        target.splice(idx,0,nums[i])
    }
    return target
};

【问题讨论】:

  • .splice() 的调用基本上是一个“隐藏循环”,所以是的,我称之为n²
  • 虽然splice 可能是一个“隐藏循环”,因为您一次只使用它添加一个元素,您可以获得的最差性能是在第一个位置添加每个新元素(又名unshift),从而将所有其他元素向上移动一个索引。我不确定unshift 的时间复杂度是多少,所以我会留给你/其他人去寻找。

标签: javascript algorithm data-structures


【解决方案1】:

你是对的。 拼接方法的最坏情况应该是 O(n)。 该调用发生在 foreach 循环 O(n) 的迭代中; 所以整个脚本的大 o-notation 是 O(n^2)

【讨论】:

    【解决方案2】:

    由于大 O 表示法询问您的函数需要多少次迭代才能对数组执行 f(x) 作为输入,所以当您遍历所有元素时,一般时间复杂度为 O(n)。然而,在 JavaScript 中使用 .splice() 函数在理想情况下也具有 O(n) 的时间复杂度,因此当你将 O(n) 放入另一个 O(n) 时,它实际上变成了 O(n^2)。作为一个好的经验法则,您可以考虑嵌套 O(n) 将 n 的幂增加一。例如,如果您要循环让一个三重嵌套循环对数组的每个元素执行 1 次操作,它将变为 O(n^3) 等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多