Javascript 在没有嵌套循环的情况下,是否可能具有二次时间复杂度?

Javascript 在没有嵌套循环的情况下,是否可能具有二次时间复杂度?,javascript,time-complexity,complexity-theory,Javascript,Time Complexity,Complexity Theory,事情进展得很顺利。我以为我对时间的复杂性很有头脑。我在玩Codibility游戏,用下面的算法解决了他们的一个问题。我知道有更好的方法来解决这个问题——排列检查——但我不明白没有嵌套循环的东西怎么会有^2的时间复杂度。我的印象是Javascript中的关联数组类似于散列,速度非常快,不会作为耗时的循环实现 下面是示例代码 function solution(A) { // write your code in JavaScript (Node.js) var dict = {};

事情进展得很顺利。我以为我对时间的复杂性很有头脑。我在玩Codibility游戏,用下面的算法解决了他们的一个问题。我知道有更好的方法来解决这个问题——排列检查——但我不明白没有嵌套循环的东西怎么会有^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;
}
这是判决书


你应该报告他们的工具中一定有一个bug:这段代码的复杂性为On。 相信我,我是互联网上的人

在我的机器上:

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
更新:要成为学究级的sic,我还需要第三个数据点来显示它的线性

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

你应该报告他们的工具中一定有一个bug:这段代码的复杂性为On。 相信我,我是互联网上的人

在我的机器上:

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
更新:要成为学究级的sic,我还需要第三个数据点来显示它的线性

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

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

function getTheLengthOfAListSquared(list) {
   for (var i = 0; i < list.length * list.length; i++) { }
   return i;
}
对于那个特定的代码示例,它看起来确实像@floribon所说的那样,因为Javascript对象查找应该是常量时间


请记住,制作一个算法来获取任意函数并确定该函数是否会完成是不可能的,更不用说确定复杂性了。编写一个工具来静态地确定除最简单的程序之外的任何程序的复杂性都是极其困难的,该工具的结果表明。

没有嵌套循环,有可能具有二次时间复杂性吗?对考虑这一点:

function getTheLengthOfAListSquared(list) {
   for (var i = 0; i < list.length * list.length; i++) { }
   return i;
}
对于那个特定的代码示例,它看起来确实像@floribon所说的那样,因为Javascript对象查找应该是常量时间


请记住,制作一个算法来获取任意函数并确定该函数是否会完成是不可能的,更不用说确定复杂性了。编写一个工具来静态地确定除最简单的程序之外的任何程序的复杂性都是极其困难的,该工具的结果表明了这一点。

您尝试过递归吗?:-但事实上,在这种情况下,复杂性应该与A.length成线性关系,而这个工具似乎有缺陷。它的可编码性,一个测试求职者是否能编码的网站!他们也有一些有趣的经验-这是一个基本的经验,你有没有尝试过递归?:-但事实上,在这种情况下,复杂性应该与A.length成线性关系,而这个工具似乎有缺陷。它的可编码性,一个测试求职者是否能编码的网站!他们也有一些有趣的教训-这是一个基本的一个从要学究,你仍然需要第三个数据点来显示它的linear@Gareth:要学究气,不管你有多少数据点,你总会找到一个高次多项式。要学究气,您仍然需要第三个数据点来显示它的linear@Gareth:要学究的话,不管你有多少数据点,你总能找到一个更高次的多项式。嗯,事实证明,不可能对每个任意程序都这样做。然而,事实上,大多数程序都可以这样做,特别是像这样的简单程序,它的输入格式很简单。对,但是这个工具仍然很难失败。嗯,事实证明,它不可能对每个任意的程序都这样做。然而,实际上大多数程序都可以这样做,特别是像这样的简单程序,它的输入格式很简单。是的,但是这个工具仍然很难失败。