蛮力法分析问题——基础篇

蛮力法分析问题——基础篇

概论:蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。 常常直接基于问题的描述, 因此,也是最容易应用的方法。

缺点:用蛮力法设计的算法其时间性能往往也是最低的, 典型的指数时间算法一般都是通过蛮力搜索而得到的

根本原理:蛮力法所依赖的基本技术是扫描技术, 即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。依次处理所有元素是蛮力法的关键, 为了避免陷入重复试探, 应保证处理过的元素不再被处理。在基本的数据结构中,依次处理每个元素的方法是遍历。简单的说就是一一列举。

例如:集合的遍历,线性表的遍历、树的遍历、图的遍历。

虽然巧妙和高效的算法很少来自于蛮力法, 基于以下原因,蛮力法也是一种重要的算

法设计技术:

(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);
}

编程小白,如有不对,可以更正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值