python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索

课程目标

  • 了解树/图的深度遍历,宽度遍历基本原理;
  • 会使用python语言编写深度遍历,广度遍历代码;
  • 掌握拓扑排序算法

搜索算法的意义和作用

搜索引擎

提到搜索两个子,大家都应该会想到搜索引擎,搜索引擎的基本工作步骤;
网页爬取 — 数据预处理 — 排序 — 查询
第一步,网页爬取,非常重要,简单来说,就是给爬虫(蜘蛛程序或者爬虫机器人)分配一组起始的网页,爬取一个网页后,解析提取出这个网页里的所有超链接,再依次爬取出这些超链接,再提取网页超链接,如此不断重复,从而提取网页内容。
在这里插入图片描述
海量的网页链接之间最终构成了一张图,于是问题就变成了如何遍历这张图。
现在的网络,网站机构复杂,信息太多,所以蜘蛛爬行也是有一定策略的。基础就是广度优先和深度优先两种。现实确实时间和带宽优先,再大的搜索引擎也仅仅只能是收入小部分网页。提升网络爬虫的主要方法有:提升网站权重/频繁更新/导入链接/减短与首页的距离等等。

深度优先搜索DFS

定义与基本内容

深度优先搜索属于图算法的一种(Depth First Search)。其过程简要来说就是对每一个可能的分支路径深入到不能深入为止,而且每一个节点只能访问一次。

深度优先搜索是每一次按照一个方向进行穷尽式的搜索,当该方向上的搜索无法继续往前的时候,这时候就退回到上一步,换一个方向继续搜索。

算法演示如下:
在这里插入图片描述

树的深度优先搜索

从跟节点开始,一直搜索左子树,直到某个节点没有左子树为止,接着换个方向搜索右子树。如图,
在这里插入图片描述
DFS的序列为(先序遍历):0 —> 1 —> 3 —> 4 —> 2 —> 5 —> 6

无向图的深度优先搜索

假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。
若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。
在这里插入图片描述
从顶点A开始深度优先搜索;

  1. 访问A;
  2. 访问A的相邻节点C
  3. 访问C的相邻节点B
  4. 在步骤3中访问了C的邻节点B之后,B周围没有邻节点未被访问;因此返回C节点,访问C的另一个邻节点D;
  5. 在步骤4中访问了D后,D周围没有未被访问的邻接点,因此返回C,再返回A,访问F;
  6. 访问F的邻接点G
  7. 访问G的邻接点E

访问的顺序:A—C—B—D—F—G—E

有向图的深度优先搜索

在这里插入图片描述

  1. 步骤1,访问A
  2. 步骤2,访问A的出边的顶点B
  3. 步骤3,访问B的出边的顶点C
  4. 步骤4,访问C的出边的顶点E
  5. 步骤5,访问E的出边的顶点D和B(B在步骤2中已经访问过了)所以访问D
  6. 步骤6,返回之前的节点,直到碰到还有未访问的出边顶点,所以访问到B的出边顶点F
  7. 步骤7,访问G

访问顺序:A—B—C—E—D—F—G

典型题目(200. 岛屿数量)

https://leetcode.cn/problems/number-of-islands/description/
在这里插入图片描述
在这里插入图片描述
DFS(深度优先搜索)问题通常在树或者图结构上进行的,而这道提属于网络结构,网络结构要比二叉树结构稍微复杂,它其实是一个简化版的图结构。
分析:

  1. 访问相邻节点:网络结构中,上下左右四个位置都是相邻节点。坐标为(x, y)的格子,其四个相邻的格子分别为(x-1,y) (x+1,y) (x,y-1) (x,y+1)
  2. 判断base case:如果走进超出网格返回的格子,那么直接返回;
  3. 先往四个方向走一步再说,如果发现走出了网格范围再赶紧返回;
  4. 标记已经遍历过的格子。我们只关注值为1的格子做DFS遍历,每走过一个陆地格子,那就把格子的值改成0.

思路:

  • 采用DFS方式:从(i,j)向此点的上下左右(i+1, j),(i-1, j), (i, j-1),(i, j+1)做深度搜索;
  • 终止条件:①(i,j)越过矩阵边界;②非陆地
  • 搜索岛屿的同时,将遍历过的地方改为0,以免重复搜索相同岛屿

