zoukankan      html  css  js  c++  java
  • 图及算法----遍历算法(迭代实现)

            一直以来,对关于算法怎么一步步的说教不感冒,嗯,这次知道这个问题怎么做怎么做,确实解决了这个问题!但是跟多问题来了,这世界上形形色色的算法太多,

    有的算法流程还超长,还有就是脑子不够用啊,哪里能记住这么多细节啊,就算记住了也不可能长久啊,就算要记也只能记住些典型(划算点)。怎么办爱情甜又酸(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
  • 相关阅读:
    JavaScript怎么让字符串和JSON相互转化
    golang怎么使用redis,最基础的有效的方法
    SmartGit过期后破解方法
    Mac下安装ElasticSearch
    浏览器滚动条拉底部的方法
    git 管理
    MAC远程连接服务器,不需要输入密码的配置方式
    centos6.5下使用yum完美搭建LNMP环境(php5.6) 无脑安装
    【笔记】LAMP 环境无脑安装配置 Centos 6.3
    vs2008不能创建C#项目的解决方法
  • 原文地址:https://www.cnblogs.com/wdmx/p/10076336.html
Copyright © 2011-2022 走看看