Big o O(logn)和O(nlogn)之间的差异

Big o O(logn)和O(nlogn)之间的差异,big-o,Big O,我正在为软件开发面试做准备,在区分O(logn)和O(nLogn)之间的区别时,我总是面临着一个问题。有谁能给我举一些例子或者和我分享一些资源吗。我没有任何代码可以显示。我理解O(Logn),但我不理解O(nlogn)。将其视为O(n*log(n)),即“做log(n)工作n次”。例如,在长度n的排序列表中搜索元素是O(log(n))。在n不同的排序列表中搜索元素,每个长度n都是O(n*log(n)) 记住,O(n)是相对于某个实数n定义的。这可能是列表的大小,也可能是集合中不同元素的数量。因此

我正在为软件开发面试做准备,在区分O(logn)和O(nLogn)之间的区别时,我总是面临着一个问题。有谁能给我举一些例子或者和我分享一些资源吗。我没有任何代码可以显示。我理解O(Logn),但我不理解O(nlogn)。

将其视为
O(n*log(n))
,即“做
log(n)
工作
n
次”。例如,在长度
n
的排序列表中搜索元素是
O(log(n))
。在
n
不同的排序列表中搜索元素,每个长度
n
都是
O(n*log(n))

记住,
O(n)
是相对于某个实数n定义的。这可能是列表的大小,也可能是集合中不同元素的数量。因此,出现在
O(…)
中的每个变量都表示一些交互作用以增加运行时间的内容
O(n*m)
可以写成
O(n_1+n_2+…+n_m)
,表示同样的事情:“做
n
m
次”

让我们举一个具体的例子,
mergesort
。对于
n
输入元素:在排序的最后一次迭代中,我们有两部分输入,每一半大小
n/2
,每一半都被排序。我们所要做的就是将它们合并在一起,这需要
n
操作。在上一次迭代的下一次迭代中,我们有两倍数量的块(4),每个块的大小
n/4
。对于大小为
n/4
的两对中的每一对,我们将该对合并在一起,这将对一对执行
n/2
操作(一对中的每个元素一个,就像前面一样),即对两对执行
n
操作


从这里,我们可以推断mergesort的每一级都需要
n
操作来合并。因此,big-O复杂性是级别数的
n
倍。在最后一级,我们正在合并的块的大小是
n/2
。在此之前,它是
n/4
,在此之前是
n/8
,等等。一直到大小
1
。您必须将
n
除以2多少次才能得到
1
<代码>日志(n)。所以我们有
log(n)
级别。因此,我们的总运行时间是
O(n(每个级别的工作)*log(n)(级别数))
n
work
log(n)
次。

这与O(1)和O(n)之间的差异或O(n)和O(n^2)之间的差异相同。检查一下,您仍然需要进行大量研究。O(..)描述了算法的复杂性。简单地说,您可以想象完成n个输入的算法所需的时间,如果O(n)将在n秒内完成,O(logn)将在logn秒内完成,而O(nlogn)将在n*logn秒内完成。O(1)表示无论n有多大,算法的成本都是恒定的。谢谢你的回答。我有一个后续问题要问你。你们能证明合并排序的时间复杂度是O(nLogn)吗?在解释推理时,请不要使用主定理。请分享任何你认为有用的资源。不客气。我可以做一个直接的证明,但它并不真正属于这个问题,谷歌上还有一百万个其他证明。相反,我将在我的问题中添加mergesort作为一个示例,我认为这将向您展示如何证明其运行时。是的。。我认为没有必要。我的一些基本知识掌握得很好。我将在这里工作。。非常感谢你帮助我。