2016-03-28 113 views
0

我试图比较两种算法,计算数组中两个最大元素的乘积。我决定实现这样的算法 - 遍历数组的每个元素 - 找到最高的一个,记住它是索引,然后对其余元素重复相同的操作。Python上数组中两个最大元素的乘积

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

(max_index2 == -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) 

真正优雅,Python化的解决方案是导入标准模块heapq,然后替换所有的代码创建列表“B”与单行如下:

print(sum(heapq.nlargest(2,b)) 

但这可能不是最好的学习体验。

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.

0

如果您使用的是列表,那么您可以使用列表方法'max(list)'来查找列表的最高值。下面的代码如何?根据你的逻辑修改

list1 = [1,2,3,4] 
list2 = [5,7,3,9] 

a, b = max(list1), max(list2) 
result = a * b 

上面的代码只是一个例子。希望能帮助到你。

+0

这将第一个列表中的最大元素乘以第二个列表中的最大元素,这比将单个列表中的两个最大元素相乘更容易。 –