递归------深度优先搜索

深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。它从一个顶点开始,尽可能深地搜索树的分支。深度优先搜索沿着一条路径深入,直到无法继续为止,然后回溯并尝试其他路径。这种搜索策略可以系统地探索一个图的所有顶点和边。

深度优先搜索的主要特点包括:

  1. 递归实现:深度优先搜索通常使用递归实现,其中每个节点会递归地访问其所有未访问过的邻居节点。

  2. 栈的使用:在非递归实现中,可以使用栈(后进先出的数据结构)来模拟递归过程。

  3. 路径探索:深度优先搜索会沿着一条路径深入探索,直到到达一个没有未访问邻居的节点,然后回溯。

  4. 回溯:当搜索到达一个死胡同(即没有更多的节点可以访问)时,算法会回溯到上一个节点,并尝试另一条路径。

  5. 图的遍历:在图的遍历中,深度优先搜索可以用来检测环,或者确定图是否是连通的。

  6. 时间复杂度:对于有V个顶点和E条边的图,深度优先搜索的时间复杂度通常是O(V+E)。

  7. 应用场景:深度优先搜索常用于解决迷宫问题、路径寻找、拓扑排序、检测图中的环等问题。

深度优先搜索的伪代码如下:

DFS(graph, vertex, visited):visited[vertex] = truefor each neighbor of vertex:if visited[neighbor] == false:DFS(graph, neighbor, visited)

在实际应用中,深度优先搜索可以用于各种图和树结构的问题,是计算机科学中一个非常重要的算法

滑雪场
 
 

image.png


 

题目描述

这是一道经典的二维矩阵搜索问题。题目描述了一个滑雪场景:

  • 给定一个二维矩阵,每个位置表示滑雪场的海拔高度

  • 滑雪者可以从任意位置开始滑雪

  • 滑雪者只能从高处往低处滑

  • 每次可以向上下左右四个方向滑动

  • 要求找出最长的滑雪路径长度

示例说明

以代码中的测试用例为例:

test_heights = [[1,  2,  3,  4,  5],[16, 17, 18, 19, 6],[15, 24, 25, 20, 7],[14, 23, 22, 21, 8],[13, 12, 11, 10, 9]
]

在这个例子中:

  • 最长的滑雪路径长度是25

  • 一条可能的最长路径是:25 → 24 → 23 → 22 → 21 → 20 → 19 → 18 → 17 → 16 → 15 → 14 → 13 → 12 → 11 → 10 → 9 → 8 → 7 → 6 → 5 → 4 → 3 → 2 → 1

问题特点

  • 路径特性:

  • 路径必须是严格下降的(每一步都必须比上一步的高度低)

  • 路径长度包含起点和终点

  • 搜索特性:

  • 需要尝试从每个点出发

  • 每个点都可能是最长路径的起点

  • 具有重叠子问题的特点

  • 解题难点:

  • 如何避免重复计算

  • 如何处理边界情况

  • 如何高效地搜索所有可能的路径

解题思路

  • 使用DFS:

  • 采用深度优先搜索遍历所有可能的路径

  • 从每个点开始尝试四个方向的滑行

  • 记忆化优化:

  • 使用memo数组记录已经计算过的结果

  • 避免重复计算相同的子问题

  • 边界处理:

  • 检查数组边界

  • 检查高度条件

  • 处理无效输入

实现代码

def longestSkiPath(heights):if not heights or not heights[0]:return 0rows = len(heights)cols = len(heights[0])# 记忆化数组,memo[i][j] 表示从点(i,j)开始能滑行的最长路径长度memo = [[-1] * cols for _ in range(rows)]# 四个方向:上、下、左、右directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]def dfs(row, col):# 如果已经计算过,直接返回if memo[row][col] != -1:return memo[row][col]# 初始长度为1(当前点)max_length = 1# 尝试四个方向for dx, dy in directions:new_row, new_col = row + dx, col + dy# 检查新位置是否有效且高度更低if (0 <= new_row < rows and 0 <= new_col < cols and heights[new_row][new_col] < heights[row][col]):# 递归计算从新位置开始的最长路径current_length = 1 + dfs(new_row, new_col)max_length = max(max_length, current_length)# 记录结果memo[row][col] = max_lengthreturn max_length# 从每个点开始尝试,找到最长路径result = 0for i in range(rows):for j in range(cols):result = max(result, dfs(i, j))return result# 测试代码
if __name__ == "__main__":# 测试用例test_heights = [[1, 2, 3, 4, 5],[16, 17, 18, 19, 6],[15, 24, 25, 20, 7],[14, 23, 22, 21, 8],[13, 12, 11, 10, 9]]print(longestSkiPath(test_heights))  # 应该输出 25 

