我正在尝试对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
答案 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
您的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
如果您只是对序列进行排序并将最后两个数字相乘(尽管排序为O(nlogn)
,而O(n)
为上述快速实现,您可能会有更快的实现。< / p>
b = sorted(a)
print("max1 x max2 = ", b[-1] * b[-2])
使用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))