主循环:
遍历整个矩阵,当遇到grid[i][j]==1时,从此点开始做深度优先搜索dfs,岛屿的数量+1且在深度优先搜索中删除此岛屿。
最终返回岛屿数量count。

class Solution:def numIslands(self, grid: List[List[str]]) -> int:def dfs(grid, i, j, rows, cols):# 退出条件if i < 0 or i >  rows - 1 or j < 0 or j > cols - 1 or grid[i][j] != "1":returngrid[i][j] = '0'dfs(grid, i, j+1, rows, cols)dfs(grid, i, j-1, rows, cols)dfs(grid, i+1, j, rows, cols)dfs(grid, i-1, j, rows, cols)rows = len(grid)if rows == 0:return 0cols = len(grid[0])num_islands = 0for i in range(rows):for j in range(cols):# 只有确认时岛屿,才会遍历if grid[i][j] == '1':# 发现岛屿,岛屿个数加1num_islands += 1dfs(grid, i, j, rows, cols)return num_islands

附录基础

python基础语法

python基础精讲 http://t.csdnimg.cn/HdKdi

本专栏主要针对python基础语法,帮助学习者快速接触并掌握python大部分最重要的语法特征。
1、基本数据类型和变量
2、分支结构与循环结构
3、函数与异常处理
4、类与模块
5、文件读写

通过本专栏可以快速掌握python的基础语法。

python数据结构与算法理论基础(专栏)

数据结构与算法(python)http://t.csdnimg.cn/Gb6MN
程序 = 数据结构 + 算法;而且在面试过程中这些是必考,必问的内容。内容大纲:基础数据结构(树、链表、栈、队列等)、常见算法(排序算法、递归算法等)。

专栏是基于python的基础知识,是很好的入门学习资料。帮助大家快速理解这些数据结构和常见算法的概念,同时结合力扣题目,也能更好的掌握这些知识,达到在面试中游刃有余的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全(初版,以后会不断更新)

1.网络安全常识及术语 资产 任何对组织业务具有价值的信息资产&#xff0c;包括计算机硬件、通信设施、IT 环境、数据库、软件、文档 资料、信息服务和人员等。 漏洞 上边提到的“永恒之蓝”就是windows系统的漏洞 漏洞又被称为脆弱性或弱点&#xff08;Weakness&#xff09;&a…

DC-7靶机做题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1w2c_QKd_hOoR2AzNrdZjMg?pwdtdky 提取码&#xff1a;tdky 参考&#xff1a; DC7靶机地址&#xff1a;http://www.five86.com/downloads/DC-7.zipDC7靶场介绍: https://www.vulnhub.com/entry/dc-7,356/…

AI+量化02_金融市场的基础概念

文章目录 问答之纯小白 vs GPT4Q1. 请用尽可能简短的语句或例子&#xff0c;给小白讲解宏观经济Q2. 给小白讲解资本边际效率Q3. 如果证券没有风险是否意味着没有收益&#xff1f;Q4. 芒格&#xff1a;教人炒股&#xff0c;犹如引人吸毒Q5. 给小白快速讲解&#xff1a;卡房统计量…

计算机速成课Crash Course - 21. 压缩

更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 21. 压缩 (qq.com) 今天继续计算机速成课Crash Course的系列讲解。 21. 压缩 上集我们讨论了文件格式&#xff0c;如何…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

Docker(十一)Swarm mode

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; Swarm mode Docker 1.12 Swarm mode 已经内嵌入 Docker 引擎&#xff0c;成为了 docker 子命令 docker swarm。请注意与旧的 Docker Swarm …

力扣509. 斐波那契数

动态规划 思路&#xff1a; 斐波那契数通式&#xff1a;F(n) F(n - 1) F(n - 2)&#xff1b;以此为状态转移方程&#xff0c;对其进行动态规划&#xff1b;边界条件&#xff1a; F(0) 0F(1) 1使用两个变量来存储上一组结果&#xff1b; class Solution { public:int fib(…

Docker安装配置OnlyOffice

OnlyOffice 是一款强大的办公套件&#xff0c;你可以通过 Docker 轻松安装和部署它。本文将指导你完成安装过程。 步骤 1&#xff1a;拉取 OnlyOffice Docker 镜像 首先&#xff0c;使用以下命令从 Docker Hub 拉取 OnlyOffice Document Server 镜像&#xff1a; sudo docke…

