Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 如何使用一个函数来检查一对元素相加后是否等于另一个整数,并使其在线性时间内运行?_Python_Algorithm_Python 3.x_Time Complexity - Fatal编程技术网

Python 如何使用一个函数来检查一对元素相加后是否等于另一个整数,并使其在线性时间内运行?

Python 如何使用一个函数来检查一对元素相加后是否等于另一个整数,并使其在线性时间内运行?,python,algorithm,python-3.x,time-complexity,Python,Algorithm,Python 3.x,Time Complexity,因此,我必须用Python编写一个函数,它接受一个排序列表和一个整数,并检查列表中任何一对元素的总和是否等于整数。它还必须以线性时间(或O(n)时间)运行。我有完成任务的功能,但它以二次时间运行。以下是我的功能: def sum_to_int(l, k): Lst=sorted(l) for i in range(len(Lst)): for n in Lst[i:]: print(Lst[i]+n==k) def

因此,我必须用Python编写一个函数,它接受一个排序列表和一个整数,并检查列表中任何一对元素的总和是否等于整数。它还必须以线性时间(或O(n)时间)运行。我有完成任务的功能,但它以二次时间运行。以下是我的功能:

def sum_to_int(l, k):
    Lst=sorted(l)
    for i in range(len(Lst)):
            for n in Lst[i:]:
                    print(Lst[i]+n==k)

def main():
    l=[1, 2, 3, 4, 5, 6]
    k=10
    sum_to_int(l, k)

if __name__=="__main__":
    main()

我很确定,为了在线性时间内运行,我必须删除第二个for循环,但我不确定如何在没有第二个循环的情况下遍历列表。我是否可以简化此函数并使其在线性时间内运行?任何帮助都将不胜感激。谢谢你的阅读

我的代码可能并不完全是python,因为我对python不太精通。如果有人能提供一些简洁的代码来做同样的事情,请随意编辑:)。无论如何,基本思想如下:
对于列表中的任何一对值,如果它们的总和小于搜索的值,我们将为该对中较小的一个尝试下一个较大的值。如果它们的和大于搜索的值,我们将尝试下一个较小的值,以获得对中较大的一个。否则,我们找到匹配项,可以终止或尝试使用列表中的下一对。这在
O(n)
中运行

除非你对证据感兴趣,否则你可以相信它是有效的,而忽略下一部分

具体工作原理如下:
l
u
作为列表
ls
的较低/较高值的索引。现在让
l
被修复。然后(可能)存在指数
u1
u2
,例如
ls[l]+ls[u1]
ls[l]+ls[u2]>k
,其中
u1
最大,
u2
最小。在由
u1
u2
定义的窗口中,可能有另一个索引,我们将其称为
u'
,其中
u1
。如果存在
u'
,它必须保存与我们报告的
ls[l]+ls[u']=k匹配的值。否则,
l
将递增,我们继续搜索新的
l
。显然,
u'=u1
,我们已经到了无法找到新对的地步,因为我们已经耗尽了搜索空间,算法也终止了。

我的代码可能并不完全是pythonic的,因为我对python不太精通。如果有人能提供一些简洁的代码来做同样的事情,请随意编辑:)。无论如何,基本思想如下:
对于列表中的任何一对值,如果它们的总和小于搜索的值,我们将为该对中较小的一个尝试下一个较大的值。如果它们的和大于搜索的值,我们将尝试下一个较小的值,以获得对中较大的一个。否则,我们找到匹配项,可以终止或尝试使用列表中的下一对。这在
O(n)
中运行

除非你对证据感兴趣,否则你可以相信它是有效的,而忽略下一部分

具体工作原理如下:
l
u
作为列表
ls
的较低/较高值的索引。现在让
l
被修复。然后(可能)存在指数
u1
u2
,例如
ls[l]+ls[u1]
ls[l]+ls[u2]>k
,其中
u1
最大,
u2
最小。在由
u1
u2
定义的窗口中,可能有另一个索引,我们将其称为
u'
,其中
u1
。如果存在
u'
,它必须保存与我们报告的
ls[l]+ls[u']=k匹配的值。否则,
l
将递增,我们继续搜索新的
l
。显然,
u'=u1
,我们已经到了无法找到新配对的地步,因为我们已经耗尽了搜索空间,算法也终止了。

您可以很容易地通过一组:

def sum_to_int(sum_value, sorted_ints):
    s = set(sorted_ints)
    return any((sum_value - v) in s for v in s)

在两次使用数字时可能会出现问题,例如,
sum\u to_int(4[2])
将返回
True
,但您可以通过使用
集合中的
计数器来解决此问题。您可以使用一组计数器轻松完成此操作:

def sum_to_int(sum_value, sorted_ints):
    s = set(sorted_ints)
    return any((sum_value - v) in s for v in s)
两次使用数字可能会出现问题,例如,
sum\u to_int(4[2])
将返回
True
,但您可以通过使用
集合中的
计数器来解决此问题

def sum_to_int(sum_value, sorted_ints):
    s = set(sorted_ints)
    return any((sum_value - v) in s for v in s)