algorithm - 这个算法能在 O(n) 时间内运行吗?

标签 algorithm performance recursion time-complexity

我正在编写一个算法来确定排序数组中是否有一对整数总和为给定整数。我希望算法在 O(n) 中运行,其中 n 是子数组中整数的数量。

输入是子数组和整数的边界,用于测试总和。输出将是一个 bool 值。

这是我的算法。 k是给定的整数,i和j是子数组的边界。

kPairSumInterval(int k, int i, int j)
         if(i == (j-1))
              sum = A[i] + A[j]
              if(sum == k)
                 found = true;

         kPairSumInterval(k,i+1,j)
         for j down to i
              sum = A[i] + A[j]
              if(sum == k)
                  found = true

        return found

while 循环会影响运行时间还是我们只关注递归的堆栈帧数?如果该算法无法在 O(n) 时间内运行,我将不胜感激一些使其在 O(n) 内运行的建议。

最佳答案

对于排序列表来说足够简单的算法。
假设所有正整数,将索引设置为列表的末尾,将索引设置为列表的开头,并根据总和减少结束索引或增加起始索引。
Python 伪代码:

def kPairSumInterval(k, i, j):
    x, y = i, j-1
    while x < y and A[x] + A[y] != k:
        if A[x] + A[y] > k:
            y -= 1
        else:
            x += 1
    return x < y

仅出于演示目的递归地使用相同的算法,使用 bool 运算,即 True==1False==0:

def kPairSumInterval(k, i, j):
    if i >= j-1:
        return False
    result = A[i] + A[j-1]
    if result == k:
        return True
    return kPairSumInterval(k, i+(result < k), j-(result > k))

关于algorithm - 这个算法能在 O(n) 时间内运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33383409/

相关文章:

algorithm - 如何在动态规划算法中进行转换?

java - 预算行程的递归算法

recursion - 递归函数完成后取消引用原子

Java 和 .NET : Why different sorting algorithms are used by default?

algorithm - 所有可能的井字游戏获胜组合

python - 移动列表的最后一个元素

Python 请求与 PyCurl 性能

c# - 如何使用一些多边形裁剪算法找到多边形的总面积和质心?

javascript - 如何提高 rails 中 coffeescript 的执行速度?

mysql - 在控制台上运行相同的查询需要两次时间?