【问题标题】:What is the runtime complexity of this function?这个函数的运行时复杂度是多少?
【发布时间】: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 的参数移到构造函数之外,并使用filtermap 创建一个临时变量。然后在Set 构造函数中传递这个变量。您甚至可以优化您的代码,删除两个循环(过滤器和映射),并使用带有reduce 的单个循环同时执行这两个操作
  • @FrankModica 在“分析”部分,我认为“地图”操作是在“过滤器”操作中执行的......但正如你现在指出的那样,我'我意识到它可能不是......而且它总体上是线性的,正如你所指出的那样
  • 由于没有明确说明:并行性对于复杂性分析无关紧要。即使它可以帮助您将O(2n)(或除 2 之外的任何其他常量)减少为 O(n),请记住 O(2n)O(n) 的复杂性顺序相同

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 2017-09-11
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多