一夜搞完算法设计与分析

第一章 算法概述

算法

定义:算法是问题求解的有效策略,是解某一特定问题的一组有穷规则的集合
特性

  • 确定性:算法的每种运算必须要有确切的定义,不能有二义性
  • 可行性:算法中有待实现的运算都是基本的运算,原理上每种运算都能由人用纸和笔在有限的时间内完成
  • 输入:每个算法有0个或多个输入,这些输入是在算法开始之前给出的量,取自特定的对象集合
  • 输出:一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量
  • 有限性:一个算法总是在执行了有穷步的运算之后终止

理解算法和计算过程的区别算法可以终止的计算过程,不能终止的计算过程:操作系统

设计算法→表示算法→确认算法→分析算法→测试程序

算法复杂性分析

算法运行所需要的计算机资源的量

时间复杂度:需要时间资源的量
空间复杂度:需要空间资源的量

基本操作:算法中的某个初等操作,如果它的最高执行频率和所有其他初等的最高执行频率相差在一个常数因子之内,就说这个初等操作是一个基本操作
这个老师上课强调了很多次,估计要出简答在这里插入图片描述

第二章 递归与分治策略

递归

**递归的定义:**若一个对象部分地包含他自己,或用他自己给自己定影,则称这个对象是递归的;若一个过程直接或间接地调用自己,则称这个过程是递归的过程
递归的两种方式

  • 直接递归:自己调用自己
  • 简介递归:A调用B,B调用A

递归模型:由递归边界和递归体组成,前者确定递归到何时结束,后者确定递归求解时的递推关系
在这里插入图片描述
递归算法的特点:

  • 递归过程一般通过函数或子过程来实现,也就是说我们要先定义子函数或者子过程
  • 问题规模逐渐缩小,把问题转化成规模缩小的同类问题的子问题。然后递归求解
  • 相邻两次重复之间有紧密的联系,前一次的输出作为后一次的输入
  • 是否收敛,即终止条件。当问题的规模小到一定程度,应该给出答案,而不是接着递归

递归算法执行过程的总结:

  • 递归算法的执行过程时不断自调用的,直到到达递归出口再结束自调用过程
  • 到达递归出口后,递归算法开始按照最后调用最先返回的次序返回
  • 返回到最外层的调用语句时递归算法执行过程结束

分治策略

基本思想:划分为若干个子问题,分别求解,然后合并解

适用条件

  • 原问题缩小到一定程度之后可以容易解决
  • 原问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
  • 子问题的解可以合并为原问题的解
  • 分解出来的子问题相互独立

算法的时间复杂度表

算法 时间复杂度
二分搜索法 O(log2n)
合并排序法 O(n logn)
快速排序 O(n log2n)

合并排序的过程 用一张图来解释
在这里插入图片描述

快速排序的过程
参考博客快速排序(过程图解)

第三章 动态规划

动态规划是解决某类问题的一种方法,是考察问题得一种途径,而不是一种算法
动态决策问题的特点::系统所处的状态和时刻时进行决策的重要因素

在这里插入图片描述
利用多段式求解,求解过程参照ppt

动态规划算法的基本要素:
1、最优子结构

  • 问题的最优解包含着其子问题的最优解,这种性质称为最优子结构性质
  • 分析问题的最优子结构性质时:所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优解,然后再设法说明在这个假设下可构造除比原问题最优解更好的解,从而导致矛盾
  • 利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提
    2、重叠子问题
  • 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性值
  • 动态规划算法对每个子问题只解一次,而后将其解保存在一个表格当中,当再次需要解此问题时,只是简单地用常数时间查看一下结果

0/1背包问题
在这里插入图片描述
最长公共子序列问题
注意:最长公共子序列的下标只满足递增即可,不一定连续
在这里插入图片描述

算法类型 解决的问题
分治法 快速幂算法、棋盘覆盖算法、合并排序算法、快速排序算法、线性时间选择、循环赛日程表
动态规划 最长公共子序列、0-1背包问题、
贪心算法 最优装载、哈夫曼编码、单源最短路径、最小生成树、多机调度问题
回溯法 n皇后问题、0-1背包问题、图的m着色问题、旅行售货员问题
分支限界法 装载问题、0-1背包问题、老百姓售货员问题

猜你喜欢

转载自blog.csdn.net/weixin_43716048/article/details/112291531