我正在尝试比较两种算法,计算数组中两个最大元素的乘法。我决定为此实现这样的算法 - 遍历数组的每个元素 - 找到最高的元素,记住它的索引,然后对其余的元素重复相同的操作。
import random
m = 2
n = random.randint(0+m,10+m)
b = [random.randint(0,12) for _ in range(n)]
def MaxPairwiseProductFast(a):
for i in range(0,n):
max_index1 = -1
if (max_index1 == -1) or (a[i] > a[max_index1]):
max_index1 = i
for j in range(0,n):
max_index2 = -1
if (a[j] != a[max_index1]) and ((max_index2 == -1) or (a[j] > a[max_index2])):
max_index2 = j
resutl = a[max_index1]*a[max_index2]
print(resutl)
MaxPairwiseProductFast(b)
此函数将最高元素自身倍增。我无法弄清楚为什么会这样。
答案 0 :(得分:3)
如何将代码缩减为
import random
m = 2
n = random.randint(0 + m, 10 + m)
b = [random.randint(0, 12) for _ in range(n)]
if len(b) >= 2:
b.sort(reverse=True)
n1 = b[0]
n2 = b[1]
result = n1 * n2
print('List: {0}'.format(b))
print('Result: {0}'.format(result))
它会发出(在我的机器上,在执行时但可能会有所不同):
List: [11, 7, 7, 6, 6, 6, 5, 4, 4, 2, 0]
Result: 77
正如你所看到的,列表中有两个最高的数字是11,7,所以他们的产品是77。
答案 1 :(得分:2)
你有两个问题,其中一个是微妙的。首先,您必须将max_index1和max_index2的初始值设定项移出循环,否则它们在循环的每一步中都设置为-1,而不是保留到目前为止找到的最大元素的值。
在第二个循环中,您要忽略max_index1元素本身,而不是所有在数值上等于[max_index1]的元素。所以你需要修改if语句的第一个术语。 (例如,如果您的列表' b'是[9,9,8],则会得到错误的答案。)
import random
m = 2
n = random.randint(0 + m, 10 + m)
b = [random.randint(0, 12) for _ in range(n)]
print(b)
def MaxPairwiseProductFast(a):
max_index1 = -1
for i in range(0,n):
if (max_index1 == -1) or (a[i] > a[max_index1]):
max_index1 = i
max_index2 = -1
for j in range(0,n):
if (j != max_index1) and ((max_index2 == -1) or (a[j] > a[max_index2])):
max_index2 = j
resutl = a[max_index1]*a[max_index2]
print(resutl)
MaxPairwiseProductFast(b)
真正优雅的Pythonic解决方案是导入标准模块heapq,然后在列表创建之后替换所有代码' b'一行:
print(sum(heapq.nlargest(2,b))
但这可能不是最好的学习经历。
答案 2 :(得分:0)
如果您使用列表,则可以使用list方法'max(list)'来查找列表的最高值。下面的代码怎么样?按照你的逻辑修改
list1 = [1,2,3,4]
list2 = [5,7,3,9]
a, b = max(list1), max(list2)
result = a * b
上面的代码只是一个例子。希望它有所帮助。