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

Algorithm 这个算法能在O(n)时间内运行吗?,algorithm,performance,recursion,time-complexity,Algorithm,Performance,Recursion,Time Complexity,我正在写一个算法来计算排序数组和给定整数的和中是否有一对整数。我希望算法在O(n)中运行,其中n是子数组中的整数数 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)

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

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
输入是子数组和整数的边界,用于测试其和。输出将是布尔值

这是我的算法。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
您可以使用两个指针

  • 从索引0开始一个,从索引n-1开始第二个
  • 如果总和小于所需总和,则检查总和增加前指针并检查
  • 如果小于,则减小返回指针并检查
  • 终止条件是指针相互交叉
阿尔戈

期望值;
总和=0;
int p1,p2;
Darray[n];
p1=0;
p2=n-1;

对于(;p1著名的双指针算法(Delphi)的递归版本。线性复杂度

function FindSum(const A: array of Integer; Sum, l, r: Integer): Boolean;
var
  s: Integer;
begin
  if l >= r then
    Result := False
  else  begin
    s := A[l] + A[r];
    if s = Sum then
      Result := True
    else if s > Sum then
      Result := FindSum(A, Sum, l, r - 1)
    else
      Result := FindSum(A, Sum, l + 1, r)
  end;
end;

如果参数是常量,
k
j
作为参数传递有什么意义?@YeldarKurmangaliyev我不知道。讲师希望该方法是这样实现的。还有一种方法将k作为参数并调用kPairSumminterval。我认为这不重要。列表排序了吗?第一个和应该是吗d
sum=A[i]+A[j]
@AChampion是的,很抱歉我更正了它,是的,列表被排序了。不,它没有什么不同。如果你理解了算法背后的数学思想,那么你应该可以递归或迭代地表达它。这个算法看起来是O(n)对我来说,考虑一个源,它包含从代码< 2代码>代码> >代码> n>代码>中的所有偶数,以及一个期望的总和:<代码> n+1 。在发现所需的和不存在之前,你结束测试<代码> N-1/代码>求和。是的,你是正确的,我没有应用优化来检测是否存在和,但是这个ALGO有上界。o(n)
function FindSum(const A: array of Integer; Sum, l, r: Integer): Boolean;
var
  s: Integer;
begin
  if l >= r then
    Result := False
  else  begin
    s := A[l] + A[r];
    if s = Sum then
      Result := True
    else if s > Sum then
      Result := FindSum(A, Sum, l, r - 1)
    else
      Result := FindSum(A, Sum, l + 1, r)
  end;
end;