七个经典算法思想

时间复杂度O(1) < O(logN) < O(N) < O(N logN) < O(N2) < O(N3) < O(2N)<O(N!)

  • 枚举(暴力、穷举):枚举所有结果得到想要的结果

  • 递推:由已知的一些条件和规律,去推理出下一个条件/规律/中间结果,再用推理出来的条件/规律/中间结果去推理下一个条件/规律/中间结果,一直如此直到推导出最后想要的结果。

递推算法所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定。
从已知条件出发逐步推到问题结果,此种方法叫顺推。
从问题出发逐步推到已知条件,此种方法叫逆推。
无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。
递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。
递推算法的执行过程如下:
(1)根据已知结果和关系,求解中间结果。
(2)判定是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果。如果满足要求,则表示寻找到一个正确的答案。

  • ​递归:函数在运行时调用自己

  • 分治:二分法,归并排序,计数排序,基数排序等

  • 动态规划:多阶段决策最优解,记住子问题的解来节省解决原问题需要的时间

动态规划和递归的区别是多了一个记录子问题答案的操作,不需要多次求子问题的答案。而递归每次求解父问题都需要对所涉及的子问题再求解一遍。

动态规划算法的两种形式,记住子问题解的方式有两种:①自顶向下的备忘录法 ②自底向上的动态规划
①自顶向下的备忘录法:想要原问题的最优解,需要先去求子问题的最优解,求子问题的最优解需要先求子子问题的最优解,直到不再需要往下分级的那一级问题的最优解可以直接求出时,记录这个最优解,然后逐层向上求出上一级的最优解,直到求出原问题的最优解。
②自底向上的动态规划:求出子问题的最优解并记录下来,用来得到父问题的最优解并记录下来,再由父问题的最优解去求父父问题的最优解并记录下来,一直如此直到求出原问题的最优解

动态规划的数学模型。根据决策过程的演变是确定性的还是随机性的。可分为确定性决策过程和随机性决策过程。另外。也可按时间参量是离散的或是连续的变量。分为离散决策过程和连续决策过程。组合起来就有离散确定性.离散随机性.连续确定性.连续随机性四种决策过程模型
对于确定性的决策过程。问题中下一段的状态已由当前段的状态及决策完全确定。对于随机性决策过程。它与确定性决策过程的区别在于下一段的状态并不能由当前段的状态及决策完全确定。而是按某种概率分布来决定下一段的状态。这种概率分布是由当前段的状态和决策完全确定

动态规划原理
虽然已经用动态规划方法解决了上面两个问题,但是大家可能还跟我一样并不知道什么时候要用到动态规划。总结一下上面的斐波拉契数列和钢条切割问题,发现两个问题都涉及到了重叠子问题,和最优子结构。
①最优子结构
用动态规划求解最优化问题的第一步就是刻画最优解的结构,如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。因此,某个问题是否适合应用动态规划算法,它是否具有最优子结构性质是一个很好的线索。使用动态规划算法时,用子问题的最优解来构造原问题的最优解。因此必须考查最优解中用到的所有子问题。
②重叠子问题
在斐波拉契数列和钢条切割结构图中,可以看到大量的重叠子问题,比如说在求fib(6)的时候,fib(2)被调用了5次,在求cut(4)的时候cut(0)被调用了4次。如果使用递归算法的时候会反复的求解相同的子问题,不停的调用函数,而不是生成新的子问题。如果递归算法反复求解相同的子问题,就称为具有重叠子问题(overlapping
subproblems)性质。在动态规划算法中使用数组来保存子问题的解,这样子问题多次求解的时候可以直接查表不用调用函数递归。

动态规划的经典模型

  • 线性模型
    线性模型的是动态规划中最常用的模型,上文讲到的钢条切割问题就是经典的线性模型,这里的线性指的是状态的排布是呈线性的。
  • 区间模型
    区间模型的状态表示一般为d[i][j],表示区间[i, j]上的最优解,然后通过状态转移计算出[i+1, j]或者[i, j+1]上的最优解,逐步扩大区间的范围,最终求得[1, len]的最优解。
  • 背包模型
    有N种物品(每种物品1件)和一个容量为V的背包。放入第 i 种物品耗费的空间是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大
  • 贪心:作出当下最优选择,不考虑整体

  • 搜索与回溯(试探):从一条路往前走,能进则进,不能进则退回来,换一条路再试。
    回溯搜索是深度优先搜索(DFS)的一种,类似于树的先序遍历

  • 迭代:这一次操作的结果是下一次操作的初始值

  • 模拟:使用编程语言对真实事物或者过程进行虚拟,将汉语对事物的描述翻译为编程语言,类似于把汉语翻译为英语。

双指针:快慢指针 双向指针
数学:使用数学公式以及一些数学定理的算法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在外面要叫头哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值