【问题标题】:Time complexity of binary search tree get_size method which i edited我编辑的二叉搜索树get_size方法的时间复杂度
【发布时间】:2021-10-21 11:23:32
【问题描述】:

我正在努力寻找我在二叉搜索树中创建的 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 和双递归它是否会影响运行时间如果它会为什么如果它不为什么会运行时间

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)`

【问题讨论】:

  • 如果不访问每个节点,就不可能找到任意 BST 的大小。但是,您可以添加一个字段self.size = 0,并在添加节点时将其递增,在删除节点时将其递减。那么get_size是O(1),return self.size

标签: recursion time-complexity binary-tree big-o binary-search-tree


【解决方案1】:

要确定复杂性,有助于将您的功能分解并分别分析不同的部分。

从基本情况开始,您的复杂度为 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 的左右孩子都是叶子,那么这 2 次对 get_size() 的调用将不再递归,导致两个 O(1) 操作。但是,如果任何一个节点都有子节点,那么我们将对get_size() 进行额外的调用,使get_size() 大于O(1)。如果左边的孩子有孩子,但那些孩子是叶子,那么我们将再次调用get_size() 两次,每次都是 O(1) 调用。

如果我们对函数中每个可能的 if/else 语句重复此分析,我们将看到对于每个存在的子节点,我们将为它调用一次且仅一次的 get_size()。因此,我们的整体复杂度为 O(n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多