前言2019-10-10

数据结构:数组和字符串是两种最基本的数据结构,链表是面试中使用频率最高的一种数据结构,树的难度比较大;栈与递归调用密切相关,队列在图的宽度优先遍历中需要用到。

算法:查找和排序是常用的算法,特别是二分查找、快速排序、归并排序;回溯法很适合解决迷宫及其类似的问题,求一个问题的最优解,可以使用动态规划,动态规划解决问题时,如果每一步都存在一个最优解,可以使用贪婪算法;

位运算:位运算是把数字用二进制表示;只有:‘与&’、‘或|’、‘异或^’、‘左移<<’、‘右移>>’,五种运算。异或是相同为0,不同为1;左移的时候,右边空位补零;右移的时候,根据符号位左边空位是0就补零,是1就全部补一。

按照算法基本思想,大致可分为如下几类:分治算法、贪心算法、动态规划、回溯法、分支限界、概率算法和随机算法等等。

1.分治算法:(分解,求解,合并)分治即分而治之。一个问题规模过大不容易直接解决,就可以划分成许多小问题,如果小问题不容易求解,那么可以再划分成规模更小的问题,直到规模小到很容易解决为止,解决这些小问题,再将小问题的解合并成大问题的解。这就是分治算法的基本思想。至于小问题的规模到底划分多大,这是没有规定的,依实际情况而定。小问题的规模可以是相等的,也可以是不相等的。可以分成简单的2个小问题,当然也可以分成多个小问题。分治算法常用的实现方法是递归。因为分治就是将大问题不断划分成小问题,递归的解决小问题,再合并小问题的解就可以得到问题的解。

经典问题:(1)二分搜索、(2)大整数乘法、(3)Strassen矩阵乘法、(4)棋盘覆盖、(5)合并排序、(6)快速排序、(7)线性时间选择、(8)最接近点对问题、(9)循环赛日程表,汉诺塔问题、全排列问题

2.动态规划:分治算法将规模较大的问题划分成规模较小的子问题,通常,这些子问题是不重叠的。区别在于划分的子问题是有重叠的,这样在求解的过程中,对于重叠的部分只要求解一次,记录下结果(备忘录方法),其他子问题中直接使用即可,减少了重复计算,效率更高。所谓动态规划,其动态就表现在求解一个问题最优解时,不是固定的计算、合并某些子问题的解,而是根据各子问题的解的情况,选择其中最优的。一个问题如果需要用动态规划算法求解,它需要具有如下两个性质(要素):

最优子结构性质

子问题重叠性质

动态规划的步骤:

a.描述最优解的结构

b.递归定义最优解的值

c.按自底向上的方式计算最优解的值

d.由最优解的值构造一个最优解

经典问题:(1)装配线调度(2)矩阵连乘(3)最长公共子序列(4)背包问题(5)多边形游戏(6)最优三角剖分(7)最优排序二叉树(8)最优合并问题

3.贪心算法

贪心(每一步选择都是眼下的局部最优选择)

贪心算法的每次选择就是只看当前的利益,不管当前的选择对后面选择的影响,所以如果当前的选择对之后的选择有影响时,这种选择就不一定最优了。动态规划就是三思而后行,在考虑当前选择能产生的各种结果中选择一个最优的,想得多速度也就慢了。

经典问题:(1)背包问题(物体可切分时的0-1背包问题)(2)Huffman编码(3)单源最短路径(4)Prim算法(5)Kruskal算法(6)最优三角剖分

4.回溯算法

回溯法思路的简单描述:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。

详细的描述则为: 回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。

回溯法应用:当问题是要求满足某种性质(约束条件)的所有解或最优解时,往往使用回溯法。它有“通用解题法”之美誉。

经典问题:(1)装载问题(2)0-1背包问题(3)旅行售货员问题(4)八皇后问题(5)迷宫问题(6)图的m着色问题

5.分支界限法

回溯法的思想是深度优先搜索加剪枝,与之相对,分支限界法的思想是广度优先搜索加剪枝

分支限界法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用广度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。

基本思想类同于:图的广度优先遍历、二叉树的层序遍历,也就是:对于当前节点,一次性扩展其所有可行的子节点。

详细的描述则为:

1) 首先将问题的解空间转化成图或者树的结构表示,然后维护一张活节点表。

2) 初始时,将根节点加入活节点表

3) 当活节点表不空,从活节点表中取出一个节点,成为当前扩展节点。如果表为空,跳转至步骤6结束。

4) 判断当前扩展节点是否得到了一个可行解或更优解,如果是,记录或更新问题的解。

5)将当前扩展节点的所有可行子节点一次性全部生成,加入到活节点表中。跳转到步骤3

6)算法结束

经典问题:(1)装载问题(2)0-1背包问题(3)旅行售货员问题(4)八皇后问题(5)迷宫问题(6)图的m着色问题

6.随机算法

数值概率算法: 用于数值问题的求解,通常是近似解

蒙特卡洛算法Monte Carlo:能得到问题的一个解,但不一定是正确解,正确的概率依赖于算法运行的时间,算法所用的时间越多,正确的概率也越高。求问题的准确解;

拉斯维加斯算法 Las Vegas:不断调用随机算法求解,直到求得正确解或调用次数达到某个阈值。所以,如果能得到解,一定是正确解。

舍伍德算法 Sherwood:利用随机算法改造已有算法,使得算法的性能尽量与输入数据无关,即平滑算法的性能。它总能求得问题的一个解,且求得的解总是正确的。

你可能感兴趣的:(前言2019-10-10)