枚举器的时间复杂度

时间:2017-08-21 10:40:43

标签: c++ c++11 time-complexity enumerate

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)还为什么?

1 个答案:

答案 0 :(得分:3)

当您预先形成渐近复杂度分析时,定义输入大小的内容始终很重要。因为这就是复杂性的定义。只有这样,分析才有意义。

例如,如果将此算法定义为没有输入,那么我们可以认为枚举数是固定的并且是Last - First。因此,循环体将执行固定的次数,并且对于它是O(1)。

我只能猜测“某个平台”部分可能指的是编译器优化的能力。当编译器看到一个将完全执行4次的循环时,它可能会选择展开它,而不是为实际循环发出代码。

话虽如此,优化并不会真正影响算法的渐近复杂性。它们最多可能影响隐藏在大哦符号背后的系数。根据我们上面的分析,循环是O(1),但是在展开优化之后系数较小,因为与循环相关的代码可能已经消失。