算法设计与分析学习-蛮力法

来源:互联网 发布:淘宝卖的几百元智能机 编辑:程序博客网 时间:2024/06/05 02:20

参考 :  算法设计与分析   第三章  蛮力法
接下来的每章中,我们专注于一种特定的算法设计策略。

蛮力法是一种最简单和直接的解决问题的办法,往往是低效的,但我们不应该忽略它的地位,

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)分配问题

后面介绍匈牙利方法



总结:

除了一些规模较小的问题,蛮力法一般来说是不适用的,这一章也就是举了几个例子来说明这种思想而已,

一些常见的类似于智力题的东西,例如上面说到的问题,在规模较小时都可以用枚举,暴力,蛮力的方法,将一切交给计算机。另外一些典型的类似于智力问题的,比如什么整数划分,魔方填数,算术谜底什么的,都可以枚举,当然,对于这些问题,伟大的数学家和计算机科学家们都给出了更为美妙和高效的算法。这是后面要说的。

从下一章开始,介绍一些高级的算法设计技术。

0 0
原创粉丝点击