图及算法----遍历算法(迭代实现)
一直以来,对关于算法怎么一步步的说教不感冒,嗯,这次知道这个问题怎么做怎么做,确实解决了这个问题!但是跟多问题来了,这世界上形形色色的算法太多,
有的算法流程还超长,还有就是脑子不够用啊,哪里能记住这么多细节啊,就算记住了也不可能长久啊,就算要记也只能记住些典型(划算点)。怎么办爱情甜又酸(vae)?
不啰嗦了,这次关照的是图遍历(搜索),模型的假设:
1. 图是一张网,而你是一只爬虫,爬虫想把每个节点检查一下是否牢固;
2. 作为Actor爬虫,是有状态的对象,每次处于不同的环境需要更新状态;
3. 每次更新状态的方式是类似的。
结合本人经验:一个迭代算法通常要考虑-->
a. 有哪些状态,背景与环境 需要维护;
b. 如何初始化相关量;
c. 状态如何更新;
d. 状态何时更新。
迭代的循环性质,似乎从哪个切点进入或初始化都可以?
没错,这与差分方程与微分方程有点像,初始状态很重要
class Graph: def __init__(self): self.graph: Dict[str, List[str]] = defaultdict(list) def addEdge(self, u, v): self.graph[u].append(v) def dfs_traverse(graph, start): visited, stack = set(), [start] while stack: node = stack.pop() if node not in visited: visited.add(node) for nextNode in graph[node]: if nextNode not in visited: stack.append(nextNode) return visited def bfs_traverse(graph, start): visited, queue = set(), [start] while queue: node = queue.pop(0) # 访问的操作包括将该节点纳入被访问集合,并将其子节点纳入待访问队列 if node not in visited: visited.add(node) for nextNode in graph[node]: if nextNode not in visited: queue.append(nextNode) return visited # 想象有个Actor在结构上行走,它必须维护它的状态的变更,这是搜索的本质 def BFS(graph, s): visited = set() queue = [] queue.append(s) # 维护已经被访问的节点,并以此来访问其子节点 while queue: s = queue.pop(0) print(s, end=" ") for i in graph[s]: if i not in visited: visited.add(i) queue.append(i) return visited def BFS2(graph, s): visited = set() queue = [] while True: print(s, end=" ") for i in graph[s]: if i not in visited: visited.add(i) queue.append(i) if queue: s = queue.pop(0) else: break print(queue) return visited