Python中遍历列表的for循环在列表变更时会重置吗?(DFA场景)
DFA可达性检查函数的循环疑问
我在计算理论课程的项目中,为DFA类编写了一个判断特定状态是否可从起始状态到达的函数(类似简单图的连通性检查),代码如下:
def is_reachable(self, dest_state): reachable_states = [self.start_state] for state in reachable_states: for char in self.alphabet: if self.transition_function[state][char] not in reachable_states: reachable_states.append(self.transition_function[state][char]) return dest_state in reachable_states
我的疑问是:外层的for循环会在reachable_states列表添加元素时重置吗?若会重置,该函数的时间复杂度将不够高效。
解答
外层的for循环不会重置。Python的for循环基于列表迭代器运行,循环启动时迭代器就绑定到当前的reachable_states列表对象上,后续向列表新增元素时,迭代器会继续遍历这些新元素,不会从头重新启动整个循环。
不过你担心的效率问题确实存在,但根源不是循环重置——问题出在列表的not in成员检查:列表的成员查找是O(n)时间复杂度(n为当前可达状态数),当DFA状态数量较多时,这个操作会明显拖慢函数运行速度。
优化方案
改用集合存储可达状态,集合的成员检查是O(1)时间复杂度,再配合队列实现标准广度优先搜索(BFS),能大幅提升效率:
def is_reachable(self, dest_state): reachable_states = set() queue = [self.start_state] reachable_states.add(self.start_state) while queue: state = queue.pop(0) for char in self.alphabet: next_state = self.transition_function[state][char] if next_state not in reachable_states: reachable_states.add(next_state) queue.append(next_state) return dest_state in reachable_states
这个优化版本中每个状态只会被处理一次,时间复杂度为O(SA)(S是DFA状态总数,A是字母表大小),远优于原实现的O(S²A)。
内容的提问来源于stack exchange,提问作者Mahdi Soleimani
相关产品推荐
相关产品推荐

