Javascript中的Big O表示法和函数式编程

时间:2017-01-05 16:16:02

标签: javascript arrays mongodb algorithm

我试图理解并使用reduce()说明以下算法的Big O表示法。我的理解是reduce是一个应用于数组对象的函数。它需要一个回调& initialValue。下面的代码是一个控制算法的控制器:

export const getPublicID = (req, res) => {
  const data = req.body.result;
  if (!data) res.status(422).json({ success: false, message: 'Upload Failed!' });
  console.time('ARRAY');
  const insertStuff = data.reduce((array, item) => {
    array.push({
      public_id: item.public_id,
      url: item.url,
      thumbnail_url: item.thumbnail_url
    });

    return array;
  }, []);
  console.timeEnd('ARRAY');

  Photo.insertMany(insertStuff)
    .then(
      img => res.status(201).json({
      success: true,
      message: 'Successfully added to database.',
      cloudinary: img
     }),
     err => res.status(422).json({ success: false, message: err })
    );
};

req.body.result作为一个对象数组出现,通过reduce方法,我创建了自己的对象数组,然后将其插入到MongoDB集合中。 Reduce循环遍历数组,所以我的想法是O(n),因为元素越多,迭代所需的时间就越多,因此就是线性图。如果这是正确的假设我的三个问题是如何影响我的算法:

  1. push()
  2. insertMany()
  3. 承诺
  4. 感谢您通过了解代码的优缺点来帮助数据结构和算法,我非常感谢!

1 个答案:

答案 0 :(得分:2)

Big O描述了渐近性能,更具体地说,它给出了算法时间复杂度的上限。这意味着它不会查看函数需要多少实际时间,可能是1 ms可能是1分钟,只是算法的效率。

O(n) 表示脚本将以线性时间运行。 例如:

for(int i=0; i<n; ++i) {
   print(i);
}

现在,如果您需要再次运行该数组,您将获得不同的性能。

O(n ^ 2) = O n平方=外环(i)x外环(x)

for(int i=0; i<n; ++i) {
    for(int x=0; x<n; ++x) {
        print(x);
    }
}

现在看看你正在做什么,你的分析是正确的,而你没有循环循环,只是顺序循环。

push(),虽然它是由 reduce()而不是 push()决定的。 有 insertMany(),它有承诺作为它的一部分。它不是一个额外的循环,只是一个正在执行的函数。

这意味着你有两个循环。有些人会说这给你O(2n),但是其他人声称没有这样的东西,也不会有所作为。

底线: 看看Big O的目的,它侧重于仍然是线性的增长率,它仍然给你O(n)。

相关问题