组合增加到零

时间:2012-07-19 14:20:40

标签: python algorithm complexity-theory

给出五个排序列表:List1,List2,List3,List4,List5,每个长度为n。如果任何5(int)数字(每个列表1),总和为零返回true。我的目标是确保算法是O(n)。在我的脑海中,我可以想到用sum创建一个哈希映射 5个链表或评估5个列表,如[o(n * n * n * n * n)]。我期待着优化或降低复杂性的方法,而且我被卡住了。

我在Python中的代码:

def getIndicesFromFiveArrays(List1,List2,List3,List4,List5,t):
    a,b,c,d,e=0,0,0,0,0
    while(List1[a]+List2[b]+List3[c]+List4[d]+List5[e]!=t):
        b=b+1
        if b==len(List2):
            return (-1,-1)
        if List1[a]+List2[b]+List3[c]+List4[d]+List5[e]<t:
            a=a+1
            b=b-1
        c=c-1
        d=d-1
        e=e-1
            if a==len(List1):
                return (-1,-1)
    return (a,b,c,d,e)

编辑1:顺便说一下,这不是功课,你可以查看我的其他问题并自己验证。感谢..

2 个答案:

答案 0 :(得分:2)

有一个O(n ^ 3)解决方案,受到MRAB评论的启发。

首先,将列表1中的每个值与列表2中的每个值组合并将其存储在一个集合中。调用结果集1和2,它有n ^ 2个值。

接下来,将集合1和2与列表3组合。调用结果集1and2and3,它具有n ^ 3个值,并且需要n ^ 3个步骤来构造。

接下来,组合列表4和5.调用结果集4和5,它具有n ^ 2个值。

最后,检查集合4和5中的任何值是否等于集合1and2and3中的值的倒数。这一步需要n ^ 2步。

这种方法使用O(n ^ 3)空间和O(n ^ 3)时间。

正如Karoly Horvath指出的那样,你实际上并不需要存储集合1和2和3,你可以在最后一步中从集合1和2中动态构建它。此方法仅使用O(n ^ 2)空间,但仍需要O(n ^ 3)时间。这是代码:

l1 = [1,2,3,4,5,10]
l2 = [1,2,3,4,5,11]
l3 = [1,2,3,4,5,12]
l4 = [1,2,3,4,5,13]
l5 = [1,2,3,4,5,-46]

def test():
    l1_2 = [a + b for a in l1 for b in l2]
    set4_5 = set([a + b for a in l4 for b in l5])
    return any([True for x in l1_2 for y in l3 if -(x + y) in set4_5])

print test()

答案 1 :(得分:0)

如果有2个列表,则从列表1中取一个数字,然后在列表2中查找该数字的负数。如果用一个集替换了列表2,则总体复杂度为O(n)。 / p>

如果有3个列表,您将从列表1中获取一个数字,然后从列表2中获取一个数字,复杂度为O(n ^ 2)。如果用集合替换列表3,则总体复杂度将为O(n ^ 2)。

所以我认为5个列表/集合的整体复杂性不能低于O(n ^ 4)。