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

时间:2019-01-14 13:38:14

标签: javascript algorithm typescript time-complexity big-o

我认为它是二次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)。但是如上所述,我不确定如何确定它。

在此方面的任何帮助将不胜感激。预先感谢!

1 个答案:

答案 0 :(得分:2)

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

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

  • 为数组的每个元素创建Set
  • 比较数组中的每个元素和其他元素。

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