【发布时间】:2019-06-08 12:09:30
【问题描述】:
我相信它是二次 O(n^2) 但不是 100% 确定,因为不确定 .filter() 和 .map() 操作在 JavaScript 中的工作方式。
我最大的问题是整个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)。但如前所述,我不确定如何确定地解释它。
对此的任何帮助将不胜感激。提前致谢!
【问题讨论】:
-
目前还不是很清楚你是如何做到这一点的,问题是什么,但从提供的代码来看,复杂性是
O(n)。要么你忘记提供一些其他细节,要么你误解了 Big-O 表示法的概念 :) -
根据你的分析,是不是
O(2N)或者O(3N),那是~O(N)?我不确定为什么每次迭代时都添加指数。 -
你的复杂度应该是
O(n)。以这种方式检查它。将Set的参数移到构造函数之外,并使用filter和map创建一个临时变量。然后在Set构造函数中传递这个变量。您甚至可以优化您的代码,删除两个循环(过滤器和映射),并使用带有reduce的单个循环同时执行这两个操作 -
@FrankModica 在“分析”部分,我认为“地图”操作是在“过滤器”操作中执行的......但正如你现在指出的那样,我'我意识到它可能不是......而且它总体上是线性的,正如你所指出的那样
-
由于没有明确说明:并行性对于复杂性分析无关紧要。即使它可以帮助您将
O(2n)(或除 2 之外的任何其他常量)减少为O(n),请记住O(2n)与O(n)的复杂性顺序相同
标签: javascript algorithm typescript time-complexity big-o