给定数字X,在两个排序的数组中找到两个元素,例如A [i] + B [j] = X在O(n + m)中

时间:2012-06-27 14:29:37

标签: arrays algorithm sorting big-o

鉴于以下问题,我很感激任何更正,因为我没有解决方案 对于当前的问题(取自我教授的一个考试!!!):

备注:这不是功课!

问题:

给定两个排序的数组A(长度为n)& B(长度为m),其中每个

元素(在两个数组中)是一个实数,一个数字X(也是一个实数),

我们想知道是否存在a ∈ Ab ∈ B,例如:

a + b = XO(n+m)运行时间。

解决方案:

首先,我们从两个数组的末尾开始检查,因为我们不需要大于X的数字:

  • i = n
  • k = m

  • 而A [i]> X,i = i -1

  • 而B [k]> X,k = k -1

定义j = 0。 现在开始从i中的当前Aj中的B开始运行:

  • while i > 0 , j < k
  • if A[i]+B[j] == X,然后返回两个单元格
  • else j = j+1 , i = i -1

最后我们要么有两个元素,要么我们在一个元素中超出范围 或两个数组,这意味着确实不存在两个元素a + b = X

任何评论都会非常感激

谢谢

3 个答案:

答案 0 :(得分:12)

您不应同时调整ij。如果总和太大,则应减少i。如果它太小,请增加j

答案 1 :(得分:4)

此问题是以下问题的特例: Find number in sorted matrix (Rows n Columns) in O(log n)

考虑填充C[i,j] = A[i] + B[j]的矩阵,然后从其中一个角开始,如果总和太大则减少i,如果它太小,则增加j。 当然,您不必在程序中创建和/或填充此矩阵C,只需假设您知道此矩阵的任何元素:它是A[i] + B[j],您可以随时立即计算它。生成的算法为O(m+n)

答案 2 :(得分:1)

我对作业也有同样的问题。 我在上网之前检查了一下。 这是我的解决方案(Python),希望一些大个子能看到并帮助我改进它

# 1.3. Given two sorted arrays a and b and number S. Find two elements such that sum a[i] + b[j] = S.Time O(n).

def find_elem_sum(alist,blist,S):#O(n)

if alist is None or alist == [] or blist is None or blist == []:
    return None

# find the numbers which are less than S in the lists
#
#
# pretend it is done

a_length = len(alist)
b_length = len(blist)
a_index, b_index = 0, 0
count = 0
while alist and a_index < a_length and b_index < b_length:
    count += 1
    if alist[a_index] + blist[b_index] < S:
        if a_index < a_length - 1:
            a_index += 1
        if a_index == a_length - 1:
            b_index += 1;
        continue
    elif alist[a_index] + blist[b_index] > S:
        alist = alist[:a_index]
        a_length = len(alist)
        a_index = a_length - 1
    elif alist[a_index] + blist[b_index] == S:
        return [a_index, b_index, count]

return None