English 中文(简体)
另一树复合分析子树
原标题:Subtree of Another Tree Complexity Analysis

关于Leetcode, 问题#572促使用户检查某一树(由于其根基)是否是另一个树的子(根基)。 下面是解决这一问题的:

class Solution:
    def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
        def isSameTree(p, q):
            if not p and not q:
                return True
            if not p or not q or p.val != q.val:
                return False
            
            return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
        
        def recurse(root, subRoot):
            if not root:
                return False
            elif isSameTree(root, subRoot):
                return True
        
            return recurse(root.right, subRoot) or recurse(root.left, subRoot)
        
        return recurse(root, subRoot)

实际上,将要求每 no树中每个 no子都使用<代码>。 在一次电话中,将称为iSameTree() ,试图从目前的节点开始“超级树林”。 如果能够成功地与子树的所有组成部分匹配,那么iSameTree(>将返回True<>。 否则,它将退回<代码>False

虽然执行工作是一种特制部队,但我讨论时间和空间复杂性的时间越来越长。 为了分析的目的,让我们说,在节点中潜在的母树的大小由<代码>标明。 N,而分母在分母体内的大小则由<代码>标明。 M。

关于时间的复杂性,我们可以很快得出结论,将存在<条码>。 www.un.org/chinese/ga/president 因此,最糟糕的是,电话总数将达到N*M。 除补习部分外,每项职能都需要不断的时间才能履行,因此,我们可以说,这一算法是最坏的O(NM)。 虽然这是道理的,但我觉得这种约束可能更加严格。 换言之,对于任意的<代码>N 母树和 M node subtree, 每一条“代码”都不可能。 Nrecurse(>>,M IsSubtree(<)/code> calls;例如,在第一个IsSameTree(>打电话之后,如果M不是尺寸1,那么>>与页码有关的电话将自然终止;在所有其他情况下,如果M<>>>/recurse(>>recurse(>recurse(>)。 我这样说是为了: 是否有办法找到更严格的约束?

当涉及辅助空间的复杂性时,这或许更为复杂。 一些民间人士迅速声称,空间的复杂性是,但这一点对我来说也是没有意义的。 此外,在任何特定时间,我们可以最多有<条码>日记/代码><条码>。 在任何特定时间,我们也最多可使用<条码>日志/代码><条码>。 虽然这两项声明是真实的,但从来都不是同时。 页: 1 也就是说,为了达到<条码>日志/代码>_isSameTree(>,呼吁打上至少<条码>的节点;因此,从母树叶的叶子到底部,电离层的最低点是<条码>。LogN-LogM。 因此,只能有<条码>记录仪-日志/编码><条码>>>。 树木呼吁在一定时间内打上 call;总数为<代码>。 电话:LogN。 在左边,如果要打上<代码><<0>>>>>,则最近打电话到recurse(<>>的电话必须放在母树的叶子上。 在这种情况下,这一<代码>recurse()的电话只能导致最多2个IsSubtree(<>Is/code>的电话。 根据这一逻辑,辅助空间只是O(LogN)。 我说所有这一切是为了问:是否有一个辅助空间O(logN)O(LogN +logM)?

问题回答

分析比你更容易,因为最坏的案件投入(时间和空间)是完全不平衡的树木,即与各种价值挂钩的清单。

最复杂的案件时间是Θ(NM)。 例如,在M=N/2时,你将进行N/2的大小比较,而NM/2则在Ω(NM)。

Worst case space complexity is Θ(N). You ll never recurse deeper than depth N, and you will get to depth N no matter what M is.

You can make a simple linear time algorithm by only comparing the subtree-to-find with subtrees of the same height.





相关问题
How to add/merge several Big O s into one

If I have an algorithm which is comprised of (let s say) three sub-algorithms, all with different O() characteristics, e.g.: algorithm A: O(n) algorithm B: O(log(n)) algorithm C: O(n log(n)) How do ...

Grokking Timsort

There s a (relatively) new sort on the block called Timsort. It s been used as Python s list.sort, and is now going to be the new Array.sort in Java 7. There s some documentation and a tiny Wikipedia ...

Manually implementing high performance algorithms in .NET

As a learning experience I recently tried implementing Quicksort with 3 way partitioning in C#. Apart from needing to add an extra range check on the left/right variables before the recursive call, ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Enumerating All Minimal Directed Cycles Of A Directed Graph

I have a directed graph and my problem is to enumerate all the minimal (cycles that cannot be constructed as the union of other cycles) directed cycles of this graph. This is different from what the ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...