没有嵌套循环可能有二次时间复杂度吗?

时间:2015-02-25 22:46:36

标签: javascript time-complexity complexity-theory

情况进展顺利。我以为自己的时间复杂了。我正在尝试编码,并使用以下算法来解决他们的一个问题。我知道这个问题有更好的解决方案(置换检查) - 但我根本不明白没有嵌套循环的东西如何具有O(N ^ 2)的时间复杂度。我的印象是Javascript中的关联数组就像哈希并且非常快,并且不会被实现为耗时的循环。

以下是示例代码

function solution(A) {
    // write your code in JavaScript (Node.js)
    var dict = {};

    for (var i=1; i<A.length+1; i++) {
        dict[i] = 1;
    }

    for (var j=0; j<A.length; j++) {
        delete dict[A[j]];
    }

    var keyslength = Object.keys(dict).length;
    return keyslength === 0 ? 1 : 0;
}

这是判决书

result

2 个答案:

答案 0 :(得分:5)

他们的工具中必须存在您应该报告的错误:此代码的复杂性为O(n)。 相信我,我是互联网上的某个人。

在我的机器上:

console.time(1000);
solution(new Array(1000));
console.timeEnd(1000);
//about 0.4ms

console.time(10000);
solution(new Array(10000));
console.timeEnd(10000);
// about 4ms

更新:为了迂腐(原文如此),我仍然需要第三个数据点才能显示它是线性的

console.time(100000);
solution(new Array(100000));
console.timeEnd(100000);
// about 45ms, well let's say 40ms, that is not a proof anyway

答案 1 :(得分:4)

是否有可能在没有嵌套循环的情况下具有二次时间复杂度?是。考虑一下:

function getTheLengthOfAListSquared(list) {
   for (var i = 0; i < list.length * list.length; i++) { }
   return i;
}

至于那个特定的代码示例,它似乎是O(n),因为@floribon说,因为Javascript对象查找应该是恒定的时间。

请记住,制作一个采用任意函数并确定该函数是否完全完全的算法是不可能的(halting problem),更不用说确定复杂性了。编写一个工具来静态地确定除了最简单的程序之外的任何东西的复杂性将是非常困难的,并且该工具的结果证明了这一点。