查找乘法数组的最快方法(按最少操作数计算)
Fastest Method for Find Multiplication Array ( by Minimum Number of Operations)
一道面试题:
我有一个数组:例如这个:
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)$ 加法。
是这种最简单的方法还是有其他内存和时间最少的方法?
首先创建[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描述的。
建议不除法如下:
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]
一道面试题:
我有一个数组:例如这个:
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)$ 加法。
是这种最简单的方法还是有其他内存和时间最少的方法?
首先创建[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描述的。
建议不除法如下:
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]