允许x
设置{10, 37, 96, 104}
。
让f(x)
“选择案例”功能:
int f1(int x) {
switch(x) {
case 10: return 3;
case 37: return 1;
case 96: return 0;
case 104: return 1;
}
assert(...);
}
然后,我们可以避免条件跳转将f(x)
写为“整数多项式”,如
int f2(int x) {
// P(x) = (x - 70)^2 / 1000
int q = x - 70;
return (q * q) >> 10;
}
在某些情况下(仍包括mul
次操作)f2
优于f1
(例如,大型条件评估)。
是否有方法可以从P(x)
注射中找到switch
?
非常感谢!
答案 0 :(得分:0)
如果您不知道如何计算插值多项式,我建议您开始阅读有关 Polynomial Interpolation的维基百科页面。
请注意,由于数值问题(例如拉格朗日版本中的划分),并非所有计算方法都适合实际应用。我相信你能够找到提供此功能的图书馆。请注意,构造也需要一些时间,因此只有在频繁调用函数时才会发生这种情况。
请注意,整数函数值和整数支持点并不意味着多项式的整数系数!因此,在一般情况下,您将需要O(n)浮点运算,最后需要向最接近的整数舍入。它可能取决于您的输入,插值方法是可靠的,并且比使用开关的方法更快。
此外,我想提出一个不同的解决方案,假设n相当大。为什么不把你的条目(你的例子中的对(10,3),(37,1),(96,0),(104,1))放在serchtree中(例如在C ++中的std :: map或者在C#)?因此,您的查询成本将从线性减少到O(log n)!