当谈到复杂性时,像O(3n)这样的东西往往被简化为O(n)等等。这仅仅是理论上的,那么复杂性如何在现实中发挥作用? O(3n)也可以简化为O(n)吗?
例如,如果任务暗示解决方案必须是O(n)复杂度,并且在我们的代码中,我们有2次线性搜索数组,即O(n)+ O(n)。那么,实际上,这种解决方案会被视为线性复杂性还是不够快?
请注意,这个问题是关于真实的实现,而不是理论上的。我已经知道O(n)+ O(n)被简化为O(n)?
答案 0 :(得分:3)
请记住,O(f(n))并没有给你带来的实际时间量:只有n增长的增长率。 O(n)仅表示如果n加倍,则运行时也会加倍,这会将函数混合在一起,每次迭代需要一秒或每次迭代需要一千年。
由于这个原因,O(n)+ O(n)和O(2n)都等于O(n),它是线性复杂度函数的集合,它应该是足以满足您的目的。
虽然采用任意大小输入的算法通常需要O(f(n))表示的最优函数,但增长更快的算法(例如O(n²))可能在实践中仍然更快,特别是当数据集大小n在实践中受限或固定时。但是,学习推理O(f(n))表示可以帮助您编写算法,使其具有可预测的最佳用例 - 上限。
答案 1 :(得分:2)
是的,只要k
是常量,就可以写 O(kn)= O(n)。
背后的直觉是常数k 不会随着输入空间的大小而增加,并且在某些时候对于 n 来说将是无比小的,所以它不会对整体复杂性影响很大。
答案 2 :(得分:0)
是 - 只要数组搜索的数量 k 不受输入大小的影响,即使对于实际上太大而无法输入的输入, O(kn)=为O(n)。 O 符号的主要思想是强调计算时间如何随着输入的大小而增加,因此无论输入多大都不相同的常数因子保持不变。兴趣。
不正确的应用方法的一个示例是,您可以在线性时间内执行选择排序,因为您只能在内存中容纳大约10亿个数字,因此选择排序只是一个十亿次数组搜索。但是,对于具有无限内存的理想计算机,您的算法将无法处理超过十亿个数字,因此它不是正确的排序算法(算法必须能够处理任意大的输入,除非您将限制指定为问题陈述的一部分);它只是一个用于排序多达十亿个数字的正确算法。
(事实上,一旦你对输入大小设置了限制,大多数算法将变成恒定时间,因为对于你的限制内的所有输入,算法将使用最多所需的时间量来解决它对于最大/最困难的输入。)