北航算法复习笔记

#算法复习笔记

一 决策和策略

决策是指某阶段状态给定以后,从该状态演变到下一状态某状态的选择;
由每阶段的决策组成的决策函数序列就称为全过程策略,建成策略

二 回溯法使用深度优先(dfs)搜索状态空间树

三 快速排序

基本思想:通过一趟排序将数据分割成独立的两部分,一部分的数据比另一部分的所有数据都小,然后递归知道整个数据为有序数据。

标准(常用)快速排序

基本思路:取第一个为基准数,然后定义两个哨兵分别为该数组第一个和最后一个,暂且定为i和j,首先j找从末尾寻找第一个比基准数小的数,然后j停下来,i从开头寻找第一个比基准数大的数,然后i停下来,如果i和j不相遇则交换i和j所指向的数,然后如果相遇,则将相遇所在的位置和基准数(也就是第一个数)交换,然后此时第一轮就结束了,该数组就会被分为两部分,然后继续递归该过程。
复杂度分析:

最优情况下:每一次的基准数恰好将整个数组平分,此时时间复杂度公示为T(n)=2T(n/2)+n;T(n/2)为平分后的子数组的时间复杂度,n为第一次比较的次数。这个递推公式的时间复杂度为nlogn。计算请参考链接https://blog.csdn.net/w36680130/article/details/81535128
最坏情况下:整个数组正好是倒序,这样就和冒泡排序一样了,时间复杂度正好为n^2
平均情况下:nlogn

随机化快速排序

相比较于标准快速排序,随机化就是每次的基准数都是在数组中随机选取,而不是固定选取第一个元素了,这样能尽可能的避免最坏情况的发生,但是其平局复杂度从长期望上来看仍然是nlogn。

np问题

p:能在多项式时间内解决的问题
np:能在多项式时间内对一个解进行验证的问题
npc:一类np问题的集合
若p2可以转化为p1,那么p1至少和p2一样难,即你会解二元一次方程就会解一元一次方程组
npc问题至少比np问题一样难,因为np问题都可以转化为npc问题。


北航算法复习笔记_第1张图片
3397473-b215c8c8dfe159f0.jpg.png

寻找最大值最小值

对于一个数组寻找最大值或最小值的时间复杂度为n,如果一下子求的话就是2n,最少的次数是3*(n/2),就是先将一对元素进行比较,把较大值和最大值比较,较小值和最小值比较,所以每两个数需要比较三次。

随机算法

Las Vegas算法:
* 采样越多,越有机会找到最优解
* 尽量找最好的,但不保证能找到
* e.g. 100把钥匙,每次找一把,找对的
* 要求必须给出最优解,对采样没有限制
Monto Carlo算法:
* 采样越多,越近似最优解
* 尽量找最好的,但不保证最好
* e.g.100个苹果,每次拿一个,找最大的
* 要求在有限采样内,必须给出一个解,但不是最优解

近似算法

基本概念:很多实际应用问题都是npc问题,这类问题不存在多项式时间算法。一般有以下三种处理方式:
* 如果问题的输入规模较小,可以利用搜索策略在指数时间内解决问题。
* 输入问题较大,既可以考虑用随机算法在多项式时间内“高概率”的精确求解问题
* 也可以考虑在多项式时间内求的问题的一个近似解
性能分析:
* 时间复杂度和空间复杂度:见 精确复杂度
* 近似精度:
* 近似比:设A是一个优化问题的近似算法,A具有近似比(ratio bound) p(n), 如果max{C_C_, CC} ≤ p(n)。其中n是输入大小,C是A产生的解的代价,C是优化解的代价。
* 相对误差:对于任意输入,近似算法的相对误差定义为|C - C
|/C,其中C是近似解的代价,C是优化解的代价。
* 相对误差界:一个近似算法的相对误差界为ε(n),如果|C-C|/C ≤ ε(n)。

减治策略

* 减去一个常量:
* 减去一个常量因子
* 减去的规模是可变的

1如果能不断的解决n-1规模的问题就能解决n规模的问题


北航算法复习笔记_第2张图片
2011061720235776.jpg

既可以递归的从上到下求解,也能非递归的从下往上构造
2一般来说减去的一个常数因子是2(即将原问题规模分为2),其实减常因子的减治法可以看做是分治的变种,只不过它只对划分子规模后的一个部分求解。


北航算法复习笔记_第3张图片
2011061720284663.jpg

3对于减可变规模的例子,那就更少了,因为效率越高的算法显然越难找到。
一个例子是欧几里得算法,前面也写过了:


2011061720302651.jpg

减去一个常量

* 插入排序、折半插入排序 时间复杂度都是n^2
* 拓扑排序 时间复杂度是 V+E

减去一个常量因子

* 折半查找是logn
* 计算两个整数的乘积(其实叫分治更好)

减去的规模是可变的

    * 欧几里得算法
    * 寻找数组第k大的数,类似于快速排序
    * **二叉查找树 logn
            * 若二叉树是平衡的,即高度为logn+1,则复杂度为logn
            * 若数据是有序的,二叉树的深度最大化为n,退化为顺序查找,时间复杂度为n

你可能感兴趣的:(北航算法复习笔记)