O(n log n)vs O(n) - 时间复杂度的实际差异

bra*_*orm 42 algorithm big-o time-complexity

n log n > n- 但这就像是一段pseudo-linear感情.如果n=1 billion,log n~30;

所以,n log n30 billion30 X n,顺序n.我想知道这个时间复杂度之间n log n and n的差异在现实生活中是否显着.

例如:quick select在未排序数组中查找第k个元素是O(n)使用快速选择算法.

如果我对数组进行排序并找到第k个元素,那就是O(n log n).要排序一个数组1 trillion的元素,我会很60 times慢,如果我做quicksortindex it.

das*_*ght 57

Big-O表示法的主要目的是让你像在帖子中那样进行估算,并自己决定是否花费你的精力来编写一个通常更高级的算法,这是值得你要去的额外CPU周期购买代码改进.根据具体情况,即使数据集相对较小,您也可能得到不同的答案:

  • 如果您在移动设备上运行,并且算法占执行时间的很大一部分,那么减少CPU的使用会转化为延长电池寿命
  • 如果您在一个全有或全无竞争的环境中运行,例如高频交易系统,微优化可以区分赚钱和亏钱
  • 当您的分析显示所讨论的算法支配服务器环境中的执行时间时,切换到更快的算法可能会提高所有客户端的性能.

Big-O符号隐藏的另一件事是常数乘法因子.例如,Quick Select具有非常合理的乘数,使得在极大数据集上使用它所节省的时间非常值得实现它.

您需要记住的另一件事是空间复杂性.通常,具有O(N*Log N) 时间复杂度的算法会具有O(Log N)空间复杂性.这可能对极大数据集造成问题,例如当递归函数在具有有限堆栈容量的系统上运行时.


Dar*_*der 30

这取决于.

我在亚马逊工作,有一种方法,就是在列表上进行线性搜索.我们可以使用Hashtable并在O(1)中查找与O(n)相比.

我建议改变,但未获批准.因为输入很小,所以它并没有真正产生巨大的差异.

但是,如果输入很大,那么它会产生影响.

在另一家公司,数据/输入很大,使用Tree,与List相比产生了巨大的差异.所以它取决于应用程序的数据和体系结构.

了解您的选择以及如何进行优化总是很好的.


Duk*_*ing 11

有时您会使用数十亿个元素(以及更多),这些差异肯定会很大.

还有一些时候,你将使用不到一千个元素,在这种情况下,差异可能不会那么重要.

如果您对数据的外观有一个不错的认识,那么您应该从一开始就选择哪一个,但是O(n)和O(n log n)之间的差异足够小以至于它可能是最好的.从最简单的一个开始,对它进行基准测试,只有在你看到它太慢的情况下才尝试改进它.

但是,请注意,对于任何给定的n值,O(n)实际上可能比O(n log n)慢(特别是,但不一定,对于n的小值),因为涉及的常数因素,因为大O忽略那些(它只考虑当n趋于无穷大时会发生什么),所以,如果你纯粹看时间的复杂性,你认为可能是一个改进可能实际上减慢了事情.