Javascript 此函数的运行时复杂性是多少?
我相信它是二次O(n^2),但由于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()操作,
.filter()
和.map()
操作在JavaScript中如何工作的不确定性,它不是100%确定的
我面临的一个大问题是,整个filter()
操作是在启动单个map()
操作之前完成的,还是在filter()
操作中进行迭代时执行map()
操作足够智能
方法
示例输入数据
据我所见
似乎是:
用于订阅的每个元素-timefilter()
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
}];