【问题标题】:Pythagorean Triples Efficiency毕达哥拉斯三倍效率
【发布时间】:2014-10-05 17:56:33
【问题描述】:

我需要创建一个函数,它接受整数列表并返回列表中是否存在毕达哥拉斯三元组。例如,[3, 5, 7, 4] 返回True,因为 3、4、5 是毕达哥拉斯三元组。到目前为止,我有这个(在 Python 中):

def containsPythagoreanTriple(a): 
    for i in xrange(len(a)): #square the numbers
        num = a[i]
        a[i] = num**2
    a = sorted(a)
    for start in xrange(len(a)): #compare every pair
        for i in xrange(start+1, len(a)):
            if a[start] + a[i] in a:
                return True
    return False

有没有办法让这更有效?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    就性能而言,该代码有一些可以改进的地方。

    当前实现是O(N**3)(其中Nlen(a)),当您检查平方列表是否包含每对项目的每个总和时。 list 中的成员资格测试是 O(N) 并且有 O(N**2) 对要测试。

    您可以通过使用set 而不是列表来保存您的项目来改进这一点。在set 中测试项目成员资格是O(1),因此您将通过这种方式获得O(N**2) 算法。

    还有一些进一步的变化可能会加快速度,但它们都不会进一步改变渐近复杂度。首先,您无需致电sorted,因为无论如何您都要测试每一对项目。您还可以使用集合推导进行平方,而不是覆盖原始的 a 列表。最后,您可以使用itertools.combinations 来生成您的正方形对,并在生成器表达式上使用any 来测试它们的总和是否在集合中。

    下面是使用相同算法的一些更优化的代码:

    import itertools
    
    def containsPythagoreanTriple(a):
        squares = {x*x for x in a} # set comprehension
        return any(x+y in squares for x,y in itertools.combinations(squares))
    

    通过以更基本的方式更改算法,可能仍有进一步优化的空间。例如,您不需要测试每一对,因为某些值永远不会是三角形的“短边”(例如,最大值)。您可以过滤传递给itertools.combinations 的方格,以便它们仅包含小于或等于max(squares)-min(squares) 的方格。我不确定这是否值得,除非您的值列表变得非常大。

    【讨论】:

      【解决方案2】:

      相同,但略有不同

      import math    
      def tripple(array): 
          array = sorted(array)
          for start in xrange(len(array)): #compare every pair
            m = array[start]
            for i in xrange(start+1, len(array)):
              n = array[i]
              if math.sqrt(n*n+m*m) in array:
                print m, n, math.sqrt(n*n+m*m)
      
      array=[4, 6, 2, 3, 7, 5, 9, 8, 10, 12, 15, 40, 41];     
      tripple(array);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多