enum class COLOR
{
Blue,
Red,
Green,
Purple,
First=Blue,
Last=Purple
};
COLOR operator++( COLOR& x ) { return x = (COLOR)(((int)(x) + 1)); }
COLOR operator*(COLOR c) {return c;}
COLOR begin(COLOR r) {return COLOR::First;}
// end iterator needs to return one past the end!
COLOR end(COLOR r) {return COLOR(int(COLOR::Last) + 1);}
int main()
{
for (const auto& color : COLOR()) std::cout << int(color); //0123
return 0;
}
我从SO link获取了这段代码。
我被问到类似代码的时间复杂性。根据我的理解,它是O(n)
,因为所有枚举元素都在迭代
但在某些平台上的正确答案说O(1)
没有任何解释
有人可以证实,是O(1)
还为什么?
答案 0 :(得分:3)
当您预先形成渐近复杂度分析时,定义输入大小的内容始终很重要。因为这就是复杂性的定义。只有这样,分析才有意义。
例如,如果将此算法定义为没有输入,那么我们可以认为枚举数是固定的并且是Last - First
。因此,循环体将执行固定的次数,并且对于它是O(1)。
我只能猜测“某个平台”部分可能指的是编译器优化的能力。当编译器看到一个将完全执行4次的循环时,它可能会选择展开它,而不是为实际循环发出代码。
话虽如此,优化并不会真正影响算法的渐近复杂性。它们最多可能影响隐藏在大哦符号背后的系数。根据我们上面的分析,循环是O(1),但是在展开优化之后系数较小,因为与循环相关的代码可能已经消失。