有人可以解释这个if语句是如何工作的吗?

时间:2015-11-19 07:14:31

标签: python algorithm

有人可以解释if语句是如何工作的或以下代码中代码的含义吗?

我有两个列表,A和B,我需要查看是否存在一对元素,一个来自A,另一个来自B,这样交换它们会使两个列表的总和相等。

我的方法,O(n ^ 2)是找到sumOfBhalfdiff = (sumOfA - sumOfB)/2。 找到(A[j] - B[i]) = halfdiff 对于A中的每个元素,请查看是否存在B [i]以便1 def fast_solution(A, B, m): 2 n = len(A) 3 sum_a = sum(A) 4 sum_b = sum(B) 5 d = sum_b - sum_a 6 if d % 2 == 1: 7 return False 8 d //= 2 9 count = counting(A, m) 10 for i in xrange(n): 11 if 0 <= B[i] - d and B[i] - d <= m and count[B[i] - d] > 0: 12 return True 13 return False

但是下面的代码在O(n + m)中完成。我不明白&#34;的意思,如果&#34;声明(第11行)。是否保证如果确实如此,我们有所需的配对?

forgotPwd route configured but showForgotPasswordLink set to false

2 个答案:

答案 0 :(得分:1)

您必须找到ijsum(A) - a[i] + b[j] = sum(B) - b[j] + a[i]或等同于sum(A) - 2*a[i] = sum(B) - 2*b[j]

您可以通过计算右侧的所有可能结果,然后搜索可能的i值来完成此操作。

def exists_swap(A, B):
    sumA = sum(A)
    sumB = sum(B)
    bVals = set(sumB - 2 * bj for bj in B)
    return any(sumA - 2 * ai in bVals for ai in A)

你问题中的部分代码做了类似的事情,除了d = (sum(B)-sum(A))/2countitertools.Counter(A)(也就是说,它是映射任何{{1}的字典}到它在x中出现的次数。然后,A相当于count[B[i] - d] > 0jB[i] - d = A[j]

可能不是使用集合或词组,而是B[i] - A[j] = (sum(B) - sum(A))/2值是mA中允许的最大值。然后B可以像这样定义:

counting

这是一种表示一组整数的简单但效率低下的方法,但它解释了问题中缺少的部分并解释了检查def counting(xs, m): r = [0] * (m+1) for x in xs: r[x] += 1 return r 的边界,如果你使用set或dict,这是不必要的,但是如果0 <= B[i] - d and B[i] - d <= m返回数组,则必需。

答案 1 :(得分:0)

实际上,它不是O(n+m)。由于hashmap count的使用,线性估计只是摊销。这些知识可以帮助您了解您的代码是

的混淆版本
bool solve(A,B) {
    sum_a = sum(A)
    sum_b = sum(B)
    sort(B)
    for(val in A)
        if( binary_search(B, val - (sum_b - sum_a)/2 ) )
            return true
    return false
}

正如保罗所指出的那样,0 <= B[i] - d and B[i] - d <= m只是对count论证的验证。顺便说一句,他的解决方案纯粹是线性的,实施得很好,而且理解起来要简单得多。