蓝桥学院2019算法-递归总结

本文探讨了解决递归问题的有效方法,包括找到一种划分方法,将父问题转化为子问题进行求解;寻找递推公式或等价转换,帮助理解问题的变化规律。通过明确递归的参数、变化量及终止条件,提升解决问题的效率。

找重复

  1、找到一种划分方法。

  2、找到递推公式或者等价转换。

  都是父问题转化为求解子问题。

找变化的量

  变换的量通常作为参数

找出口

  终止的条件

转载于:https://www.cnblogs.com/zsh-blogs/p/10385856.html

<think>好的,用户需要关于蓝桥杯省赛中涉及的数据结构与算法的总结。首先,我需要回忆蓝桥杯省赛的常见考点。根据提供的引用资料,特别是引用[1]和引用[3],近三年的省赛题目中,DFS、BFS、并查集、动态规划、贪心算法出现频率较高。同时,排序算法如快速排序也常被提及。 接下来,用户可能希望了解这些算法的具体应用场景和实现方式。比如,DFS用于路径查找,BFS用于最短路径,并查集处理连通性问题。动态规划和贪心算法在优化问题中常见。引用[2]和引用[3]中提到了这些应用场景,需要整合这些信息。 数据结构方面,数组、队列、栈是基础结构。引用[4]和[5]分别讨论了数组和队列的实现,特别是二维数组的结构和队列的先进先出特性。这部分需要简明扼要地总结,强调它们在算法中的应用。 用户还可能关心代码模板,比如并查集的find和union函数,DFS和BFS的框架。引用[3]提供了相关代码片段,需要整理成易读的形式,并解释关键点,比如路径压缩在并查集中的优化作用。 另外,需要注意用户要求使用中文回答,数学表达式用$...$格式,独立公式用$$...$$。例如,动态规划的状态转移方程可能需要使用独立公式。同时,确保引用标记正确添加,比如提到DFS应用时引用[2]。 最后,生成相关问题时要围绕总结内容,涵盖优化方法、应用场景、性能分析等。比如快速排序的优化方法,动态规划与贪心的区别,这些都是用户可能进一步想了解的。 现在需要将这些思考整合成一个结构清晰的回答,分点列出高频算法、数据结构、代码模板,并附上相关问题。确保每个部分都有对应的引用支持,同时遵循格式要求,不使用Markdown,保持自然的中文表达。</think>### 蓝桥杯省赛数据结构与算法总结 #### 一、高频算法及核心知识点 1. **DFS/BFS** - **DFS**:用于解决**全路径搜索**(如排列组合、迷宫路径)、正则表达式匹配、棋盘状态遍历等问题。实现时需注意**内部搜索**(以棋盘位置为结点)和**外部搜索**(以棋盘整体状态为结点)的区别[^2][^3]。 - **BFS**:适用于**最短路径**问题(如迷宫最短出口),时间复杂度通常为$O(n)$。队列实现时需注意层序遍历逻辑[^2][^5]。 2. **动态规划与贪心算法** - **动态规划**:常见于最优化问题(如背包问题、最长子序列),状态转移方程需明确。例如: $$dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w_i] + v_i)$$ - **贪心算法**:用于局部最优可推导全局最优的场景(如区间调度),需证明贪心策略的正确性[^1]。 3. **并查集** - 解决**连通性**问题(如网络节点连接)。核心操作`find`(路径压缩优化)与`union`(合并集合): ```python def find(x): if x != p[x]: p[x] = find(p[x]) # 路径压缩 return p[x] ``` 合并时需判断根节点是否相同,避免环路。 4. **排序与搜索算法** - **快速排序**:平均时间复杂度$O(n \log n)$,基准选择影响性能,代码示例见用户问题中的Python实现[^3]。 #### 二、关键数据结构 1. **数组与二维数组** - 数组在连续内存中存储,支持快速随机访问。二维数组本质是**线性数组存储其他数组的首地址**,需注意索引与元素的对应关系[^4]。 2. **队列与栈** - **队列**:先进先出(FIFO),用于BFS、缓存等场景。双端队列支持两端操作,提升灵活性。 - **栈**:后进先出(LIFO),用于括号匹配、DFS递归模拟等。 #### 三、代码模板与技巧 1. **DFS框架** ```python def dfs(path, state): if 终止条件: 记录结果 return for 选择 in 所有可能分支: if 剪枝条件: continue path.append(选择) dfs(path, 新状态) path.pop() ``` 2. **BFS框架** ```python queue = [初始结点] while queue: node = queue.pop(0) if 达到目标: return 结果 for 相邻结点 in 扩展规则: if 未被访问: queue.append(相邻结点) ``` 3. **差分数组** 用于区间增减操作,如: ```python diff = [0] * (n+1) diff[l] += c diff[r+1] -= c ``` #### 四、典型应用场景 - **DFS**:全排列生成、正则表达式匹配(如用户输入合法性检查)[^3]。 - **BFS**:迷宫最短路径、社交网络层级关系分析[^2]。 - **并查集**:社交网络好友关系合并、最小生成树Kruskal算法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值