蛮力法
参考 : 算法设计与分析 第三章 蛮力法
接下来的每章中,我们专注于一种特定的算法设计策略。
蛮力法是一种最简单和直接的解决问题的办法,往往是低效的,但我们不应该忽略它的地位,
1)它可以解决广阔领域的各种问题
2)在规模允许时,多少可以产生一些实用的算法
3)往往可以以蛮力法为准绳,来衡量高效的算法,或者找不到其他算法时,先设计蛮力算法,再做改进
好了,很简单,直接切入正题。
3.1 选择排序和冒泡排序
虽然很简单,也写了很多次了,复习一下,提请想一想:
1) 它们是稳定的排序方法吗吗?不稳定,稳定
2)改进:如果对列表比较一遍后发现没有交换元素的位置,那么此时列表已经有序,可以退出了
3.2 顺序查找和蛮力字符串匹配
顺序查找不用说吧
蛮力字符串匹配更不用说吧,kmp都写过了
3.3 最近点对和凸包问题的蛮力算法
由于在第四章中我们将用分治算法来解最近点对问题和凸包问题,这里主要明确一些概念吧,知道什么是最近点对,凸包问题。
最近点对就没有什么说的了,说说凸包:
蛮力解凸包问题就是一条条的线段判断,若其他所有顶点都在这条线段的同一侧,则这条线段的2个端点是凸包的顶点,怎么判断是一个解析几何的数学问题,不说了。
凸包就不写了,蛮力的,没有什么技术含量,就写了个最近点对。在分治算法中再来详细分析怎样设计更加精妙的方法。蛮力法的最近点对代码:
package Section3;
/*第三章蛮力法 3.3 最近点对(蛮力)*/
public class NearestPoint {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Point[] p = new Point[6];
p[0] = new Point(1,5);
p[1] = new Point(3,70);
p[2] = new Point(2,3);
p[3] = new Point(4,9);
p[4] = new Point(1,2);
p[5] = new Point(3,69);
System.out.println("最近点对是: ");
System.out.print("(" + NearestPoint(p)[0].x + "," + NearestPoint(p)[0].y + ")" + " ");
System.out.print("(" + NearestPoint(p)[1].x + "," + NearestPoint(p)[1].y + ")" + " ");
}
public static Point[] NearestPoint(Point[] p){
Point[] NearestPoints = new Point[2];//存放距离最短的两个点
int min = 999999999;
for(int i = 0;i < p.length-1;i++)
for(int j = i + 1;j < p.length;j++)
{
//距离 = (x1-x2)^2 + (y1-y2)^2
int d = (p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y);
if(d < min)
{
min = d;
NearestPoints[0] = p[i];
NearestPoints[1] = p[j];
}
}
return NearestPoints;
}
//点坐标
private static class Point{
public int x;
public int y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
}
}
几道习题的思考:
1)对实线上n个点的x1,x2,.....xn的最近点对问题,能设计一个比蛮力好的算发吗? 排序后来解决,时间复杂度nlogn
3.4 穷举查找
举几个例子,在后面都将用其他算法技术来解决,这里不去实现
1)旅行商问题:在图中找到一条哈米尔顿路(每个顶点只经过一次),使其代价最小
枚举所有路径,比较
2)背包问题
著名的计算机问题,有一篇博文背包九讲,后面再说
3)分配问题
后面介绍匈牙利方法
总结:
除了一些规模较小的问题,蛮力法一般来说是不适用的,这一章也就是举了几个例子来说明这种思想而已,
一些常见的类似于智力题的东西,例如上面说到的问题,在规模较小时都可以用枚举,暴力,蛮力的方法,将一切交给计算机。另外一些典型的类似于智力问题的,比如什么整数划分,魔方填数,算术谜底什么的,都可以枚举,当然,对于这些问题,伟大的数学家和计算机科学家们都给出了更为美妙和高效的算法。这是后面要说的。
从下一章开始,介绍一些高级的算法设计技术。