算法
这边简单跟大家介绍一下一些算法名词代表的含义.
动态规划(Dynamic Programming)
主要思想:- 将问题分解为多个子问题
- 子问题之间存在重叠性质,可以存储子问题的结果,避免重复计算
- 根据子问题的结果,逐步合并得到原问题的解
- 分阶段求解
- 存储中间结果
- 自底向上
- 重复子问题
- 问题能分解为子问题
- 子问题之间存在重叠子问题
- 存在最优子结构
- 能利用中途结果推导最终解
二分查找(Binary Search)
是一种在有序数组中查找目标值的算法,其思想是:- 每次将查找区间分为二分,取中间位置的元素与目标值比较
- 如果中间元素等于目标值,则找到目标元素返回
- 如果中间元素大于目标值,则目标值在左区间,将右边界调整为中间元素索引-1
- 如果中间元素小于目标值,则目标值在右区间,将左边界调整为中间元素索引+1
- 重复步骤 1-4,直到找到目标元素或者区间被缩小为不存在
二分查找算法步骤:
- 初始化左右指针 l = 0, r = N-1
- 循环直到 l > r
- 计算 mid = (l + r) / 2
- 比较 A[mid] 与 target
- target 在左区间:r = mid - 1
- target 在右区间:l = mid + 1
- 如果找到 target,返回索引,否则返回-1
贪心算法(Greedy Algorithm)
基本思想是:- 每一步都选择当前最优或局部最优的解
- 通过累积当前最优解获得全局最优解
- 建立数学模型,将问题抽象出状态、选择标准等元素
- 确定每一步的局部最优选择,得到选择标准
- 设计贪心算法规则,只做当前最优决策
- 证明该算法能通过局部最优获得全局最优
- 每步都做出一个选择,不能回退
- 依赖问题具备最优子结构
- 可以快速直接求解,效率高
- 无法得到最优解的问题不能使用贪心算法
回溯修正(Backtracking)
常用于求解组合优化问题,其基本思想是:- 递归枚举所有的可能解
- 当发现不是最优解时进行回溯,修改选择并继续递归搜索
- 通过递归搜索空间,找出问题的最优解
- 定义问题的解空间,表示可能的解集合
- 确定易于搜索的解空间结构,如树、图等
- 确定递归遍历解空间的规则,以及找到解的条件
- 回溯时设置适当的数据结构进行恢复
- 设计回溯修正的规则,当发现不是最优解进行恢复