Ich versuche, einen effizienten Algorithmus zur Berechnung der Höhe eines Baumes in Python für große Datensätze zu erhalten. Der Code, den ich für kleine Datasets verwende, benötigt aber eine lange Zeit für wirklich große (100.000 Elemente), also versuche ich, Wege zu finden, ihn zu optimieren, aber bleibe stecken. Tut mir leid, wenn es wie eine wirklich neue Frage erscheint, ich bin ziemlich neu in Python.Berechnung der Python-Baumhöhe für große Datensätze
Die Eingabe ist eine Listenlänge und eine Liste von Werten, wobei jedes Listenelement auf das übergeordnete Element verweist, wobei das Listenelement -1 den Stamm des Baums angibt. Also mit einem Eingang:
4 -1 4 1 1
Die Antwort 3 wäre - der Baum ist: ({key: 1, Kinder: [{key: 3} {key: 4, Kinder: [{key: 0, {key: 2}]}]}
Hier ist der Code, den ich bisher habe:
import sys, threading
sys.setrecursionlimit(10**7) # max depth of recursion
threading.stack_size(2**25) # new thread will get stack of such size
class TreeHeight:
def read(self):
self.n = int(sys.stdin.readline())
self.parent = list(map(int, sys.stdin.readline().split()))
def getChildren(self, node, nodes):
parent = {'key': node, 'children': []}
children = [i for i, x in enumerate(nodes) if x == parent['key']]
for child in children:
parent['children'].append(self.getChildren(child, nodes))
return parent
def compute_height(self, tree):
if len(tree['children']) == 0:
return 0
else:
max_values = []
for child in tree['children']:
max_values.append(self.compute_height(child))
return 1 + max(max_values)
def main():
tree = TreeHeight()
tree.read()
treeChild = tree.getChildren(-1, tree.parent)
print(tree.compute_height(treeChild))
threading.Thread(target=main).start()
Es ist keine Frage. Wenn Sie fragen, warum es langsam ist. Es ist deshalb so, weil Sie mehrere Overkills machen, wenn Sie nach einer optimalen Version fragen ... das ganze Programm müsste wahrscheinlich neu gestaltet werden. Wenn du neu bist, gute Arbeit! Obwohl es algorithmisch schlecht ist, ist es eine gute Kodierung. Sie sollten zur CodeReview SE gehen. Sie lieben es, Arbeitsprogramme zu sezieren. – luk32
Unter der Annahme, dass die meiste Zeit in den 'for' Schleifen verbracht wird, kann Substitution, Karten- oder Listenverständnis oder ein Generator Ausdruck (je nachdem, was Sie brauchen) eine gute Option sein. Schaue hier im Abschnitt https://wiki.python.org/moin/PythonSpeed/PerformanceTips. Ich habe diesen Artikel auch sehr hilfreich gefunden, wenn ich versuche, in Python https://www.python.org/doc/essays/list2str/ zu optimieren. – MTset