将多个(离散)操作折叠为一个(连续)操作

And*_*ong 3 c math optimization discrete-mathematics

举个简单的例子,假设我们正在检查a是否char c是字母数字:

if (48 <= c && c <= 57 ||
    65 <= c && c <= 90 ||
    97 <= c && c <= 122)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

确认它 6个操作.

但是,是否存在连续函数f(c),使得字母数字字节值的f(c)> 0,其余的<0?我认为至少一个:12度的多项式,认为"适合" 12分,编织上下x轴; 但也许存在较小程度的函数,甚至非多项式.这样的公式将"简化"操作:

if (f(c) > 0)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这是艺术术语吗?(想到"折叠"这个词,但它不会产生任何相关的搜索结果 - 只有Haskell的折叠概念.)似乎只要我们可以将一组操作的codomain映射到一个足够精细的codomain.粒度,我们可以获得这样的"折叠".那么我的问题是:可以"折叠"节省时间吗?或者是否有一些保护原则迫使计算"折叠"的成本与计算原始"原油"操作的成本相匹配(甚至超过).

ken*_*ytm 6

多项式与x轴相交6次,即它具有6个实根,因此6次多项式就足够了.

f(c) = -(c-48)*(c-57)*(c-65)*(c-90)*(c-97)*(c-122)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这当然会浪费时间,做5次乘法比5次逻辑运算慢得多.此外,&&并且||经常短路,您不需要完成所有这些操作.

  • 这实际上是一个精彩而开明的答案.它以一种我从未想过的方式解决了一个问题 - 这种方式可能会在未来为我提供类似问题的更好解决方案.上面答案的形式也很优雅 - 显示它的确切运作方式.我印象非常深刻. (2认同)