Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 此函数的运行时复杂性是多少?_Javascript_Algorithm_Typescript_Time Complexity_Big O - Fatal编程技术网

Javascript 此函数的运行时复杂性是多少?

Javascript 此函数的运行时复杂性是多少?,javascript,algorithm,typescript,time-complexity,big-o,Javascript,Algorithm,Typescript,Time Complexity,Big O,我相信它是二次O(n^2),但由于.filter()和.map()操作在JavaScript中如何工作的不确定性,它不是100%确定的 我面临的一个大问题是,整个filter()操作是在启动单个map()操作之前完成的,还是在filter()操作中进行迭代时执行map()操作足够智能 方法 示例输入数据 据我所见 似乎是: filter()用于订阅的每个元素-timen 每个剩余元素的map()时间n(最大值) new Set()对于每个剩余元素-时间n(最大值) 对于newset()操作,

我相信它是二次O(n^2),但由于
.filter()
.map()
操作在JavaScript中如何工作的不确定性,它不是100%确定的

我面临的一个大问题是,整个
filter()
操作是在启动单个
map()
操作之前完成的,还是在
filter()
操作中进行迭代时执行
map()
操作足够智能

方法 示例输入数据 据我所见 似乎是:

  • filter()
    用于订阅的每个元素-time
    n
  • 每个剩余元素的
    map()
    时间
    n
    (最大值)
  • new Set()
    对于每个剩余元素-时间
    n
    (最大值)
对于
newset()
操作,我猜它正在创建一个新对象,并将每个元素添加到创建的实例中

如果数据中有许多重复项,那么可以预期效率会提高。但我们不希望数据中有太多重复,根据我对“大O”的理解,最大的限制是所使用的内容

从这个分析中,我期望时间复杂度为
O(n^2)
O(n^3)
。但如上所述,我不确定如何解释它


在此方面的任何帮助都将不胜感激。提前谢谢

我认为您对操作顺序的解释是正确的:过滤,然后映射,然后创建一个集合

但是,为了使此算法达到O(n^2),必须创建嵌套循环,例如:

  • 为数组的每个元素创建集合
  • 将数组中的每个元素与其他元素进行比较

这里的情况并非如此。在最坏的情况下(无重复),算法将迭代输入数组三次,这意味着O(3*n)复杂性仍然是线性的,而不是二次的。

我认为您对操作顺序的解释是正确的:过滤,然后映射,然后创建一个集

但是,为了使此算法达到O(n^2),必须创建嵌套循环,例如:

  • 为数组的每个元素创建集合
  • 将数组中的每个元素与其他元素进行比较

这里的情况并非如此。在最坏的情况下(无重复),算法将迭代输入数组三次,这意味着O(3*n)复杂度仍然是线性的,而不是二次的。

仍然不清楚您是如何做到这一点的,以及问题是什么,但从提供的代码来看,复杂度是
O(n)
。要么你忘了提供一些其他细节,要么你误解了大O符号的概念:)根据你的分析,是不是
O(2N)
还是
O(3N)
,然后是~
O(N)
?我不知道为什么每次迭代时都要添加指数。您的复杂性应该是
O(n)
。用这种方式检查一下。将
集合
的参数移到构造函数之外,然后使用
过滤器
映射
创建一个临时变量。然后将此变量传递到
集合
构造函数中。您甚至可以通过删除两个循环(过滤器和映射)来优化代码,并使用带有
reduce
的单个循环,该循环同时执行这两个操作time@FrankModica在“分析”部分,我认为“映射”操作是在“过滤”操作中执行的。。。但正如你现在指出的,我意识到这可能不是。。。总体来说,它是线性的,正如你所指出的,因为它还没有被阐明:平行性对于复杂性分析并不重要。即使它有助于将
O(2n)
(或除2以外的任何其他常数)减少为
O(n)
,请记住
O(2n)
的复杂度顺序与
O(n)
的复杂度顺序相同,仍然不太清楚您是如何得出这一结论的,问题是什么,但从提供的代码来看,复杂度是
O(n)
。要么你忘了提供一些其他细节,要么你误解了大O符号的概念:)根据你的分析,是不是
O(2N)
还是
O(3N)
,然后是~
O(N)
?我不知道为什么每次迭代时都要添加指数。您的复杂性应该是
O(n)
。用这种方式检查一下。将
集合
的参数移到构造函数之外,然后使用
过滤器
映射
创建一个临时变量。然后将此变量传递到
集合
构造函数中。您甚至可以通过删除两个循环(过滤器和映射)来优化代码,并使用带有
reduce
的单个循环,该循环同时执行这两个操作time@FrankModica在“分析”部分,我认为“映射”操作是在“过滤”操作中执行的。。。但正如你现在指出的,我意识到这可能不是。。。总体来说,它是线性的,正如你所指出的,因为它还没有被阐明:平行性对于复杂性分析并不重要。即使它有助于将
O(2n)
(或除2以外的任何其他常数)减少为
O(n)
,请记住
O(2n)
的复杂度顺序与
O(n)
function subscribedListsFromSubscriptions(subscriptions: Subscription[]) {
    return new Set(listSubscriptions.filter((list) => {
        return list.subscribed;
      }).map((list) => {
        return list.list_id;
  }));
}
let subscriptions = [ {
  list_id: 'abc', 
  subscribed: false
}, {
  list_id: 'ghi',
  subscribed: false
}];