python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索
课程目标
- 了解树/图的深度遍历,宽度遍历基本原理;
- 会使用python语言编写深度遍历,广度遍历代码;
- 掌握拓扑排序算法
搜索算法的意义和作用
搜索引擎
提到搜索两个子,大家都应该会想到搜索引擎,搜索引擎的基本工作步骤;
网页爬取 — 数据预处理 — 排序 — 查询
第一步,网页爬取,非常重要,简单来说,就是给爬虫(蜘蛛程序或者爬虫机器人)分配一组起始的网页,爬取一个网页后,解析提取出这个网页里的所有超链接,再依次爬取出这些超链接,再提取网页超链接,如此不断重复,从而提取网页内容。

海量的网页链接之间最终构成了一张图,于是问题就变成了如何遍历这张图。
现在的网络,网站机构复杂,信息太多,所以蜘蛛爬行也是有一定策略的。基础就是广度优先和深度优先两种。现实确实时间和带宽优先,再大的搜索引擎也仅仅只能是收入小部分网页。提升网络爬虫的主要方法有:提升网站权重/频繁更新/导入链接/减短与首页的距离等等。
深度优先搜索DFS
定义与基本内容
深度优先搜索属于图算法的一种(Depth First Search)。其过程简要来说就是对每一个可能的分支路径深入到不能深入为止,而且每一个节点只能访问一次。
深度优先搜索是每一次按照一个方向进行穷尽式的搜索,当该方向上的搜索无法继续往前的时候,这时候就退回到上一步,换一个方向继续搜索。
算法演示如下:

树的深度优先搜索
从跟节点开始,一直搜索左子树,直到某个节点没有左子树为止,接着换个方向搜索右子树。如图,

DFS的序列为(先序遍历):0 —> 1 —> 3 —> 4 —> 2 —> 5 —> 6
无向图的深度优先搜索
假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。
若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

从顶点A开始深度优先搜索;
- 访问A;
- 访问A的相邻节点C
- 访问C的相邻节点B
- 在步骤3中访问了C的邻节点B之后,B周围没有邻节点未被访问;因此返回C节点,访问C的另一个邻节点D;
- 在步骤4中访问了D后,D周围没有未被访问的邻接点,因此返回C,再返回A,访问F;
- 访问F的邻接点G
- 访问G的邻接点E
访问的顺序:A—C—B—D—F—G—E
有向图的深度优先搜索

- 步骤1,访问A
- 步骤2,访问A的出边的顶点B
- 步骤3,访问B的出边的顶点C
- 步骤4,访问C的出边的顶点E
- 步骤5,访问E的出边的顶点D和B(B在步骤2中已经访问过了)所以访问D
- 步骤6,返回之前的节点,直到碰到还有未访问的出边顶点,所以访问到B的出边顶点F
- 步骤7,访问G
访问顺序:A—B—C—E—D—F—G
典型题目(200. 岛屿数量)
https://leetcode.cn/problems/number-of-islands/description/


