Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2求和算法实现的正确性_Python_Algorithm_Python 2.7 - Fatal编程技术网

Python 2求和算法实现的正确性

Python 2求和算法实现的正确性,python,algorithm,python-2.7,Python,Algorithm,Python 2.7,传统的二和问题(我下面的参考实现)是,对于排序数组,查找和值等于给定目标值的所有数字对。传统的实现从数组的两端进行扫描,如果当前和小于目标值,则增加低索引指针;如果当前和大于目标值,则减少高索引指针 我的问题是,有没有证据证明这个算法的正确性,证明它没有遗漏一对 顺便说一句,如果我的代码有问题,请随时指出 def twoSum(numbers, skipIndex, targetValue): i = 0 j = len(numbers) - 1 result = []

传统的二和问题(我下面的参考实现)是,对于排序数组,查找和值等于给定目标值的所有数字对。传统的实现从数组的两端进行扫描,如果当前和小于目标值,则增加低索引指针;如果当前和大于目标值,则减少高索引指针

我的问题是,有没有证据证明这个算法的正确性,证明它没有遗漏一对

顺便说一句,如果我的代码有问题,请随时指出

def twoSum(numbers, skipIndex, targetValue):
    i = 0
    j = len(numbers) - 1
    result = []
    while i < j:
        if i in skipIndex:
            i+=1
        if j in skipIndex:
            j+=1
        if numbers[i] + numbers[j] == targetValue:
            result.append((numbers[i], numbers[j]))
            i += 1
            j -= 1
        elif numbers[i] + numbers[j] > targetValue:
            j -= 1
        else:
            i += 1

    return result

if __name__ == "__main__":
    numbers = [1,2,4,5,6,7,9,10]
    print twoSum(numbers, [1], 11) # output, [(1, 10), (4, 7), (5, 6)]
    print twoSum(numbers, [], 11) # output, [(1, 10), (2, 9), (4, 7), (5, 6)]
def twoSum(数字、skipIndex、targetValue):
i=0
j=len(数字)-1
结果=[]
而i目标值:
j-=1
其他:
i+=1
返回结果
如果名称=“\uuuuu main\uuuuuuuu”:
数字=[1,2,4,5,6,7,9,10]
打印两个和(数字[1],11)#输出[(1,10)、(4,7)、(5,6)]
打印两个总和(数字,[],11)#输出,[(1,10)、(2,9)、(4,7)、(5,6)]

让我们简化问题,找到第一个这样的对,而不是所有对(将其扩展到所有加起来等于
targetValue的对很简单)

无论何时增加左指针
i
,都会将相应的元素从进一步考虑中剔除,因为当与数组中的任何其他元素一起添加时,总和仍然太小。所以它是无法使用的。下面是一个类似的参数,用于递减右指针
j
,调整为总和太大而不是太小

查看它的另一种方法是,如果修改指针与修改(排序)列表是相同的,因为它实际上与删除最小和最大元素相同。


最后,如果指针交叉,这与列表变得太小是一样的(可能是重复的是,撤回了我的投票。虽然我仍然认为这是一个问题,因为我不认为它属于math.stackexchange,我确实认为它属于这里。)这是不是一个有效的问题,但没有向我们展示OP在构造证据方面做了什么是另一回事。我上学已经很久了,所以让我说你需要首先证明算法停在正确的位置-应该很容易证明在
(5,6)
之后找到的任何值都只是已经找到的值的换位。其次,你需要证明算法没有跳过任何值对-这种证明通常采取“假设存在一个
j
,使得
i
+
j
是匹配项。”。。“然后显示它将包含在算法中。这可能有助于首先证明算法按排序顺序查找值对。如果我们跳过
skipIndex
,并假设我们已证明算法按排序顺序查找值对,那么(前提)让我们假设存在一个值
(a,b)
,使用
a