c - 将多个(离散的)操作折叠成一个(连续的)操作

标签 c math optimization discrete-mathematics

举个简单的例子,假设我们要检查 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)

enter image description here

这当然会浪费时间,做 5 个乘法比做 5 个逻辑运算要慢得多。此外,&&|| 经常短路,因此您不需要全部执行。

关于c - 将多个(离散的)操作折叠成一个(连续的)操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469526/

相关文章:

c - 为什么#define 和 typedef 操作数是倒置的?

matlab - 符号计算实现

javascript - 调整容器的大小后,两个灰色的正方形应该尽可能地受对 Angular 线的限制而增长。

mysql - MySQL 中多列索引中的列顺序

c - 引用使用argv []传递的全局变量

c - 为什么可以将字符串分配给 C 中的字符指针,但不能将整数值分配给整数指针

c - 将字符数组的指针发送到 C 中的函数

c - 反平方定律方程

c++ - 如何使用 vector 类向量化C++代码

javascript - CSS和Javascript优化(速度问题)