【发布时间】:2013-05-10 06:13:04
【问题描述】:
举个简单的例子,假设我们要检查 char c 是否是字母数字:
if (48 <= c && c <= 57 ||
65 <= c && c <= 90 ||
97 <= c && c <= 122)
{
// ...
}
6 个操作来确认它是。
但是,不存在连续函数 f(c) 使得 f(c) > 0 对于字母数字字节值,并且 剩下的?我认为有至少有一个:12 次多项式,“适合”12 个点,在 x 轴上下摆动;但也许也存在一个更小次数的函数,甚至是非多项式。这样的公式将“简化”以下操作:
if (f(c) > 0)
{
// ...
}
这有什么艺术术语吗?(想到了“折叠”这个词,但它不会产生任何相关的搜索结果——只有 Haskell 的折叠概念。)似乎只要我们能够将一组操作的codomain映射到一个粒度足够细的codomain,就可以得到这样的“折叠”。那么,我的问题是:“折叠”可以节省时间吗?或者是否有一些守恒原则迫使计算“折叠”的成本匹配(甚至超过)计算原始的“粗略”操作。
【问题讨论】:
-
这似乎是一个有趣的理论问题,但与上面的代码(应该非常快)或使用查找表之类的替代方案相比,你确定一个多项式甚至会更快?
-
@templatetypedef - 不,当然,在上面的例子中,查找表会快得多;但我从一个简单的案例开始,扩展到一个更一般的案例,即 codomain 中可能有无限(但可数)点(因此在查找表中不可枚举)。
-
这是错误。出于内部文档的目的,您应该使用诸如
'0'、'9'、'A'、'Z'、'a'和'z'之类的字符常量。您是否希望我们阅读您的代码?那里发生了六个以上的操作。通过从左到右计算运算符,从左到右计算它们:<=&&<=||<=<=<=<=||<=@98765343338@9876534@9. C 不保证将使用 ASCII。相反,可以使用 EBCDIC,在这种情况下,此代码将失败!不要过早地优化,或者这样的代码!只需使用isupper、islower和isdigit。 -
@undefinedbehaviour - 具有讽刺意味的是,我担心你过早地优化了你的 cmets ;-) 我很欣赏、尊重并完全同意你所说的话,但我实际上并不是在问字母数字的问题,C (我之所以这样标记它是因为我的示例是用 C 语言编写的)、缓存、编译器优化或分析。我的示例旨在阐明我遇到的一个理论问题。也许我不够清楚。
-
我仍然认为这些 cmets 对您的代码提出了一些好处,以及一些相关点:如果编译器生成代码以 fold 您的示例代码,那么这回答了您的一个问题。
标签: c math optimization discrete-mathematics