痛定思痛,开启算法之路(八)

第十章 算法能力的极限

痛定思痛,开启算法之路(八)_第1张图片
这里写图片描述
痛定思痛,开启算法之路(八)_第2张图片
这里写图片描述
痛定思痛,开启算法之路(八)_第3张图片

10.4 数值算法的挑战

痛定思痛,开启算法之路(八)_第4张图片
这里写图片描述

计算相对误差时,若有x2等于0,则其比值为1,肯定是不行的,所以可以采取如下转换来避免出现减法取消的危险:
痛定思痛,开启算法之路(八)_第5张图片
痛定思痛,开启算法之路(八)_第6张图片
痛定思痛,开启算法之路(八)_第7张图片
痛定思痛,开启算法之路(八)_第8张图片

第十章主要是一些概念的讲解,在此不再赘述;

第十一章 超越算法能力的极限

11.1 回溯

11.1.1 n皇后问题

把n个皇后放在n*n的二维格子上的放法,且满足不同行、不同列和不同相邻对角线:n=1时就只有一种;
而当n=2、3时,是没有满足条件的放法的;所以n=4开始,事例如下:

痛定思痛,开启算法之路(八)_第9张图片

首先第一个放于第一行第一列为状态1;此时第二个只能放于第3列即状态2,而当放第3个的时候是没有满足条件的方法的,所以向上回溯到状态1,将第2个元素放于第4列再次往下放,放不通的时候即向上回溯再次试探另一种方法;

11.2 哈密顿回路问题

从起点开始,经过图的每一个顶点仅且一次最终回到起点的回路:
思想同上,从直连点开始一次出发相连,直到无解时,一层层向上回溯再次探索:

痛定思痛,开启算法之路(八)_第10张图片

11.1.3 子集的和问题

求给定集合的子集所组成的加和等于一个给定正整数的子集序列,如求集合S={3,5,6,7}的子集其和为d=15的子集序列过程如下:

痛定思痛,开启算法之路(八)_第11张图片
痛定思痛,开启算法之路(八)_第12张图片

11.2 分支界限

痛定思痛,开启算法之路(八)_第13张图片

11.2.1 分配问题

    看到这个问题还是很亲切的哈哈,记得当时这是一个面试题,时间紧迫当时也没做完(需要面试的人接踵而至),
    面试完之后面试官还让我回家继续做做完了发给他,当时一阵恶补最后把代码发给了他,最后还拿到了offer哈哈(不过我没有去);
    今天到了这里再次好好学习一下:n个人分配n个不同的任务,每个人完成每个任务的时间是不同的,问如何分配使完成总任务时间最短,具体事例如下:

痛定思痛,开启算法之路(八)_第14张图片

1)利用穷举回溯法:
总体思路还是很简单的,利用如上二维数组c[i][j]表示第i个人分配第j个任务,用x[j]标记第j个任务是否已分配,用cost记录对角线分配时所用成本作为一步优化措施(即当分配过程中已有分配已经大于对角线分配时直接结束此次分配)

痛定思痛,开启算法之路(八)_第15张图片

2)利用最佳有限分支边界法

痛定思痛,开启算法之路(八)_第16张图片

这个问题理解执行起来还是比较简单易懂的:首先构造状态空间树,其树根为其总任务的成本下界(不考虑实际问题的情况下,下界为每人完成每个任务的最低成本和此处即为:2+3+1+4=10),以此为树根第一层为第一个人可以选择的任务情况,其各成本如上图选择成本最小的分支继续往下去;如此往下反复循环。

11.2.2 背包问题

此处背包问题考虑到了性价比(总价值/总重量),按性价比倒序排列,以性价比高的为首要考虑对象,
并综合各种约束条件及总和构造状态空间树;此处用到了一个上界值ub用于接下去优先处理的分支以及最后的最优解判断:

这里写图片描述
痛定思痛,开启算法之路(八)_第17张图片
痛定思痛,开启算法之路(八)_第18张图片

你可能感兴趣的:(algorithm)