깊이 우선 트리 탐색의 예 :수확량을 이용한 트리 순회의 시간 복잡도는 얼마입니까?
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()
내가 yield from
바로 발전기를 소비하지만, 대신 호출자에게 위로 yield
를 통과하지 않는 것으로 알고 있습니다.
그러나 이를 전달하는이 과정은 여전히 존재하고, 따라서 yield
는 루트까지 모든 노드에서 모든 방법을 전달됩니다, 우리는 (재발하여 실행 시간을 설명은 단순에 대한 이진 트리입니다 가정 할 수있다 하지만 아이디어) 같다 :
T (N) = 2 * T (N/2) + Θ (N)이 노드는 모든
yield
을 통과하기 때문에
Θ(n)
존재 그것의 자손에서부터 부모에게 전달되었다. 그리고 위의 공식에서 파생 된 시간 복잡도는 다음과 같습니다
O (nlogn) 나는 모든
yield
또는yield from
를 사용하지 않는 경우
그러나, 트리 탐색의 시간 복잡도는 O(n)
입니다.
내가 yield
의 작동 방식을 잘못 이해했는지 또는 이처럼 재귀 적 생성기를 작성하는 것이 쉽지 않은지 궁금합니다.
yield from
의 공식 파이썬 3.3 릴리스에서
공식에서 Θ (n)을 Θ (1)로하면 안됩니까? 균형 잡힌 트리에있는 노드의 자손 수가 일정하지 않습니까? – DyZ
@DYZ Θ (n)라고 생각합니다. 자손의 수를 넘기지 않지만 모든 자손으로부터'yield' 문을 전달합니다. –
'자손의 모든 자손'에는 자손의 자손 등이 포함되어 있습니까? (그렇지 않다고 가정합니다.) 그렇지 않다면 여전히 상수입니다. – DyZ