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++ - 解析文本文件而不存储(tftp)

c++ - 编译时出错 : control may reach end of non-void function

javascript - 计算地理位置的距离

c++ - 计算以恒定加速度对齐两个 3D vector 所需的扭矩?

go - 工作池的最佳大小

python - 这个算法优化了吗?不然还能怎么用呢?

c++ - Windows Embedded Compact 7 的 QueryPerformanceCounter() 测试

c - 如何在LINUX(Ubuntu)上用C实现TCP SO_KEEPALIVE

java - 开关、if-else 和数学

c++ - 优化 vector<string> 中不必要的字符串复制