【3】算法基础:蛮力法

蛮力法常用的方案:搜索所有的解空间,搜索所有路径,直接计算,模拟和仿真,使用时可以添加一些技巧。

 

示例1:求所有的三位数,它除以11所得的余数等于它的三位数字的平方和

技巧:除以11的余数(除了0)只有10种可能,三个数平方和小于等于10的必定都小于等于3

 

示例2:字符串匹配

以文本中的每一个字符为开始字符,用模式串去匹配,直到文本结束

 

示例3:最近对问题

求出每两个点之间的距离,选出最小的

 

示例4:凸包问题

凸集合:对于平面上的一个点集合,如果以集合中任意两点P和Q为端点的线段都属于该集合,则这个集合是凸的

凸包:一个点集合S的凸包是包含S的最小凸集合(如果S是凸的,它的凸包是它本身)

凸包定理:任意包含多于两个不共线点的集合S的凸包肯定是以S中某些点位顶点的凸多边形

凸包问题:为一个包含n个点的集合构造凸包的问题

极点:凸包的顶点

如何找到极点以及他们的连接顺序?

遍历所有的点对,如果其他点都在这两点构成线段的一边,他们又是所有符合条件的线段的端点,则这两点是极点

提示:座标平面上穿过(x1,y1)(x2,y2)两点的直线:(y2-y1)x+(x1-x2)y-x1y2+y1x2=0

拓展:线性规划问题(最优解一定出现在凸包的某个极点上,转换为求凸包极点的问题。)

 

示例5:旅行商问题TSP

有一个旅行商从城市1出发,需要到城市2,3……n去推销,最后返回城市1,若任意两个城市之间的距离已知,求该旅行商的最佳行走路线。

TSP本质上是最小哈密顿回路:对图的每一个点经过一次最后回到原点的路径

将哈密顿回路定义为n+1个相邻顶点vi0,vi1,……vin-1,vi0的一个序列,中间n-1个顶点不相同,假设所有贿赂都开始和结束于相同的特定顶点,通过生成n-1个中间城市的组合来得到所有的旅行路线,计算这些路线的长度,然后求得最短路径。

拓展:

经过的最长距离最短

总行程与总收益的比最小

多个旅行商使得所有城市至少被访问一次,所有人的总路程最小

(回溯法,分支界限法)

 

示例6:揹包问题

给定n个重量为w1,w1,……wn,价值为v1,v2……vn的物品,一个承重为W的揹包,求这些物品中能够装到揹包中的一个最有价值的子集。

找到给定的n个物品集合的所有子集,计算每个子集的总重量,然后找到其中价值最大的子集。

拓展:

完全揹包:每一件物品不限件数

多重揹包:每一个物品对应有一个确定的件数

(回溯法,分支界限法)

 

示例7:分配问题

将n个任务分配给n个人执行,每个人只执行一个任务,每个任务只能给一个人执行,将第j个任务给第i个人执行的成本是C[i,j],求总成本最小的分配方案。

用成本矩阵C表示,问题要求在矩阵的每一行中选出一个元素,他们属于不同的列,且元素的和是最小的。

用一个n维元组来描述分配问题的一个可能的解,第i个分量表示在第i行中选择的列号,生成1,2……n的所有排列,然后把成本矩阵中相应元素相加求得每种分配方案的总成本,最后选出具有最小和的方案。

(匈牙利算法:构造成本矩阵,每行,每列减去最小值)

 

点赞