蛮力法分析问题——基础篇
概论:蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。 常常直接基于问题的描述, 因此,也是最容易应用的方法。
缺点:用蛮力法设计的算法其时间性能往往也是最低的, 典型的指数时间算法一般都是通过蛮力搜索而得到的
根本原理:蛮力法所依赖的基本技术是扫描技术, 即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。依次处理所有元素是蛮力法的关键, 为了避免陷入重复试探, 应保证处理过的元素不再被处理。在基本的数据结构中,依次处理每个元素的方法是遍历。简单的说就是一一列举。
例如:集合的遍历,线性表的遍历、树的遍历、图的遍历。
虽然巧妙和高效的算法很少来自于蛮力法, 基于以下原因,蛮力法也是一种重要的算
法设计技术:
(1 ) 理论上, 蛮力法可以解决可计算领域的各种问题。
( 2) 蛮力法经常用来解决一些较小规模的问题。
(3 ) 对于一些重要的问题(例如, 排序、查找、字符串匹配) , 蛮力法可以产生一些合理
的算法, 它们具备一些实用价值,而且不受问题规模的限制。
(4 ) 蛮力法可以作为某类问题时间性能的底限,来衡量同样问题的更高效算法。
我们先从简单的案例对蛮力法进行简单的说明:
1、重复元素删除问题设计算法,在数组r[n]中删除重复的元素。
基本思路,对数组中的数进行遍历,当遇到与之前数相同的数把她归为#,当输出的时候输出非#号项。
//去除重复项
#include<stdio.h>
void f(int a[],int n)//5.1
{
int i,j,x=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
a[j]='#';
}
}
for (j=0;j<n;j++)
if(a[j]!='#')
printf("%d ",a[j]);
}
int main()
{
int a[1001];
int i=0;
int n;
printf("请输入数字个数:\n");
scanf("%d",&n);
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
f(a,n);
}
2 、荷兰国旗问题
要求重新排列一个由字符R,W,B(R代表红色,W代表白色,B代表蓝色,这都是荷兰国旗的颜色)构成的数组,使得所有的R都排在最前面,W排在其次,B排在最后。
为荷兰国旗问题设计一个算法,其时间性能是O(n)。
基本思路:对字符串中所有的元素进行遍历,要求顺序为R、W、B,遍历时如果是R在前对下一个进行比较,如果不是R,依次往下查看,把所有的R交换到开头,W、B同理。
代码如下:
//2 荷兰国旗问题
#include<stdio.h>
#include<string.h>
void swap(char &a,char &b)
{
char temp;
temp = a;
a = b;
b = temp;
}
void sort(char c[],int n)
{
for(int i=0;i<n;i++)
{
if(c[i]=='R') continue; //第i个前面已经完成排序
else if(c[i]=='B') //如果c[i]=B,就和后面最近的W换,保证B一定在W之后
{
int j=i+1;
while(j<n)
{
if(c[j]=='W') {swap(c[i],c[j]);break;}
j++;
}
}
if(c[i]=='W') //如果c[i]=W,就和后面最近的R换,后面无R则无操作
{
int j=i+1;
while(j<n)
{
if(c[j]=='R') {swap(c[i],c[j]);break;}
j++;
}
}
}
}
int main()
{
char c[10001];
scanf("%s",c);
getchar();
sort(c,strlen(c));
printf("%s",c);
}
编程小白,如有不对,可以更正。