蛮力法



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

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

1)它可以解决广阔领域的各种问题

2)在规模允许时,多少可以产生一些实用的算法

3)往往可以以蛮力法为准绳,来衡量高效的算法,或者找不到其他算法时,先设计蛮力算法,再做改进

好了,很简单,直接切入正题。



3.1   选择排序和冒泡排序

 虽然很简单,也写了很多次了,复习一下,提请想一想:

1) 它们是稳定的排序方法吗吗?不稳定,稳定

2)改进:如果对列表比较一遍后发现没有交换元素的位置,那么此时列表已经有序,可以退出了



3.2  顺序查找和蛮力字符串匹配

顺序查找不用说吧

蛮力字符串匹配更不用说吧,kmp都写过了



3.3  最近点对和凸包问题的蛮力算法


由于在第四章中我们将用分治算法来解最近点对问题和凸包问题,这里主要明确一些概念吧,知道什么是最近点对,凸包问题。

最近点对就没有什么说的了,说说凸包:


2011060923491052.jpg


蛮力解凸包问题就是一条条的线段判断,若其他所有顶点都在这条线段的同一侧,则这条线段的2个端点是凸包的顶点,怎么判断是一个解析几何的数学问题,不说了。

凸包就不写了,蛮力的,没有什么技术含量,就写了个最近点对。在分治算法中再来详细分析怎样设计更加精妙的方法。蛮力法的最近点对代码:


ContractedBlock.gif ExpandedBlockStart.gif NearestPoint
 
   
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)分配问题

后面介绍匈牙利方法



总结:

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

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

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






转载于:https://www.cnblogs.com/jmzz/archive/2011/06/10/2077165.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值