我认为它是二次O(n ^ 2),但由于不确定.filter()
和.map()
操作在JavaScript中的工作方式,因此不确定100%。
我有一个大问题是,整个filter()
操作是否在开始单个map()
操作之前就完成了,或者是否足够聪明,可以在内部迭代的情况下执行map()
操作filter()
操作。
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
}];
它似乎是:
filter()
用于subscriptions
的每个元素-时间n
map()
剩余的每个元素-时间n
(最大)new Set()
剩余的每个元素-时间n
(最大)对于new Set()
操作,我猜它正在创建一个新对象并将每个元素添加到创建的实例中。
如果数据中有很多重复项,则可以期望效率会提高。但是我们不希望数据中有很多重复项,而且根据我对“ Big O”的理解,最大限制是所使用的。
根据该分析,我期望时间复杂度为O(n^2)
或O(n^3)
。但是如上所述,我不确定如何确定它。
在此方面的任何帮助将不胜感激。预先感谢!
答案 0 :(得分:2)
我认为您对操作顺序的解释是正确的:过滤,然后映射,然后创建一个Set。
但是,为了使该算法达到O(n ^ 2),您必须创建一个嵌套循环,例如:
这里不是这种情况。在最坏的情况下(无重复),该算法将迭代输入数组3次,这意味着O(3 * n)复杂度仍然是线性的,而不是二次的。