给定一组n个整数和另一个整数x的算法,确定S中是否存在两个元素,其和是x

时间:2015-03-24 12:00:26

标签: algorithm

描述一种算法,其中,给定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++

3 个答案:

答案 0 :(得分:2)

您的算法与您的algrotihm存在小问题 -

  • k来自哪里?指数..?
  • 什么是x?它缺少参数
  • 为什么我和j是争论?
  • 为什么你会在我的循环中增加j和j在j循环中?
  • 你似乎也在修改数组,这会产生错误 结果

应修改它以解决这些问题,例如:

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)

这个问题可以通过更有效的方式解决:

  1. O(nlogn)时间(以及额外的空间)通过排序和迭代数组,为迭代时的每个元素x,二元搜索S-x,如果找到 - 答案是这些元件。
  2. 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)。