8.1 算法设计与分析的基本概念
8.1.1 算法
5个重要特性:
(1)有穷性
(2)确定性
(3)可行性
(4)输入
(5)输出
8.1.2 算法设计
算法设计是困难的,也是灵活充满智慧的过程,需要根据实际情况具体问题具体分析。
8.1.3 算法分析
指的是对一个算法所需要的资源进行估算,包括内存、通信宽带、计算机硬件和和时间等,所需要的资源越多,算法复杂度越多。
8.1.4 算法的表示
(1)自然语言
(2)流程图
(3)程序设计语言
(4)伪代码
8.2 算法分析与基础
8.2.1 时间复杂度
(1)最佳情况
(2)最坏情况
(3)平均情况
8.2.2 渐进符号
8.2.3 递归式
(1)展开法
(2)代换法
(3)递归树法
(4)主方法
8.3 分治法 ❤❤❤
8.3.1 递归的概念
两个要素:
(1)边界条件:确定递归到何时终止
(2)递归模式:大问题如何分解为小问题,也称为递归体。
8.3.2 分治法的基本思想
(1)分解
(2)求解
(3)合并
把一个问题拆分成多个小规模的相同子问题,一般可用递归解决。
8.3.3 分治法的经典案例
斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔、最大子和段问题、快速排序(一分为二)
8.4 动态规划 ❤❤❤
8.4.1 动态规划的基本思想
将待求解问题分解成若干个子问题,求解子问题,然后从子问题的解得到原问题的解。
(1)最优子结构
(2)重叠子问题
特征:划分子问题,并把子问题结果使用数组存储,利用查询子问题结果构造最终问题结果。(一般自顶向下时间复杂度为 O(2n),自底向上时间复杂度为 O(n
a)效率更高
8.4.2 动态规划的典型案例
0-1背包,斐波那契数列、矩阵乘法、背包问题、 LCS、最长公共子序列、
8.5 贪心法 ❤❤❤
8.5.1 贪心法的基本思想
不求最优解,以当前情况为基础做最优选,不考虑真题,不回溯。
特征:局部最优,但整体不见得最优。每步有明确的,既定的策略。
8.5.2 贪心算法的典型实例
背包问题(如装箱)、多机调度、找零钱问题,邻分背包问题、霍夫曼编码
8.6 回溯法 ❤❤❤
8.6.1 回溯法的基本框架
系统的搜索解法,一条路走,能进则进,不能则退,换条路再试,一般用到递归和堆栈。
特征:系统的搜索一个问题的所有解或任一解。
8.6.1 回溯法的典型实例
N 皇后问题、迷宫、背包问题
8.7 分支限界法 ❤
类似于回溯法,以广度优先方式搜索解空间树。
8.8 概率算法
加上随机性
8.9 近似算法
放弃最优解,用近似最优解代替。
8.10 数据挖掘算法
利用机器学习方法对多种数据进行分析和挖掘。核心是算法,主要功能是分类、回归、关联规则和类聚等。
8.11 智能优化算法
(1)人工神经网络
(2)遗传算法
(3)模拟退火算法
(4)经济搜索算法
(5)蚁群算法
(6)粒子群优化算法
❤❤❤补充
各类排序算法对比:
区别:分批次进行区分,熟悉各类时间复杂度和稳定性。若待排序列的记录数目 n 较小,可采用直接插入排序和简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量大时,用简单选择排序方法较好。
若待排记录按关键字基本有序,宜采用直接插入排序或冒泡排序。
当 n 很大且关键字位数较少时,采用基数排序较好。
若 n 很大,则应采用时间复杂度为 O(nlog2n)的排序方法,例如快速排序、堆排序或归并排序:
(1)快速排序目前被认为是内部排序中最好的方法,当待排序的关键字为随机分布时,快速排序的平均运行时间最短;
(2)堆排序只需要一个辅助空间,并且不会出现在快速排序中可能出现的最快情况。
(3)快速排序和堆排序都是不稳定的排序方法,若要求排序稳定,可选择归并排序