Python: 在递减集合中使用 next 和 iter 检测循环
Python: Detect cycle using next and iter in a diminishing set
我正在关注 Tushar Roy 的 video 关于检测有向图中的循环。我了解使用白色、灰色和黑色集来检测循环,但我不明白的主要是当我们检查 white
集的长度时,next(iter(white))
会如何知道由于设置大小已更改,下一步要去哪里。文档说 iter
给你一个迭代器对象, next
会检索下一个项目。重点是迭代器每次求值都不一样吗?
def has_cycle(graph):
white = set()
gray = set()
black = set()
for vertex in graph.all_vertex.values():
white.add(vertex)
while len(white) > 0:
current = next(iter(white))
if dfs(current, white, gray, black) == True:
return True
return False
def dfs(current, white, gray, black):
move_vertex(current, white, gray)
for neighbor in current.adjacent_vertices:
if neighbor in black:
continue
if neighbor in gray:
return True
if dfs(neighbor, white, gray, black) == True:
return True
move_vertex(current, gray, black)
return False
def move_vertex(vertex, source_set, destination_set):
source_set.remove(vertex)
destination_set.add(vertex)
next(iter(white))
只是 returns 集合 white
的一个元素。集合未排序,因此无法保证选择了哪个元素。您认为迭代器是针对循环的每次迭代进行评估的,这是正确的。
集合随着循环的进行而变化的事实禁止使用 for
循环。
我正在关注 Tushar Roy 的 video 关于检测有向图中的循环。我了解使用白色、灰色和黑色集来检测循环,但我不明白的主要是当我们检查 white
集的长度时,next(iter(white))
会如何知道由于设置大小已更改,下一步要去哪里。文档说 iter
给你一个迭代器对象, next
会检索下一个项目。重点是迭代器每次求值都不一样吗?
def has_cycle(graph):
white = set()
gray = set()
black = set()
for vertex in graph.all_vertex.values():
white.add(vertex)
while len(white) > 0:
current = next(iter(white))
if dfs(current, white, gray, black) == True:
return True
return False
def dfs(current, white, gray, black):
move_vertex(current, white, gray)
for neighbor in current.adjacent_vertices:
if neighbor in black:
continue
if neighbor in gray:
return True
if dfs(neighbor, white, gray, black) == True:
return True
move_vertex(current, gray, black)
return False
def move_vertex(vertex, source_set, destination_set):
source_set.remove(vertex)
destination_set.add(vertex)
next(iter(white))
只是 returns 集合 white
的一个元素。集合未排序,因此无法保证选择了哪个元素。您认为迭代器是针对循环的每次迭代进行评估的,这是正确的。
集合随着循环的进行而变化的事实禁止使用 for
循环。