这在技术上是O(n)算法吗?

时间:2015-05-27 22:37:13

标签: c++ c algorithm time-complexity

根据我对算法的理解,以下技术上是线性解决方案。

dev

事实上,我可以添加尽可能多的垃圾,只要操作次数相对于int max ( int * arr, size_t n ) { for (int k = 0; k < 100000000000000000000000000000; ++k) std::cout << rand(); // doesn't do anything useful int largest = *arr; for (int * offend = arr + n; arr != offend; ++arr) if (*arr > largest) largest = *arr; return largest; } 线性增长,就考虑了a&#34;更好&#34;根据现代采访者的算法。这是对的吗?

2 个答案:

答案 0 :(得分:5)

是的,它绝对会被认为是O(n)。第一行是一个常数(非常大,但仍然是恒定的)成本,所以它根本不会影响渐近复杂度。

也就是说,根据一位不知道他们在谈论什么的采访者,该算法只会被认为比一个更理智的O(n log n)算法更普遍“更好”。任何关于算法复杂性的实际讨论,特别是在比较多个选项时,绝对应该包括渐近复杂度,还包括所涉及的常数(乘法 - 2n与1000000n - 以及加法 - n与n + 100000000),以及它将在下面运行(例如:假设您通过算法运行googol项目:现在您的算法可能是更好的选择。)

如果我在接受采访时被问到这个问题,那就是我想说的,而且很有可能是面试官想要听到的内容。

答案 1 :(得分:5)

不,不是O(n)。

如果您的编译器没有超过96位的扩展积分类型,它将被拒绝为格式错误。如果它确实编译(128位整数类型并非闻所未闻),情况可能更糟......

由于有符号整数变量k的溢出,行为和复杂性都是未定义的。在许多理智的编译器中,这段代码永远不会终止,这使得它比具有O(n n !)复杂度的算法更糟糕......实际上,它也比{{{ {3}}

如果你在面试中看到这段代码,那么它自然会引发对正确性与绩效优劣的讨论。