bra*_*orm 42 algorithm big-o time-complexity
n log n > n- 但这就像是一段pseudo-linear感情.如果n=1 billion,log n~30;
所以,n log n将30 billion是30 X n,顺序n.我想知道这个时间复杂度之间n log n and n的差异在现实生活中是否显着.
例如:quick select在未排序数组中查找第k个元素是O(n)使用快速选择算法.
如果我对数组进行排序并找到第k个元素,那就是O(n log n).要排序一个数组1 trillion的元素,我会很60 times慢,如果我做quicksort和index it.
das*_*ght 57
Big-O表示法的主要目的是让你像在帖子中那样进行估算,并自己决定是否花费你的精力来编写一个通常更高级的算法,这是值得你要去的额外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趋于无穷大时会发生什么),所以,如果你纯粹看时间的复杂性,你认为可能是一个改进可能实际上减慢了事情.