整数多项式插值(或快速选择情况)

时间:2012-10-02 07:34:02

标签: math mathematical-optimization

允许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

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您不知道如何计算插值多项式,我建议您开始阅读有关 Polynomial Interpolation的维基百科页面。

请注意,由于数值问题(例如拉格朗日版本中的划分),并非所有计算方法都适合实际应用。我相信你能够找到提供此功能的图书馆。请注意,构造也需要一些时间,因此只有在频繁调用函数时才会发生这种情况。

请注意,整数函数值和整数支持点并不意味着多项式的整数系数!因此,在一般情况下,您将需要O(n)浮点运算,最后需要向最接近的整数舍入。它可能取决于您的输入,插值方法是可靠的,并且比使用开关的方法更快。

此外,我想提出一个不同的解决方案,假设n相当大。为什么不把你的条目(你的例子中的对(10,3),(37,1),(96,0),(104,1))放在serchtree中(例如在C ++中的std :: map或者在C#)?因此,您的查询成本将从线性减少到O(log n)!