最大成对产品快速解决方案

时间:2017-11-18 11:56:35

标签: python python-3.x random stress-testing

我正在尝试对python最大成对产品,快速和慢速算法应用压力测试。但是,快速代码似乎在某些测试中返回错误的结果。我认为问题来自快速算法中的if条件。在某些情况下不会发生这种情况,但应该适用。我无法弄清楚问题。任何帮助?

这是问题,I / P,O / P细节:

  
    

给定一系列非负整数a0,...,an-1,找到最大成对乘积,即可以通过将两个不同元素与序列相乘得到的最大整数(或者,更正式地说,max0 ≤i≠j≤n-1aiaj)。这里的不同元素是指ai和aj,其中i≠j(可能是ai = aj的情况)。

  
     

输入格式

     
    

输入的第一行包含整数n。下一行包含n个非负整数a0,...,an-1(用空格分隔)。

  
     

约束:

     
    

2≤n≤2⋅105; 0≤a0,...,AN-1≤105。

  
     

输出格式:

     
    

输出单个数字 - 最大成对产品。

  
from random import randint
from random import randrange


def max_pairwise(n,a):
  #  n = int(input())
    res = 0
 #   a = [int(x) for x in input().split()]
    assert(len(a) == n)

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

    return(res)


def max_pairwise_fast(n,a):
 #   n = int(input())
 #   a = [int(x) for x in input().split()]

    max_index1 = -1
    max_index2 = -1

    for i in range(0,n):
        if a[i] > a[max_index1]:
            max_index1 = i
        else:
            continue

    for j in range(0,n):
        if ((a[j] != a[max_index1]) and (a[j] > a[max_index2])):
            max_index2 = j
        else:
            continue

    res = a[max_index1]* a[max_index2]
    return(res)


#stress_test
while(1):
    n = randint(0,9) +2
    print(n,"n")
    a = []
    for i in range (n):
        a.append(randrange(9000))
    for i in range(n):
        print(a[i],'a[i]',"/n")
    if (max_pairwise(n,a) == max_pairwise_fast(n,a)):
        print(max_pairwise(n,a), max_pairwise_fast(n,a),"true")
    else:
        print(max_pairwise(n,a), max_pairwise_fast(n,a), "false")
        break

这是结果的一个例子:

6 n
318 a[i] /n
7554 a[i] /n
7531 a[i] /n
7362 a[i] /n
4783 a[i] /n
4897 a[i] /n
56889174 56889174 true
5 n
6879 a[i] /n
6985 a[i] /n
8561 a[i] /n
5605 a[i] /n
3077 a[i] /n
59798585 59798585 true
9 n
8285 a[i] /n
3471 a[i] /n
2280 a[i] /n
2443 a[i] /n
5437 a[i] /n
2605 a[i] /n
1254 a[i] /n
6990 a[i] /n
2943 a[i] /n
57912150 68641225 false

4 个答案:

答案 0 :(得分:0)

在您的快速实施中,当您找到最大数字时,您还必须将第二大数字更新为前一个最大数字的值,否则,有些情况下您最终会将数字乘以不是最大的两个。

def product_of_two_largest(seq):
    largest = float("-inf")
    second_largest = float("-inf")

    for elt in seq:
        if elt > largest:
            second_largest = largest
            largest = elt
        elif elt > second_largest:
            second_largest = elt
    return second_largest * largest

注1:

您的while循环也必须更新,您计算的值是两次而不是一次。

while(1):
    n = randint(0,9) +2
    print(n,"n")
    a = []
    for i in range (n):
        a.append(randrange(9000))
    for i in range(n):
        print(a[i],'a[i]',"/n")

    slow, fast = max_pairwise(n, a), two_largest_product(a)

    if (slow == fast):
        print(slow, fast, slow == fast)
    else:                                 # attention, this never happens now.
        break

注2:

如果您只是对序列进行排序并将最后两个数字相乘(尽管排序为O(nlogn),而O(n)为上述快速实现,您可能会有更快的实现。< / p>

b = sorted(a)
print("max1 x max2 = ", b[-1] * b[-2])

注3:

使用heap数据结构(from collections import heap)是查找n个最大项目的理论最佳方式,但您可能需要100,000's个项目才能使其值得你的时间。

答案 1 :(得分:0)

def max_pairwise_fast(n, a):
    max_index1 = 0
    max_index2 = 0
    for i in range(n):
        if a[i] > max_index1:
            max_index2 = max_index1
            max_index1 = a[I]
        elif a[i] > max_index2:
            max_index2 = a[I]
    return max_index1 * max_index2

if __name__ == '__main__':
    input_n = int(input())
    input_numbers = [int(x) for x in input().split()]
    print(max_pairwise_fast(input_n, input_numbers))

答案 2 :(得分:0)

这可能对您没有帮助。
我在Coursera(作业)尝试这个问题,发现我们不需要使解决方案更加复杂。我们可以简单地存储前两个最大的整数,同时从用户进行扫描并打印他们的产品。 TLE错误的主要原因是复杂的解决方案。 c

中的代码
#include<stdio.h>
int main() {
    long long n, a = 0, b = 0, i = 0, numb = 1;
    scanf("%lld", &n);
    for (i = 0; i < n; i++){
        scanf("%lld", &numb);
        if(numb >= a){
            b = a;
            a = numb;
        }
        else if(numb > b)
            b = numb;
    }
    printf("%lld", a * b);
    return 0;
}

答案 3 :(得分:-1)

def max_pairwise_fast(n, a):
    max_index1 = 0
    max_index2 = 0
    for i in range(n):
        if a[i] > max_index1:
            max_index2 = max_index1
            max_index1 = a[i]
        elif a[i] > max_index2:
            max_index2 = a[i]
    return max_index1 * max_index2

if __name__ == '__main__':
    input_n = int(input())
    input_numbers = [int(x) for x in input().split()]
    print(max_pairwise_fast(input_n, input_numbers))