【问题标题】:Algorithm for- given a set S of n integers and another integer x, determine whether or not there exist two elements in S whose sum is exactly x算法 - 给定一个由 n 个整数组成的集合 S 和另一个整数 x,确定 S 中是否存在两个和正好为 x 的元素
【发布时间】:2015-05-27 17:37:36
【问题描述】:

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

【问题讨论】:

    标签: algorithm


    【解决方案1】:

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

    • k 是从哪里来的?指数……?
    • 什么是x?它作为参数丢失
    • 为什么 i 和 j 是参数?
    • 为什么要增加 i 的循环中的 j 和 j 的循环中的 i?
    • 您似乎也在修改数组,这会产生错误 结果

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

    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是否在集合中。如果数组中允许重复,请将其存储为哈希映射,并确保不会两次返回相同的索引。

    【讨论】:

    • For 1:排序后,数组开头有一个指针,数组末尾有一个指针,如果总和小于则在开头增加一个,如果在末尾增加一个总和大于目标。
    • 对于 2:小心如果 x = 2 * A [k] 对于某些 k,并且 x 必须是两个不同元素的和。
    • @gasher729 (1) 并不重要,瓶颈仍然是排序。 (2) 我明确指出了。
    【解决方案2】:

    我认为你需要一些标准:

    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
    

    【讨论】:

      【解决方案3】:

      如果数组很大并且有很多解决方案,则平均时间为 O (n) 并且更快:从包含第一个数组元素 A [0] 的集合开始。然后 for i = 1 to (number of elements - 1) 检查 x - A [i] 是否在集合中,如果在则退出,然后将 A [i] 添加到集合中。

      对于具有 k 个解决方案的随机顺序数组,这将是 O (N * min (1, 1/sqrt (k))。感谢 Amit 首先建议该集合。

      如果我们正在寻找多个值 x,我们将利用我们已经在集合中添加了许多值的事实。如果我们没有找到一个 x 的解决方案,然后另一个 x 有 k 个解决方案,那么对于那个 x,我们将下降到 O (N / k)。

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        相关资源
        最近更新 更多