超时错误。此代码段中的性能问题是什么?

时间:2017-12-03 01:36:57

标签: javascript performance optimization

我最近开始进行一些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
}

The performance errors i'm getting from codility

2 个答案:

答案 0 :(得分:1)

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

从数据结构的角度来看,

设置: O(n)空间复杂度和O(n*log(n))时间复杂度。但似乎V8以不同的方式执行此操作设置插入归结为O(1),使时间复杂度O(n)

MAP: O(N)空间复杂度,但我认为时间复杂度与其他复杂度相比会略低一些,可能是O(N),因为每个键查找需要O(1)< / p>

有关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()])

答案 1 :(得分:0)

您的代码的时间复杂度为O(n ^ 2) 您有一个外部for循环O(n),并且您正在使用include方法,该方法会使数组横穿O(n)次

您可以简单地做到这一点

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

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

相关问题