DFS(深度优先搜索)问题通常在树或者图结构上进行的,而这道提属于网络结构,网络结构要比二叉树结构稍微复杂,它其实是一个简化版的图结构。
分析:
- 访问相邻节点:网络结构中,上下左右四个位置都是相邻节点。坐标为(x, y)的格子,其四个相邻的格子分别为(x-1,y) (x+1,y) (x,y-1) (x,y+1)
- 判断base case:如果走进超出网格返回的格子,那么直接返回;
- 先往四个方向走一步再说,如果发现走出了网格范围再赶紧返回;
- 标记已经遍历过的格子。我们只关注值为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的基础知识,是很好的入门学习资料。帮助大家快速理解这些数据结构和常见算法的概念,同时结合力扣题目,也能更好的掌握这些知识,达到在面试中游刃有余的效果。
相关文章:
python算法与数据结构(搜索算法和拓扑排序算法)---深度优先搜索
课程目标 了解树/图的深度遍历,宽度遍历基本原理;会使用python语言编写深度遍历,广度遍历代码;掌握拓扑排序算法 搜索算法的意义和作用 搜索引擎 提到搜索两个子,大家都应该会想到搜索引擎,搜索引擎的基…...
thinkphp5实战之phpstudy v8环境搭建,解决Not Found找不到路径问题
引言 thinkphp以快速、简约的大道至简的思想广受欢迎,适合开发小型项目。本地环境下,phpstudy v8是一款比较优秀的集成环境软件。部署完项目后,访问的时候傻眼,报错。 解决方案 不要慌,这个是伪静态的原因。选择apach…...
fastjson-BCEL不出网打法原理分析
FastJson反序列化漏洞 与原生的 Java 反序列化的区别在于,FastJson 反序列化并未使用 readObject 方法,而是由 FastJson 自定一套反序列化的过程。通过在反序列化的过程中自动调用类属性的 setter 方法和 getter 方法,将JSON 字符串还原成对…...
部署mysql主从同步,部署mysql数据读写分离结构+mycat2
主要命令 [rootmysql59 ~]# yum –y install mysql-server mysql[rootmysql59 ~]# systemctl start mysqld[rootmysql59 ~]# vim /etc/my.cnf.d/mysql-server.cnf[mysqld]server-id59log-binmysql59:wq[rootmysql59 ~]# systemctl restart mysqld//用户授权[rootmysql59 ~]# my…...
【最新!超详细C++入门】
01_C语言基础 一、课程目标 1、掌握 C基本语法:变量、常量、注释、标识符命名规范 2、掌握C数据类型 3、掌握C的输入和输出 4、掌握C运算符和表达式 5、掌握条件语句 6、掌握循环语句 二、课程内容 1 C初识 1.1 第一个C程序 编写一个C程序总共分为4个步骤…...
【Linux】【实战系列】10 分钟掌握日常开发中 Linux 网络处理相关命令
文章目录 lsofnetstatpingnslookupsshssh-keygenscpsftp 网络工具 curl网络工具 wget最后个人简介 hello,大家好,我是 Lorin,上一期和大家分享一期日常开发中常用的 Linux 文件和文本命令实战教学,这一期给大家带来常用的网络处理…...
语义分割常用评价指标
在图像处理领域中,语义分割是很重要的一个任务。在实际项目开发中,评估模型预测效果以及各指标的含义对于优化模型极为重要。 本文将主要评价指标的计算算法进行了详细说明,并加上注释解释每个指标的含义。这对理解各指标背后的数学原理以及能否在实践中应用或许有…...
从0开始学习C++ 第一课:你的第一个C++程序
第一课:你的第一个C程序 当然可以。让我们从C的基础开始,我们的第一课将覆盖以下几个主题: 程序结构编写和运行你的第一个C程序基本的输入输出(I/O) 第一课:你的第一个C程序 在C中,所有的程…...
Dubbo-admin监控中心
监控中心 Dubbo-admin监控中心执行操作启动provider和consumer项目进行测试总体流程 Dubbo-admin监控中心 dubbo-admin下载路径 git clone https://github.com/apache/dubbo-admin.git图1-1 dubbo-admin项目文件展示 执行操作 # 启动zookeeper# 前端 cd dubbo-admin-ui npm i…...
216. 组合总和 III - 力扣(LeetCode)
题目描述 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 输入示例 k 3, n 7输出示例 [[1,2,…...
LeetCode-题目整理【5】:O(1) 时间插入、删除和获取随机元素
RandomizedSet结构体存在切片和哈希表的原因: 变长数组由于可以根据下标定位到特定元素,因此可以在 O(1)的时间内完成获取随机元素操作,但是由于无法在 O(1) 的时间内判断元素是否存在,因此不能在 O(1) 的时间内完成插入和删除操作…...
服务器感染了.wis[[Rast@airmail.cc]].wis勒索病毒,如何确保数据文件完整恢复?
导言: 在当今数字化的时代,恶意软件攻击已经变得越来越复杂和狡猾,[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis[[Rastairmail.cc]].wis勒索病毒是其中的一种新威胁。本文91数据恢复将深入介绍[[MyFilewaifu.club]].wis [[backupwaif…...
ContentNegotiationManagerFactoryBean 内容协商
一.什么是内容协商 简单点说,就是同一资源,可以有多种表现形式,比如xml、json等,具体使用哪种表现形式,是可以协商的。 这是RESTfull的一个重要特性,Spring Web MVC也支持这个功能。 1.Spring MVC REST是如何决定采用…...
html css js 开发一个猜数字游戏
以下是一个使用HTML、CSS和JS开发的简单猜数字游戏的示例: HTML代码: <!DOCTYPE html> <html> <head><title>猜数字游戏</title><link rel"stylesheet" type"text/css" href"style.css&quo…...
HDD 东山再起,单块 30TB 起步新品想要颠覆储存行业
不得不承认,这年头机械硬盘(HDD)是越来越不受待见了。 体积大,耗电高,速度慢等多年祖传特点无不脱离当前消费者所追求的轻量化,高性能。 个人消费市场不约而同选择全面奔向固态硬盘(SSD&#x…...
【网络安全】-基本工具msf
secure 1、有此漏洞的目标主机2、无此漏洞的目标主机(常用) ps.本着兴趣爱好,加强电脑的安全防护能力,并严格遵守法律和道德规范。msf(metasploit framework)是一个开源的渗透测试框架,用于开发…...
Vue3的ref和reactive
目录 1、ref的基本使用 2、reactive的基本使用 3、ref操作dom 4、ref与reactive的异同 1、ref的基本使用 ref创建数据可以是基本类型也可以是引用类型 ref函数创建响应式数据,返回值是一个对象 模版中使用ref数据,省略.value,js代码中不能省略 获…...
Flink编程——风险欺诈检测
Flink 风险欺诈检测 文章目录 Flink 风险欺诈检测背景准备条件FraudDetectionJob.javaFraudDetector.java 代码分析执行环境创建数据源对事件分区 & 欺诈检测输出结果运行作业欺诈检测器 欺诈检测器 v1:状态欺诈检测器 v2:状态 时间完整的程序期望的…...
Day37 贪心算法 part06 738. 单调递增的数字 968. 监控二叉树
贪心算法 part06 738. 单调递增的数字 968. 监控二叉树 738. 单调递增的数字 class Solution { public:int monotoneIncreasingDigits(int n) {string strNum to_string(n);int tag strNum.size();for(int i strNum.size()-1; i>1; i--){if(strNum[i]<strNum[i-1]){…...
SpringBoot Redis入门(四)——Redis单机、哨兵、集群模式
单机模式:单台缓存服务器,开发、测试环境下使用;哨兵模式:主-从模式,提高缓存服务器的高可用和安全性。所有缓存的数据在每个节点上都一致。每个节点添加监听器,不断监听节点可用状态,一旦主节点…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
从0开始学习R语言--Day17--Cox回归
Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...
