我正在为面试练习解决问题,而我似乎无法找出以下问题的时间和空间复杂性的答案:
给定两个已排序的链接列表,按排序顺序将它们合并到第三个列表中。我们假设我们使用降序排序。
我遇到的答案之一,显然不是最有效的答案,是以下递归解决方案:
Node mergeLists(Node head1, Node head2) {
if (head1 == null) {
return head2;
} else if (head2 == null) {
return head1;
}
Node newHead = null;
if(head1.data < head2.data) {
newHead = head1;
newHead.next = mergeLists(head1.next, head2);
} else {
newHead = head2;
newHead.next = mergeLists(head1, head2.next);
}
return newHead;
}
现在,当我分析这个功能的复杂性时,我遇到了一个问题。我不确定它是O(M + N)
还是O(M) + O(N)
。我只是无法得到一个直观的答案。对我来说,这个函数的运行时和空间复杂度是O(N) + O(M)
或O(max(N,M))
似乎是合乎逻辑的,因为较大的值会驱动渐近曲线(或递归调用和堆栈帧创建)。
总结一下:
在大写符号中, O(N+M)
和O(N) + O(M)
之间有什么区别?有没有?如果它们不同,我会很感激,如果有人可以提供两者的简单例子。
答案 0 :(得分:8)
O(N) + O(M)
表示某些cN + dM
和c
由d
限定的函数。
O(N + M)
表示e(N + M)
为某些e
限定的函数。
它们是等价的,因为:
某些cN + dM <= (c + d)(N + M)
和c
d
。
和
某些e(N + M) <= eN + eM
e
。