查找乘法数组的最快方法(按最小操作数)

时间:2019-08-25 14:00:35

标签: python algorithm time-complexity multiplication space-complexity

面试问题:

我有一个数组:例如这个数组:

a,b,c,d,e,f,g!=0

List_1=[a,b,c,d,e,f,g]

我想找到一种最少运算符的最优方法来找到此结果:

Multiplication=[a+bcdefg,ab+cdefg,abc+defg,abcd+efg,abcde+fg,abcdef+g]

我建议使用这种方法:

mult=a*b*c*d*e*f*g
Multiplication=[]
Temp=List_1[0]
while(i<(len(List_1))-1):
    mult/=List_1[i]
    Multiplication.append(Temp+mult)
    Temp*=List_1[i+1]

此行mult=a*b*c*d*e*f*g采用$ n-1 $乘法,while循环采用$(n-1)$乘法,$(n-1)$除法和$(n-1)$加成。因此,总时间约为$ 3n-3 $乘以$(n-1)$加。

这是最简单的方法还是其他方法具有最小的内存和时间?

2 个答案:

答案 0 :(得分:3)

首先创建[a, ab, abc, …]

l = [a, b, c, d, e, f, g]
result = []
p = 1

for i in range(0, len(l) - 1):
    p *= l[i]
    result.append(p)

然后将[…, efg, fg, g]添加到其中:

p = 1

for i in range(len(l) - 1, 0, -1):
    p *= l[i]
    result[i - 1] += p

这需要2(n-1)个乘法和n-1个列表元素加法,这比2(n-1)个乘法,2(n-1)个除法和n-1个加法好。

这也是Primusa的描述。

答案 1 :(得分:1)

建议不加区分地进行追踪,这要慢得多:

myList=[1,2,3,4,5,6,7,8]
arrLen = len(myList)
leftOp = [1] * arrLen
rightOp = [1] * arrLen
result =  [1] * (arrLen - 1)
leftOp[0] = myList[0]
rightOp[arrLen - 1] = myList[arrLen - 1]
for i in range(1, arrLen - 1):
    leftOp[i] = myList[i] * leftOp[i-1]
    rightOp[arrLen - 1 - i] = myList[arrLen - 1 - i] * rightOp[arrLen - i]

for i in range(0, arrLen - 1):
    result[i] = leftOp[i] + rightOp[i + 1]