从点(2,2)(值为25)开始的搜索过程:

  • 检查四周:

  • 上:18 < 25 ✓

  • 下:22 < 25 ✓

  • 左:24 < 25 ✓

  • 右:20 < 25 ✓

  • 递归搜索每个可行方向,并选择最长的路径:

  • 从18继续搜索

  • 从22继续搜索

  • 从24继续搜索

  • 从20继续搜索

  • 使用记忆化数组(memo)避免重复计算:

  • 当某个点被计算过后,其结果会被存储在memo中

  • 下次遇到相同的点时直接返回存储的结果

5. 时间复杂度

  • 没有记忆化:O(4^(mn)),因为每个点都可能往4个方向扩展

  • 使用记忆化后:O(mn),因为每个点最多被计算一次

    6. 空间复杂度

  • O(mn),主要是记忆化数组的空间

这个算法通过记忆化搜索有效地避免了重复计算,大大提高了效率。对于示例输入,最终会找到长度为25的最长路径。
 

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

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

相关文章

华为HCCDA云技术认证--分布式云架构

大家好呀&#xff01;我是reload。今天继续带大家学习华为HCCDA云技术认证&#xff0c;涵盖华为云最为核心的计算、存储、网络、数据库、安全、部署等服务。今天学习分布式云架构与资源弹性伸缩相关内容。 一、弹性实现原理 1、问题引入 假设在双十一或其他大促期间的流量波…

企业信息化-走进身份管理之搭建篇

​一、身份管理是什么 我们先要弄懂统一身份管理到底是什么&#xff1f; 统一身份管理&#xff08;Unified Identity Manager&#xff0c;UIM&#xff09;&#xff0c;身份管理&#xff08;Identity Management&#xff0c;简称IDM&#xff09;&#xff0c;也被称为IAM&#…

解决Windows批处理文件执行后中文乱码问题

前言 在使用Windows批处理文件时&#xff0c;中文乱码是一个常见的问题。这通常是因为文件的编码格式与命令行&#xff08;cmd&#xff09;默认使用的编码格式不一致导致的。下面我们将简单讲讲如何解决这一问题&#xff0c;确保批处理文件中的中文字符能够正确显示。 问题原…

实践篇:青果IP助理跨境电商的高效采集

写在前面&#xff1a; 近年来&#xff0c;跨境电商行业迅速崛起&#xff0c;成为全球贸易的重要组成部分。据市场调研机构Statista数据显示&#xff0c;2024年全球跨境电商市场规模预计将突破5万亿美元&#xff0c;覆盖数十亿消费者。跨境电商的竞争日益激烈&#xff0c;商家不…

Prometheus结合K8s(二)使用

上一篇介绍了如何搭建 Prometheus结合K8s&#xff08;一&#xff09;搭建-CSDN博客&#xff0c;这章介绍使用 页面访问 kubectl get svc -n prom 看promeheus和granfana的端口访问页面 Prometheus 点击status—target&#xff0c;可以看到metrics的数据来源&#xff0c;即各…

组会 | 大语言模型 + LoRA

目录 1 大语言模型概述1.1 模型的架构1.2 模型的细节&#xff1a;标记化和嵌入化1.3 模型的核心 2 多头注意力机制3 LoRA 概述3.1 冻结部分模型参数3.2 低秩适配&#xff08;LoRA&#xff09;3.2.1 核心工作原理&#xff1a;冻结模型参数3.2.2 核心工作原理&#xff…

Qt——天气预报项目

