recursion - 我编辑的二叉搜索树get_size方法的时间复杂度
问题描述
我正在努力寻找我在二叉搜索树中创建的 get_size 方法的时间复杂度,因为存在多个条件的多次递归。这是代码
`class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.right = right
self.left = left
def __str__(self):
return str(self.data)
我为库存数据创建了节点类,然后我创建了 BST 函数,它确实有效,但问题是每个函数的时间复杂度都应该是函数中的 log n,但我使用 if elif else 和双递归是否会影响运行时间 if它为什么如果它不为什么
class BST:
def __init__(self):
self.root = None
def add(self, value, x=None):
new_node = Node(value)
if self.root is None:
self.root = new_node
return True
if x is None:
main_node = self.root
else:
main_node = x
if value > main_node.data:
if main_node.left is None:
main_node.left = new_node
return True
else:
return self.add(value, main_node.left)
elif value == main_node.data:
return False
elif value < main_node.data:
if main_node.right is None:
main_node.right = new_node
return True
else:
return self.add(value, main_node.right)
def get_size(self, x=None):
if self.root is None:
return 0
if x is None:
main_node = self.root
else:
main_node = x
if main_node.left is not None and main_node.right is not None:
return 1 + self.get_size(main_node.left) + self.get_size(main_node.right)
elif main_node.left is None and main_node.right is None:
return 1
else:
if main_node.left is not None:
return 1 + self.get_size(main_node.left)
else:
return 1 + self.get_size(main_node.right)`
解决方案
为了确定复杂性,它有助于将您的功能分开并分别分析不同的部分。
从基本情况开始,您的复杂性是 O(1)。
if self.root is None:
return 0
elif main_node.left is None and main_node.right is None:
return 1
但是,随着您开始递归,这些基本案例将加起来。让我们看一个递归调用:
if main_node.left is not None and main_node.right is not None:
return 1 + self.get_size(main_node.left) + self.get_size(main_node.right)
在最简单的树中,main_node
左孩子和右孩子都是叶子,那么这两个对的调用get_size()
将不再递归,导致两个 O(1) 操作。但是,如果任何一个节点都有子节点,那么我们将对 进行额外的调用get_size()
,从而使结果get_size()
大于 O(1)。如果左孩子有孩子,但那些孩子是叶子,那么我们将再调用get_size()
两次,每次都是 O(1) 调用。
如果我们对函数中每个可能的 if/else 语句重复此分析,我们将看到对于每个存在的子节点,我们将调用get_size()
它一次且仅一次。因此,我们的整体复杂度为 O(n)。
推荐阅读
- javascript - Discord.js的WebStorm错误类型注释
- windows-10 - RDP 问题!提示输入用户名和密码
- scala - 如何为同一项目中的多个 Spark 应用程序指定不同的 log4j.properties 文件
- bazel - Bazel:在 genrule 中引用输出目录中的文件
- python - 无法使用 xpath 使用 selenium 选择元素
- python - 无法通过 POST [Python] 发送登录凭据
- karate - 我们可以使用空手道加特林在同一个包中运行多个功能文件吗
- javascript - 为什么 Typescript 中的集合在 Firebase 中更新两次?
- angularjs - 离子 EPERM:不允许操作,复制文件
- regex - Powershell 在输出前修改 Select-Object 属性