这个JavaScript函数的时间复杂度是线性的还是二次的?
我试图在谷歌采访视频中了解这个解决方案: 虽然他们在视频中说它是线性的,但我不能100%确定整个解决方案是否(以及为什么)是线性的而不是二次的 因为这个JavaScript函数的时间复杂度是线性的还是二次的?,javascript,algorithm,performance,time-complexity,Javascript,Algorithm,Performance,Time Complexity,我试图在谷歌采访视频中了解这个解决方案: 虽然他们在视频中说它是线性的,但我不能100%确定整个解决方案是否(以及为什么)是线性的而不是二次的 因为find() 但是find() 以下是我的JavaScript解决方案版本: const findSum=(arr,val)=>{ 让searchValues=[val-arr[0]]; for(设i=1;i
find()
但是find()
以下是我的JavaScript解决方案版本:
const findSum=(arr,val)=>{
让searchValues=[val-arr[0]];
for(设i=1;i
我的工作:
- 当
i=1
时,searchValues.length=0
- 当
i=2
时,searchValues.length=1
- 当
i=3
时,searchValues.length=2
这不应该意味着O(N+(N-1))的线性运行时间吗?还是我遗漏了什么
谢谢你的帮助 是的,您的解决方案是二次的,因为正如您所提到的。includes
遍历数组,for
的也遍历数组。然而,在采访中,他们谈到了查找数组的无序_集
,这意味着这可以实现为哈希集,它有O(1)个查找/插入时间,使得算法O(n)(和O(n²)最坏,最坏的情况)。JS等价物将是一个集合
:
const findSum = (arr, sum) =>
arr.some((set => n => set.has(n) || !set.add(sum - n))(new Set));
如果将集合
用于搜索值
,这将是线性的。正如@jonaswillms所指出的,集合使函数线性,因为查找
/包含
操作将是O(1)。链接视频使用集合,但您的解决方案版本使用数组,因此您的版本将是二次的,而它可以(应该)是线性的。非常感谢您的帮助和新的解决方案,Jonas。是时候让我更深入地了解场景了!
const findSum = (arr, sum) =>
arr.some((set => n => set.has(n) || !set.add(sum - n))(new Set));