我正在准备进行软件开发面试,但我一直面临着区分O(logn)和O(nLogn)之间差异的问题。任何人都可以通过一些示例向我解释或与我分享一些资源。我没有任何代码可显示。我了解O(Logn),但我不了解O(nlogn)。
答案 0 :(得分:3)
将其视为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
个操作。在倒数第二次迭代中,大小为n/4
的片段(4)的数量是其两倍。对于两对大小为n/4
的对中的每对,我们将其合并在一起,这需要对n/2
进行一对操作(对中的每个元素一个,就像之前一样),即{{1} }两对的操作。
从这里,我们可以推断出我们的mergesort的每个级别都需要进行n
合并操作。因此,big O复杂度是n
乘以级别数。在最后一级,我们要合并的块的大小为n
。在此之前,它是n/2
,在n/4
之前,依此类推。您必须将n/8
除以2多少次才能得到1
? n
。因此,我们有1
个级别。因此,我们的总运行时间是log(n)
,log(n)
个工作O(n (work per level) * log(n) (number of levels))
次。