根据我对算法的理解,以下技术上是线性解决方案。
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;根据现代采访者的算法。这是对的吗?
答案 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}}
如果你在面试中看到这段代码,那么它自然会引发对正确性与绩效优劣的讨论。