Một ví dụ về chiều sâu-đầu tiên cây traversal:Độ phức tạp thời gian của việc chuyển cây bằng cách sử dụng năng suất từ đâu?
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()
Tôi hiểu rằng yield from
không tiêu thụ máy phát điện ngay lập tức, nhưng thay vì vượt qua yield
lên để gọi nó.
Nhưng quá trình này của qua vẫn còn tồn tại, và do đó yield
sẽ được truyền từ mỗi nút tất cả các con đường lên đến gốc của nó, và chúng ta có thể mô tả thời gian chạy bởi sự tái diễn (giả định nó là một cây nhị phân vì đơn giản , nhưng ý tưởng là như nhau):
T (n) = 2 * T (n/2) + Θ (n)
Θ(n)
tồn tại vì nút này phải vượt qua tất cả các yield
được chuyển từ phần offsprings sang cha mẹ của nó. Và mức độ phức tạp thời gian bắt nguồn từ công thức trên là:
O (nlogn)
Tuy nhiên, mức độ phức tạp thời điểm duyệt cây chỉ O(n)
là nếu tôi không sử dụng yield
hoặc yield from
ở tất cả.
Tôi tự hỏi liệu tôi có hiểu lầm cách hoạt động của yield
hay không đơn giản là không thể viết một trình tạo đệ quy như thế này.
Không nên Θ (n) trong công thức của bạn là Θ (1)? Không phải là số con của một nút trong hằng số cây cân bằng? – DyZ
@DYZ Tôi nghĩ rằng nó phải là Θ (n). Nó không vượt qua số lượng offsprings, nhưng vượt qua tuyên bố 'yield' từ tất cả các offsprings của nó. –
'Tất cả con cái của nó' có bao gồm con đẻ của con cái, v.v. không? (Tôi cho rằng nó không.) Nếu không, nó vẫn là một hằng số. – DyZ