计算机毕业设计 基于MVC的自习室管理和预约系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

如何用数据赋能社媒营销决策?

在数字化时代&#xff0c;越来越多的商家开始意识到数据分析对于改善经营的重要性。 传统决策更多依赖过往经验、商业直觉、他人的思路模板等方法&#xff0c;或者依靠描述性统计、简单的数据分析。在数字时代&#xff0c;则通过精细化数据分析&#xff0c;做出更明智的营销决策…

LLM包含的知识

基础知识 磨刀不误砍柴工&#xff0c;LLM基础知识还是需要的。会按照历史梳理LM&#xff0c;详解BERT、GPT系列等各种预备核心知识点&#xff0c;并带着进行GPT预训练实战、位置编码&#xff08;长文本问题&#xff09;实战等。 数据工程 数据很重要&#xff0c;数据是天花板…

在docker中配置 Linux ls 配色方案 与 shell 提示符

发行版中默认的配置一般非常合理&#xff0c;但是docker中往往忽略了这些简单的配置&#xff0c;备忘一下 1. ls 配色方案 vim &#xff5e;/.bashrc 在文件最末尾加入如下一行内容&#xff1a; export LS_COLORS"rs0:di01;34:ln01;36:mh00:pi40;33:so01;35:do01;35:bd40…

基于供水管网建模的漏损控制

1.1供水管网模型的概念和管网建模目的 供水管网系统是比较特殊的城市基础设施&#xff0c;不可见且属于压力管道。随着运行年限的增长&#xff0c;管道的过水能力和水泵的运行工况都发生了变化&#xff0c;管道的改扩建也使管网系统的结构发生了变化&#xff0c;导致系统运行状…

WPF-HelixToolkit包的使用(上)

1、引入HelixToolkit包&#xff1a;新建一个WPF项目&#xff0c;在项目“引用”上右击&#xff0c;选择“管理NutGet程序包”&#xff0c; 2、在左侧“浏览”中输入“helixtoolkit” 3、安装第一个“HelixToolkit”包 4、解决错误&#xff1a;右击属性->应用程序->目标框…

Unity -简单键鼠事件和虚拟轴

简单键鼠事件 — “Test_03” KeyTest 键鼠事件每帧都要监听&#xff0c;要放在Update()中处理 public class KeyTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 【鼠标点击事件…

银河麒麟桌面桌面操作系统v10保姆级安装

目录 一、下载ISO映像文件 1.产品试用申请 2.试用版下载 二、虚拟机搭建 1.新建虚拟机 2. 选择虚拟机硬件兼容性 3.选择安装客户机操作系统 4.选择客户机操作系统 5.命名虚拟机 6.处理器配置 7.虚拟机内存 8.网络类型 9.硬件 10.指定磁盘容量 三、修改虚拟…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos&#xff0c;查看所有任务的栈的信息&#xff0c;包括任务名&#xff0c;任务状态&#xff0c;任务优先级&#xff0c;空闲栈&#xff0c;任务号。 运行结果如下 只需要使用一个函数vTaskList &#xff1a;获得任务的统计信息&#xff0c;形式为…

echart3D地图使用

由于项目需求&#xff0c;需要实现3D全国地图&#xff0c;并且在3D地图上通过3D柱状图显示各个区域的数据&#xff0c;并鼠标悬浮该区域的时候&#xff0c;需要实现该省份区域模块整体向上移动的特效 实现效果大致如下&#xff0c;细节需要各位同学自行调整了 需要安装echart…

03--数据库连接池

1、数据库连接池 1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步骤&#xff1a; 在主程序&#xff08;如servlet、beans&#xff09;中建立数据库连接进行sql操作断开数据库连接 这种模式开发&#xff0c;存在的问题:…

Flink Kubernetes Operator 介绍

一、简介 Flink Kubernetes Operator是针对在Kubernetes上运行Apache Flink应用程序而设计的工具。它充分利用了Kubernetes的优势&#xff0c;实现了对Flink集群的弹性管理和自动化操作&#xff0c;通过扩展Kubernetes API的方式&#xff0c;提供了管理和操作Flink部署的功能。…