给定n个函数yi(x)= a0 + a1x + a2x2 + a3x3和q个查询。对于每个查询,我们给出一个整数t,我们需要找出最小化yi(t)的yi。
supoose我们有一个列表,其中包含n个函数[[10,5,4,8],[2,0,5,0],[1,8]的a0,a1,a2和a3的值,0,2],[8,7,8,7],[7,0,8,1]]和t的不同值我们必须找到t值的最小函数。例如t = 1函数[2,0,5,0]将是最小的。我尝试了一种蛮力方法,但是对于n的大值和不同t的大值,脚本执行速度太慢。
lis= [[10, 5, 4, 8],[2, 0 ,5, 0],[1, 8, 0, 2],[8, 7, 8, 7],[7, 0, 8, 1]]
t=[1,3,5,7,9]
size=len(lis)
for j in t:
matrix=[]
for i in range(size):
matrix.append(lis[i][0] + j*((lis[i][1]) + j*((lis[i][2]) + (lis[i][3]*j))))
print(min(matrix))
输出:7 47 127 247 407
答案 0 :(得分:1)
我没有完整的答案,但也许有些想法可以加快速度。
尚不完全清楚大量的三次多项式来自何处,但如果它们不是完全随机的,则可能会减少该集合。
例如,如果我有一个函数f(x)= ax ^ 3 + bx ^ 2 + cx + d,另一个函数g(x)= ax ^ 3 + bx ^ 2 + cx +(d + e)因为g(x)= f(x)+ e,因此当e> 0时,g(x)可以从集合中消除,因此总是大于f(x)。
可以用二次项来完成类似的事情。如果你发现g(x)= f(x)+ ex ^ 2,则e> 0,g(x)可以被消除,因为二次项大于或等于零。
由于多项式数组的排序具有O(n log n)的复杂度,因此排序不会受到影响(我们处理O(nm)的复杂度,n =多项式数,m =数输入)。 扫描阵列的复杂度为O(n),也不会造成伤害。
在立方体前面具有大正系数的多项式将是大负输入的有希望的候选者,反之亦然。 只要多项式相似,这个想法就可以用来削减搜索。