我编辑的二叉搜索树 get_size 方法的时间复杂度
Time complexity of binary search tree get_size method which i edited
我正在努力寻找我在二叉搜索树中创建的 get_size 方法的时间复杂度,因为存在多个 conditions.Here 的多重递归是代码
`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)
我创建了节点 class 来存储数据,然后我创建了 BST 函数,它确实有效,但问题是每个函数的时间复杂度应该是函数中的 log n,但我使用了 if elif else 和双递归它是否同时影响 运行 时间 如果它影响 为什么如果它不影响为什么
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
的左右children都是叶子,那么对get_size()
的这2次调用将不会再递归,导致两个O (1)操作。但是,如果任一节点有 children,那么我们将对 get_size()
进行额外调用,使 get_size()
大于 O(1)。如果左边的 child 有 children,但那些 children 是叶子,那么我们将再次调用 get_size()
两次,每次都是 O(1) 调用。
如果我们对函数中每个可能的 if/else 语句重复此分析,我们将看到对于每个存在的 child,我们将只为它调用一次 get_size()
一次。因此,我们的整体复杂度是O(n)。
我正在努力寻找我在二叉搜索树中创建的 get_size 方法的时间复杂度,因为存在多个 conditions.Here 的多重递归是代码
`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)
我创建了节点 class 来存储数据,然后我创建了 BST 函数,它确实有效,但问题是每个函数的时间复杂度应该是函数中的 log n,但我使用了 if elif else 和双递归它是否同时影响 运行 时间 如果它影响 为什么如果它不影响为什么
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
的左右children都是叶子,那么对get_size()
的这2次调用将不会再递归,导致两个O (1)操作。但是,如果任一节点有 children,那么我们将对 get_size()
进行额外调用,使 get_size()
大于 O(1)。如果左边的 child 有 children,但那些 children 是叶子,那么我们将再次调用 get_size()
两次,每次都是 O(1) 调用。
如果我们对函数中每个可能的 if/else 语句重复此分析,我们将看到对于每个存在的 child,我们将只为它调用一次 get_size()
一次。因此,我们的整体复杂度是O(n)。