【问题标题】:Timeout error . What is the performance issue in this snippet?超时错误。此代码段中的性能问题是什么?
【发布时间】:2020-12-11 18:45:15
【问题描述】:

我最近开始进行一些 Codility 编码测试,到目前为止,我的代码性能几乎每次都是 0%。

https://codility.com/programmers/lessons/6-sorting/distinct/ 是一个非常简单的代码,用于查找数组中不同整数的数量。

我的代码在语法上是正确的并且可以正常工作,但是我可以做些什么来优化性能?

这是我的代码:

function solution(A) {


    var res = []
    var len = A.length
    for(var i=len;i--;){
        if(!res.includes(A[i])){
            res.push(A[i])
            }
        }
        return res.length
}

【问题讨论】:

标签: javascript performance optimization


【解决方案1】:

感谢@Slai 和@le_m 提供额外的指导。

SET: 从数据结构的角度来看,O(n) 空间复杂度和O(n*log(n)) 时间复杂度。但似乎 V8 以不同的方式进行设置插入归结为 O(1) 使得时间复杂度 O(n)

MAP: O(N) 空间复杂度,但我认为时间复杂度会比其他的要小一些,可能是 O(N),因为每个键查找都需要 O(1)

有关 Javascript 集合复杂性的更多信息

Javascript ES6 computational/time complexity of collections

es6 Map and Set complexity, v8 implementation

// USING ES6 SET

// ONE LINER
// console.log((new Set(arr)).length)

// BREAKDOWN
const arr = [1, 2, 3, 2, 1, 4, 1];

var setArr = new Set();

arr.forEach(number => setArr.add(number))

console.log([...setArr])

// USING ES6 MAP
let map = new Map();

arr.forEach(number => map.set(number, "PRESENT"))

console.log([...map.keys()])

【讨论】:

  • 哦,我明白了,这只是为了获取元素的数量。这是一个伟大的班轮。让我把它加到 sn-p 中。
  • 非常感谢@Nandu Kalidindi,虽然我必须返回尺寸,但您的代码是完美的。再次感谢
  • 每次将元素插入 Set 需要 O(log(N)),因此,N 个元素插入需要 O(N*log(N))。请再次通过查看 Set 自己的工作方式来确认。
  • @le_m 我也想知道同样的问题,但似乎规范不要求实现为 O(1) 添加/删除/具有stackoverflow.com/questions/31091772/…。 @NanduKalidindi 我猜你没见过[...new Set(arr)] stackoverflow.com/a/33121880/1383168
  • @Slai 是的,我愿意,我只是补充说,为了给出答案的细分,一个衬里并不是那么自我解释。抱歉,我从通常的 C 数据结构的角度添加了 NlogN。如果 V8 在内部使用 Map 实现它,那么它将是 O(1)。请在答案中添加尽可能多的发现。谢谢。
【解决方案2】:

你的代码的时间复杂度是 O(n^2) 您有一个外部 for 循环 O(n) 并且您正在使用包含遍历数组 O(n) 次的方法

你可以这样做

function unique(A) {
   let newSet = new Set(A)
    return newSet.size
}

时间复杂度:O(N*log(N)) 或 O(N)

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 2021-01-21
    • 2012-01-15
    • 2016-08-03
    • 2012-08-14
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多