Przykładem głębokości pierwszego przechodzenie drzewa:Jaka jest złożoność czasu przejścia drzew przy użyciu plonu?
class Node:
def __init__(self, value):
self._value = value
self._children = []
def add_child(self, child):
self._children.append(child)
def __iter__(self):
return iter(self._children)
def depth_first(self):
yield self
for c in self:
yield from c.depth_first()
Rozumiem, że yield from
nie zużywa generator od razu, ale zamiast zdać yield
górę do swojego rozmówcy.
Ale ten proces przechodząc nadal istnieje, a zatem yield
będą przekazywane z każdego węzła całą drogę aż do nasady, a my możemy opisać czas pracy przez nawrotu (zakładamy, że jest to drzewo binarne dla uproszczenia , ale idea jest taka sama):
T (n) = 2 * T (n/2) + Θ (n)
Θ(n)
istnieje, ponieważ węzeł musi przejść przez cały yield
przekazane od potomstwa do rodzica. I złożoność czas pochodzi z powyższym wzorze jest:
O (nlogn)
Jednak złożoność czas przechodzenie drzewa jest tylko O(n)
jeśli nie używam yield
lub yield from
w ogóle.
Zastanawiam się, czy źle rozumiem, jak działa yield
lub po prostu nie można napisać takiego generatora rekursywnego.
Czy your (n) w formule nie powinno być Θ (1)? Czy liczba potomków węzła w zrównoważonej stałej drzewa? – DyZ
@DYZ Myślę, że powinno to być Θ (n). Nie mija liczby potomstwa, ale przekazuje oświadczenie o "urodzeniu" od wszystkich jego potomstwa. –
Czy "wszystkie potomstwo" obejmuje potomstwo potomstwa itp.? (Zakładam, że tak nie jest.) Jeśli nie, to wciąż jest stała. – DyZ