我试图理解并使用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),因为元素越多,迭代所需的时间就越多,因此就是线性图。如果这是正确的假设我的三个问题是如何影响我的算法:
push()
insertMany()
感谢您通过了解代码的优缺点来帮助数据结构和算法,我非常感谢!
答案 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)。