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