一.ui界面的设计流程 1.窗口1&#xff1a;使用水平布局&#xff0c;内包含俩个QLabel类和一个QLineEdit类 这里可以设置LineEdit中的提示文字 2.窗口2&#xff1a;使用栅格布局&#xff0c;这个天气图标组件的大小需限制一下 3.窗口3&#xff1a;里面包含一个子窗口&#xff…

【高阶数据结构】LRU Cache

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是LRU Cache&#xff0c;并能简单的模拟实现。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! &…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

stm32 指定变量存储地址

uint8_t array[10] attribute((at(0x20000000))) 当你使用 attribute((at(地址))) 强制将变量放置在特定地址时&#xff0c;编译器和链接器通常不会自动调整其他变量的地址以避免冲突。这意味着&#xff0c;如果指定的地址已经被其他变量占用&#xff0c;就会发生冲突。 如果…

安宝特分享 | 如何利用AR技术革新医疗实践:从远程急救到多学科协作

AR技术在国内外医院的应用 在现代医疗环境中&#xff0c;患者面临的挑战依然严峻&#xff1a;看病难、看病远、看病急。这些问题不仅影响了患者的治疗效果&#xff0c;也让医务工作者倍感压力。幸运的是&#xff0c;随着增强现实&#xff08;AR&#xff09;技术的发展&#xf…

从零开始:如何使用第三方视频美颜SDK开发实时直播美颜平台

开发一个具有实时美颜功能的直播平台&#xff0c;能够显著提高用户体验和内容质量。而利用第三方视频美颜SDK可以大大简化开发过程&#xff0c;加快产品上市速度。本篇文章&#xff0c;小编将从零开始&#xff0c;详细讲解如何使用第三方视频美颜SDK开发一个实时直播美颜平台。…

记录第一次安装laravel项目

window系统 Laravel中文文档&#xff1a;https://laravel-docs.catchadmin.com/docs/11/getting-started/installation 1.使用composer安装全局laravel composer global require laravel/installer2.安装完成后在命令行输入laravel&#xff0c;如果报错&#xff1a;laravel不是…

《Django 5 By Example》阅读笔记:p651-p678

《Django 5 By Example》学习第9天&#xff0c;p651-p678总结&#xff0c;总计28页。 一、技术总结 1.aggregate() (1)aggregate&#xff1a;ad-(“to”) gregare(“to collection into a flock(群)&#xff0c; to gather”) 因为ad 后面跟的是gregate&#xff0c;为了发…

安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案

问题环境 在某个长期停留的位置&#xff08;例如&#xff1a;躺平&#xff09;使用手机时网络突然从5G跳到4G&#xff0c;偶尔跳来跳去导致网络体验很差&#xff0c;经过调整5G网络情况下网速及其他体验都要更好&#xff0c;基于这样的情况使用一种简单的操作&#xff0c;锁定5…

利用c语言详细介绍下希尔排序

希尔排序是针对插入排序的优化算法。它是缩少增量的算法&#xff0c;一开始增量从元素个数len/2的增量开始&#xff0c;然后缩小增量gapgap/2&#xff0c;直到gap为1&#xff0c;最终完成序列排序。 一、图文介绍 我们还是使用数组【10&#xff0c;5&#xff0c;3&#xff0c;2…

基于MATLAB的超宽带(UWB)信号的仿真和测试系统

基于MATLAB的超宽带(UWB)信号的仿真和测试系统 引言 随着无线通信技术的发展&#xff0c;超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术因其高数据传输速率、低功耗、抗多径衰落等优点而受到广泛关注。UWB技术适用于短距离高速数据传输&#xff0c;如个人区域网络、…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1&#xff08;Generative Pre-trained Transformer&#xff09;是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构&#xff0c;具有如下创新点&#xff1a; NLP领域的迁移学习&#xff1a;通过最…

day06(单片机高级)PCB设计

目录 PCB设计 PCB设计流程 元器件符号设计 原理图设计 元器件封装设计 元器件库使用 PCB设计 目的&#xff1a;学习从画原理图到PCB设计的整个流程 PCB设计流程 元器件符号设计 元器件符号&#xff1a;这是电子元器件的图形表示&#xff0c;用于在原理图中表示特定的元器件。例…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…