python-3.x - 这里的空间复杂度 O(m+n) 如何?
问题描述
合并两个排序的链表并将其作为新列表返回。应该通过将前两个列表的节点拼接在一起来制作新列表。
class Solution:
def mergeTwoLists(self, l1, l2):
if l1 is None:
return l2
elif l2 is None:
return l1
elif l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
我知道这与堆栈有关。有人可以为我说清楚吗?我是新手,谢谢。
解决方案
该算法的基本原理是每个递归调用都从l1
或中选择一个元素l2
。由于这种情况只会发生M + N
多次,因此时间复杂度将是O(M + N)
.
空间复杂度是另一回事。
我知道这与堆栈有关。
是的。在 Python 中,递归调用需要每个递归级别的堆栈帧。堆栈帧保存调用参数和局部变量,以及允许调用返回到调用它的代码中正确位置所需的信息。
在您的示例中,存在M + N
级别,因此堆栈空间的空间复杂度为O(M + N)
.
假设您的链表节点以明显的方式实现,您的合并方法正在改变l1
andl2
对象,并且不会消耗更多空间。
许多语言/编译器在递归调用自身的许多情况下支持称为尾调用优化的东西。如果可能,递归调用被优化为跳转到方法的开头,而不是使用调用指令。因此不需要堆栈帧。
在您的示例中,堆栈使用的空间复杂度为 O(1)
.
但是 Python不支持这个;请参阅Python 是否优化尾递归?
推荐阅读
- java - 不使用 localhost 时 Java NIO Selector 不起作用
- docker - Docker container outbound IP mapping
- javascript - MongoDB 根据 json 输入更新嵌套对象
- jenkins-pipeline - What is the best practice of writing jenkins pipeline for multiple module maven project
- php - 具有缩短、搜索和分页功能的数据表中的 WordPress 用户
- oracle - ORA-06564: object does not exist Errors - ORDS
- azure - 如何将用户权限限制为 Azure 门户中的单个服务(数据块)?
- azure-devops - 有没有办法在粘贴到 VSTS/Azure DevOps 工作项中的图像周围本地添加边框?
- flutter - How to play a list of videos stored in your assets folder referenced as an array using video player plugin
- wordpress - Send 2 different size of images to FB OG tags