【问题标题】:Avgerage Time Complexity of a sorting algorithm排序算法的平均时间复杂度
【发布时间】:2011-02-09 00:44:45
【问题描述】:
我有一个 treesort 函数,它执行两个不同的任务,每个任务都有自己的时间复杂度。我算出了平均数。两个任务的时间复杂度,但是我如何找到算法的整体复杂度。
例如,该算法采用“n”个键 x 的随机列表:
Sort(x):
Insert(x):
#Time complexity of O(nLog(n))
Traverse(x):
#Time complexity of O(n)
我只是将这两个复杂性加在一起得到 O(n + nLog(n)) 还是我承担主导任务(在本例中为插入)并最终得到 O(nLog(n) 的整体复杂性)
【问题讨论】:
标签:
algorithm
performance
time-complexity
【解决方案1】:
在这样一个简单的情况下,
O((n) + (n log(n)) = O(n + n log(n))
= O(n (log(n) + 1))
= O(n log(n))
【解决方案2】:
或者我是否承担主导任务(在本例中为插入)并最终得到 O(nLog(n)) 的过度复杂性
这是正确的。随着n 的增长,O(n + nLog(n)) sum 中的第一个元素将变得越来越不重要。因此,对于足够大的n,它的贡献可以忽略。
【解决方案3】:
你需要占据主导地位。
以这种方式衡量复杂性的整个想法是基于您想知道大 ns 会发生什么的假设。
因此,如果您有多项式,则可以丢弃除最高阶元素之外的所有元素,如果您有对数,则可以忽略底数等等。
然而,在日常实践中,这些差异可能开始变得很重要,因此有时最好对算法的复杂性有一个更精确的了解,甚至可以精确到为不同操作分配不同权重的程度。
(回到您最初的问题,假设您使用以 2 为底的对数,n=1048576,n+n*logn 和 n*logn 之间的差异约为 5%,这可能并不值得担心。)