【发布时间】:2014-10-16 11:10:37
【问题描述】:
以下伪 C++ 代码:
vector v;
... filling vector here and doing stuff ...
assert(is_sorted(v));
auto x = std::find(v, elementToSearchFor);
find 具有线性运行时间,因为它是在一个可以未排序的向量上调用的。但是在该特定程序的那一行,我们知道:程序不正确(如:如果断言失败,它不会运行到最后)或要搜索的向量已排序,因此允许二进制搜索@987654323 @ 与 O(log n)。将其优化为二进制搜索应该由一个好的编译器完成。
这只是迄今为止我发现的最简单的最坏情况行为(更复杂的断言可能允许更多优化)。
有些编译器会这样做吗?如果是,是哪些?如果没有,他们为什么不呢?
附录:一些高级语言可能很容易做到这一点(尤其是在 FP 的情况下),所以这更多是关于 C/C++/Java/类似语言
【问题讨论】:
-
没有
v.find(),所以不清楚你在问什么。 -
你的代码假设它会在那个时候被排序,那么为什么不只做一个二进制搜索呢?有很多库可以做到这一点,为什么要依赖编译器?
-
没有编译器会用
std::binary_search替换对std::find的调用。首先是因为它不能直接互换(返回迭代器与返回布尔值),其次是因为它只能在编译时存在知识的情况下才能完成,而且这种情况很少见。在这种情况下,期望用户使用正确的功能。 -
@Nephtys 我很确定什么时候(不是如果,而是什么时候)编译器变得如此聪明以至于他们可以像这样进行代码分析,那么就没有工作了。
-
这个例子太复杂了。也许从
assert(x>3); if(x>0)...开始,这很简单,有希望。
标签: java c++ optimization compiler-construction