描述一种算法,其中,给定n个整数的集合S和另一个整数x,确定S中是否存在两个元素,其总和恰好是x。如果我的算法正确或我需要做哪些修改,请告诉我? 算法:
Algo(i,j,k,S)
for (j = 1 to S.length - 1 , i++ )
for (i= j+1 to S.length)
A[k] = A[j] + A[i]
if A[k] = x
return A[i], A[j]
else j++
答案 0 :(得分:2)
您的算法与您的algrotihm存在小问题 -
k
来自哪里?指数..? x
?它缺少参数应修改它以解决这些问题,例如:
Algo(S,x)
for (i = 1 to S.length - 1 , i++ )
for (j= i+1 to S.length)
t = S[j] + S[i]
if t = x
return S[i], S[j]
else j++
除此之外,你的算法似乎是正确的,而且这种方法基本上是一种蛮力 - 你检查所有对,所以如果存在这样的一对,你肯定会找到它。但是,您的方法效率低,运行时间O(n^2)
。
这个问题可以通过更有效的方式解决:
O(nlogn)
时间(以及额外的空间)通过排序和迭代数组,为迭代时的每个元素x
,二元搜索S-x
,如果找到 - 答案是这些元件。O(n)
平均时间+空间:将所有元素存储在哈希集中,然后迭代数组,并为每个元素x
搜索S-x
是否在集合中。如果数组中允许重复,则存储为哈希映射,并确保您不会两次返回相同的索引。答案 1 :(得分:0)
我认为你需要一些标准:
1)在任何行之前添加一个数字,以便将来轻松引用它们 2)当您使用一种语句格式时,请保留格式:
for (j = 1 to S.length - 1 , i++ )
for (i = j+1 to S.length , ??? )
3)当你需要一些变量时,请在某处声明:A[], k
。
嗯,这可能是更好的一个:
0) Start [Algo(i, j, S[], x)] 'i, j are local & S[], x are inputs
1) for (j = 1 to S.length - 1, j++ )
1.1) for (i = j + 1 to S.length, i++ )
1.1.1) if (x = S[j] + S[i])
1.1.1.1) return 'at least one match', S[i], s[j]
2) return 'No match'
3) End
答案 2 :(得分:0)
O(n)平均时间,如果数组很大且有很多解,则速度更快:从包含第一个数组元素A [0]的集合开始。然后,对于i = 1到(元素数量-1),检查x-A [i]是否在集合中并退出(如果是),然后将A [i]添加到集合中。
对于具有k个解的随机顺序的数组,这将是O(N * min(1,1 / sqrt(k))。感谢Amit首先建议该集合。
如果我们正在寻找多个值x,我们将利用我们已经在集合中添加了许多值的事实。如果我们没有找到一个x的解,然后另一个x有k个解,那么对于那个x我们将降到O(N / k)。