Python中利用next和iter在递减集合内检测有向图环的疑问
关于有向图环检测中
next(iter(white))的疑问解答 嘿,我来帮你把这个点掰明白!
首先,你猜的完全没错——核心原因就是每次进入while循环时,都会重新生成一个针对当前white集合的迭代器。
咱们拆解着看:
iter(white)会创建一个基于当前white集合状态的迭代器对象,集合本身是无序的,但迭代器会从当前集合的元素里按内部顺序返回元素(具体顺序不用纠结,因为我们只需要遍历完所有未处理的顶点就行)。next()则是取出这个迭代器的第一个元素。
结合代码的执行流程来看就更清晰了:
- 初始化阶段,
white集合会被填满所有图的顶点。 - 第一次进入
while循环,iter(white)生成一个包含所有顶点的迭代器,next()取出其中一个顶点启动DFS。 - 在DFS过程中,我们通过
move_vertex把顶点从white移到gray,处理完后再移到black——这意味着white集合的元素会不断减少。 - 当一轮DFS结束回到
while循环时,white已经是剩下的未处理顶点集合了,此时iter(white)会重新生成一个迭代器,针对当前剩下的元素,next()再取出下一个顶点继续处理。
换句话说,每次next(iter(white))拿到的都是当前white集合里的某个元素,因为每次调用iter()都是基于当时的集合状态创建新的迭代器,而非复用之前的旧迭代器。
下面是整理好格式的代码:
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)
内容的提问来源于stack exchange,提问作者heretoinfinity
相关产品推荐
相关产品推荐

