蛮力法学习报告
1,什么是蛮力法?
蛮力法,又称枚举法,是基础的算法之一。这是一种算法思想,顾名思义,就是将问题的可能结果全部都列举出来,再根据列举的结果根据问题的约束条件选择出问题的解。
所依赖的技术最主要的是遍历,重复步骤。往往用这种算法去求解问题,时间复杂度会很大。但是确是最简单,直白容易想到的解法。
思想还是得用实例来体现的,不然会感觉这个思想的东西只是思想,我们不会用的话,感觉这些思想没什么用,所以要用起来。选择排序是蛮力法的一个例子,我们应该抓住的是如何将这种思想应用起来,这才是关键。
2,蛮力法的优点和缺点
优点:容易实现,简单直观
缺点:时间复杂度高,不算最优
3,算法举例——荷兰国旗问题
问题描述
要求重新排列一个由字符R、W和B(R红、W白、B蓝)构成的数组,使得所有的R都排在最前面,W排在其次,B排在最后。
代码实现
#include <iostream>
using namespace std;
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[]={"RWWBWBRBRRWBRBW"};
sort(c,sizeof(c));
cout<<c;
}
运行结果
RRRRRWWWWWBBBBB
4,总结
当遇到计算量较小且较简单的问题的时候,蛮力法可以是最优选择,因为它足够简单,但是计算量较大时,蛮力法不太实用。当我们决定是否用蛮力法时,要根据题目的难易程度以及算法复杂度适当的变通。