Python 更快地实现树高功能

Python 更快地实现树高功能,python,algorithm,python-3.x,tree,Python,Algorithm,Python 3.x,Tree,我对算法不熟悉,我开发了这样一个函数来查找输入序列的树高 import sys, threading class TreeHeight: def read(self): self.n = int(sys.stdin.readline()) self.parent = list(map(int, sys.stdin.readline().split())) def compute_height(s

我对算法不熟悉,我开发了这样一个函数来查找输入序列的树高

import sys, threading


class TreeHeight:
        def read(self):
                self.n = int(sys.stdin.readline())
                self.parent = list(map(int, sys.stdin.readline().split()))

        def compute_height(self):
                # Replace this code with a faster implementation
                maxHeight = 0
                for vertex in range(self.n):
                        height = 0
                        i = vertex
                        while i != -1:
                                height += 1
                                i = self.parent[i]
                        maxHeight = max(maxHeight, height)
                return maxHeight

def main():
  tree = TreeHeight()
  tree.read()
  print(tree.compute_height())

threading.Thread(target=main).start()
其工作原理如下:

5
4 -1 4 1 1
和输出

3
因为有5个节点的编号从0到4,节点0是节点4的子节点,节点1是根节点,节点2是节点4的子节点,节点3是节点1的子节点,节点4是节点1的子节点。此树的高度为3,因为从根1到叶2的路径上的顶点数为3

我的解决方案是可行的,但它并没有针对深树进行优化。例如,程序因输入100000而崩溃


在我的情况下,什么是更好的解决方案?

更快和不崩溃是有区别的。你可能应该首先关注崩溃问题。我认为这两个问题是相互关联的,因为低效的算法崩溃的结果是什么?它看起来不应该崩溃。也许它在一个无限循环中运行,他正在测试的环境杀死了他的进程。代码是令人费解的,但它绝对可以进入无限循环,只需考虑一个包含1个项目的树,仅0个。你能假设顶点被排序吗?即,顶点的父对象位于顶点之前?在这种情况下,缓存中间树的高度,这样就不必一直遍历到根。使用递归方法可以更有效地实现这一点,因为它不会存储每个高度。然而,这需要子指针。更快和不崩溃是有区别的。你可能应该首先关注崩溃问题。我认为这两个问题是相互关联的,因为低效的算法崩溃的结果是什么?它看起来不应该崩溃。也许它在一个无限循环中运行,他正在测试的环境杀死了他的进程。代码是令人费解的,但它绝对可以进入无限循环,只需考虑一个包含1个项目的树,仅0个。你能假设顶点被排序吗?即,顶点的父对象位于顶点之前?在这种情况下,缓存中间树的高度,这样就不必一直遍历到根。使用递归方法可以更有效地实现这一点,因为它不会存储每个高度。但是,这需要子指针。