希望加快这个最大的成对产品

时间:2016-05-23 01:50:07

标签: python algorithm performance max product

我对编程非常陌生,所以请放轻松我:)

如何让以下python代码输出更快 -

n = int(input())
a = [int(x) for x in input().split()]
assert(len(a) == n)

result = 0

for i in range(0, n):
    for j in range(i+1, n):
        if a[i]*a[j] > result:
            result = a[i]*a[j]

print(result)

有哪些选项可以最大限度地提高速度?

5 个答案:

答案 0 :(得分:2)

你要做的就是找到产品最大的两个不同元素。当两个数字最大时会发生这种情况。所以你基本上在阵列中找到了两个最大的数字。这可以在O(n)中完成。

如何做到这一点的一个例子。找到最大的数字和它的位置。保存,删除它并找到结果的最大值(这将是第二大)。现在将两者相乘。

答案 1 :(得分:0)

您正在尝试计算列表中不同整数的最大乘积。 每对计算产品的时间复杂度为O(N ^ 2)。

您可以通过对列表进行排序将其减少到O(N log(N))。

a = sorted(a)
ans = max(a[0] * a[1], a[-2] * a[-1])

您可以进一步将其改进为线性时间,但我会让您弄明白。

答案 2 :(得分:0)

我看到,Stepik.org课程和#34;最大成对产品":

尝试以下操作,而不是级联的for循环:

n1 = max(a)
a.remove(n1)
result = n1*max(a)

基本上保存变量中的最大值,将其从序列中删除,并将其与序列的当前最大值(原始序列中的第二大值)相乘。

答案 3 :(得分:0)

我的解决方案将使用sorted和set,因为此算法也适用于重复项目。

    x, y = sorted(set(nums))[-2:]
    print(x * y)

答案 4 :(得分:0)

我想出了这个O(n)解决方案:

def maxPairwise(l):
   if len(l) == 2:
       return l[0]*l[1]
   elif len(l) == 1:
       return l[0]
   else:
       max1 = 0
       max2 = 0
       for i in l:
           if i > max1:
               max1 = i
           if i > max2 and i != max1:
               max2 = i
       return max1 * max2