javascript中的大O表示法和函数编程

javascript中的大O表示法和函数编程,javascript,arrays,mongodb,algorithm,Javascript,Arrays,Mongodb,Algorithm,我正在尝试使用reduce()来理解和说明以下算法的大O符号。我的理解是reduce是一个应用于数组对象的函数。它接受一个回调&一个初始值。下面的代码是保存算法的控制器: export const getPublicID = (req, res) => { const data = req.body.result; if (!data) res.status(422).json({ success: false, message: 'Upload Failed!' }); co

我正在尝试使用
reduce()
来理解和说明以下算法的大O符号。我的理解是reduce是一个应用于数组对象的函数。它接受一个回调&一个初始值。下面的代码是保存算法的控制器:

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),因为元素越多,迭代所需的时间就越多,因此是一个线性图。如果这是正确的假设,我的三个问题是:以下因素如何影响我的算法:

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 })
    );
};
  • push()
  • insertMany()
  • 承诺

  • 感谢您帮助noob了解数据结构和算法,了解代码的优缺点,我非常感谢

    大O描述了渐近性能,更具体地说,它给出了算法时间复杂度的上界。这意味着它不看一个函数实际花费了多少时间,可能是1毫秒,也可能是1分钟,只看你的算法有多高效

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

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

    用于(int i=0;i
    insertMany
    看起来像是一个异步调用。运行时间可能会有所不同。@RajaprabhuAravindasamy我必须对此进行研究,但我相信你是对的,这是Mongo库中的一个方法。因此,在大多数情况下,假设说来,如果你想看一个算法的大O符号,你可以忽略promises这是有意义的,因为承诺只是等待我们声明的承诺是什么变量。我不确定
    push()
    ,所以它被认为是一个循环?@cody,这是关于逻辑效率的。因此,如果你有一组10个项目,每个项目(循环)运行1个函数或3个函数,从渐近性能的角度看并不重要。它仍然是线性的,因为它不会根据输入而改变。另一方面,如果您有10个项,并且每个项都包含10个需要处理的项,那么在循环中就有一个循环。'push()'不是循环,而是由循环'reduce()'运行的函数。此方法在每个元素上运行一个函数,因此您可以将其视为一个循环。希望这有帮助。@Robert--那么我们可以说,执行类似….
    myArray.reduce().reduce()
    的操作也等同于O(2n)或O(n)?