举个简单的例子,假设我们要检查 char c
是否是字母数字:
if (48 <= c && c <= 57 ||
65 <= c && c <= 90 ||
97 <= c && c <= 122)
{
// ...
}
6 个操作来确认它是。
但是,不存在连续函数 f(c) 使得字母数字字节值的 f(c) > 0 和 < 0 其余的?我认为至少有一个 :一个 12 次多项式,“适合”12 个点,在 x 轴上下交织;但也许也存在更小阶数的函数,甚至是非多项式。这样的公式会将操作“简化”为:
if (f(c) > 0)
{
// ...
}
这有专门的术语吗?(想到了“折叠”这个词,但它没有产生任何相关的搜索结果——只有 Haskell 的折叠概念。)似乎只要我们能够将一组操作的陪域映射到粒度足够细的陪域,我们就可以获得这样的“折叠”。那么,我的问题是:“折叠”可以节省时间吗?或者是否存在某种守恒原理,迫使计算“折叠”的成本与(甚至超过)计算“折叠”的成本相匹配原始的“原始”操作。
最佳答案
多项式与 x 轴相交 6 次,即它有 6 个实根,所以 6 次多项式就足够了。
f(c) = -(c-48)*(c-57)*(c-65)*(c-90)*(c-97)*(c-122)
这当然会浪费时间,做 5 个乘法比做 5 个逻辑运算要慢得多。此外,&&
和 ||
经常短路,因此您不需要全部执行。
关于c - 将多个(离散的)操作折叠成一个(连续的)操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469526/