Python 2使用二进制搜索的求和问题-正确解的条件

Python 2使用二进制搜索的求和问题-正确解的条件,python,algorithm,Python,Algorithm,我通过对输入数组排序并使用二进制搜索,在不到二次方的时间内解决了2和问题。代码被移植到Python,因为Python是我最熟悉的语言 我对密码有点怀疑。关于“如果这指向我们,那么只有当元素的另一个副本存在时,这一对才存在。向前看,向后看。”的评论听起来很有权威性,但我不明白为什么I和恭维_idx不同是不够的。(该问题要求两个总和是不同的。) 请澄清一下?另外,解决方案是否正确 def binary_search(lst, target): low = 0 high = len(l

我通过对输入数组排序并使用二进制搜索,在不到二次方的时间内解决了2和问题。代码被移植到Python,因为Python是我最熟悉的语言

我对密码有点怀疑。关于“如果这指向我们,那么只有当元素的另一个副本存在时,这一对才存在。向前看,向后看。”的评论听起来很有权威性,但我不明白为什么
I
恭维_idx
不同是不够的。(该问题要求两个总和是不同的。)

请澄清一下?另外,解决方案是否正确

def binary_search(lst, target):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] == target:
            return mid
        elif lst[mid] > target:
            high = mid - 1
        else:
            low = mid + 1
    return None


def two_sum_binary_search(arr, total):
    length = len(arr)
    arr = sorted(arr)
    for i in range(length):
        compliment = total - arr[i]
        compliment_idx = binary_search(arr, compliment)
        if compliment_idx is not None:  # Found solution!
            """ 
            If this points at us, then the pair exists only if
            there is another copy of the element. Look ahead of
            us and behind us.
            """
            # Why is it not sufficient that i and compliment_idx are different?
            if compliment_idx != i or (i > 0 and arr[i - 1] == arr[i]) or (i < length - 1 and arr[i + 1] == arr[i]):
                return (i, compliment_idx)
    return None


assert two_sum_binary_search([1, 2, 3], 4) == (0, 2)
assert two_sum_binary_search([1234, 5678, 9012], 14690) == (1, 2)
assert two_sum_binary_search([2, 2, 3], 4) == (0, 1)

def二进制搜索(lst,目标):
低=0
高=透镜(lst)-1
虽然目标较低:
高=中-1
其他:
低=中+1
一无所获
def二元和二元搜索(arr,总计):
长度=长度(arr)
arr=已排序(arr)
对于范围内的i(长度):
恭维=总计-arr[i]
恭维idx=二进制搜索(arr,恭维)
如果恭维不是无:#找到解决方案!
""" 
如果这指向我们,那么这一对只有在
元素还有另一个副本。请向前看
我们和身后。
"""
#为什么我和恭维的idx不同还不够?
如果你赞美我i或(i>0和arr[i-1]==arr[i])或(i
嗯,这就足够了。这是因为
compaid\u idx
compaid
的一个确定性函数(实际上应该是s/compaid/complement/g)。如果我们处于多个副本的情况下,
complaid\u idx
的值对于每个副本都是相同的,因此另一个副本将满足
complaid\u idx!=我
。假设如果搜索不是确定性的,我们需要由给定代码实现额外的搜索。

Hmm,在这里就足够了。这是因为
compaid\u idx
compaid
的一个确定性函数(实际上应该是s/compaid/complement/g)。如果我们处于多个副本的情况下,
complaid\u idx
的值对于每个副本都是相同的,因此另一个副本将满足
complaid\u idx!=我
。假设如果搜索不是确定性的,我们将需要由给定代码实现的附加搜索。

此函数返回
(0,0)
用于
打印(二元搜索([2,2,4])
。那是正确的输出吗?不,那是错误的输出。额外的检查似乎破坏了算法。此函数为
打印返回
(0,0)
(二元搜索([2,2,4])
。那是正确的输出吗?不,那是错误的输出。额外的检查似乎破坏了算法。我不确定你关于非确定性搜索的确切意思,但主要的一点是额外的检查似乎不需要。事实上,正如@1490;㪞דבקן所指出的,他们让代码为
打印(两个求和二进制搜索([2,2,4])
给出了错误的
(0,0)
,所以他们必须走!奇怪的是,代码中的注释看起来如此自信……我不确定您对非确定性搜索的确切含义,但主要的一点是,似乎不需要额外的检查。事实上,正如@1490;㪞דבקן所指出的,他们让代码为
打印(两个求和二进制搜索([2,2,4])
给出了错误的
(0,0)
,所以他们必须走!奇怪的是代码中的注释看起来如此自信。。。