动态规划与搜索算法

简介: 动态规划与搜索算法

动态规划(Dynamic Programming, DP)

动态规划是一种解决优化问题的算法设计技术,主要用于求解具有重叠子问题和最优子结构特性的最优化问题。在动态规划中,我们会将复杂问题分解为多个子问题,并计算子问题的解,然后通过组合子问题的解来构造原问题的解。通常,动态规划过程中会构建一张表格(或称为状态转移表),存储已经计算过的子问题的解,避免重复计算,从而降低时间复杂度。

搜索算法

(如深度优先搜索DFS、广度优先搜索BFS、Dijkstra算法、A*搜索等)则是用来探索图或树状结构以找到满足某种条件的路径或解的一种方法。搜索算法通常不强调重叠子问题和最优子结构,其重点在于遍历可能的解决方案空间,直至找到符合条件的目标状态

区别:

  1. 目的:动态规划主要用于求解最优化问题,而搜索算法主要用于找到从起点到终点的路径或其他满足条件的状态。
  2. 记忆化:动态规划往往涉及记忆化(Memoization)或填表,存储已经计算过的子问题答案以减少重复计算。搜索算法中也有类似的概念,如记忆化搜索,但它更侧重于避免回溯过程中的重复状态探索。
  3. 空间消耗:动态规划往往需要额外的空间存储中间结果,搜索算法则通常需要栈(DFS)或队列(BFS)来跟踪搜索路径,两者都会占用额外空间,但动态规划的记忆化表一般会更大。

具体事例:

  • 动态规划例子:斐波那契数列问题。要求计算第n个斐波那契数(F[n]),定义为F[0]=0, F[1]=1,F[n]=F[n-1]+F[n-2]。动态规划方法会创建一个数组来存储F[0]到F[n-1]的值,通过递推关系计算,避免了重复计算子问题。
for (int i = 2; i <= n; i++) {
    fib[i] = fib[i - 1] + fib[i - 2];
}
  • 搜索算法例子:迷宫问题。从起点出发寻找一条到达终点的路径。深度优先搜索会在搜索过程中标记已访问节点,以防回溯,一旦找到终点,返回路径。
bool dfs(Maze maze, Position current, Position target) {
   if (current == target) return true;
  maze[current] = Visited; // 标记已访问
   for (Position neighbor : maze.neighbors(current)) {
       if (!maze.isWall(neighbor) && !maze.isVisited(neighbor)) {
            if (dfs(maze, neighbor, target)) {
                maze.addPath(current, neighbor); // 记录路径
                return true;
            }
        }
    }
    return false; // 没有找到路径
}

在这两个例子中,斐波那契数列问题利用了动态规划减少了重复计算,而迷宫问题则是通过搜索算法探索可能的路径来找到解。

目录
相关文章
|
2天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
10 4
|
2天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
10 1
|
6天前
|
存储 算法 Java
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
|
9天前
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。
|
14天前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
12天前
|
存储 算法
数据结构与算法之动态规划--旷工问题
数据结构与算法之动态规划--旷工问题
23 1
|
2天前
|
算法 Python
二维矩形件排样算法之最低水平线搜索算法实现
二维矩形件排样算法之最低水平线搜索算法实现
5 0
|
6天前
|
人工智能 算法 Java
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
|
10天前
|
人工智能 算法
计算机算法设计与分析 第3章 动态规划 (笔记)
计算机算法设计与分析 第3章 动态规划 (笔记)
|
10天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

热门文章

最新文章