算法学习之蛮力法
文章目录
蛮力法的思想
蛮力法是指采用遍历技术,使用一定的策略将待求解问题的所有元素依次处理一次,其关键为依次处理所有元素,要使已处理过的元素不再被访问
蛮力法的基本
基本技术——遍历
关键——依次处理所有元素
基本的遍历对象:(1)集合(2)线性表(3)树(4)图
蛮力法的优点
- 逻辑清晰,编写程序简洁,容易编写
- 对于一些问题(排序、查找、矩阵乘法、字符串匹配),可以配合着产生一些合理算法
- 当遍历空间很小时,可以使用较小的代价
- 可以解决小规模问题(毕竟优化算法本身就有一定的复杂度,不如蛮力法来的简洁明了)
- 可以为其他高效算法做衡量
蛮力法的解题步骤
- 找出枚举范围:分析问题所涉及的各种情况
- 找出约束表达式:分析问题的解需要满足的条件,并应逻辑表达式表示
蛮力法的经典查找问题
顺序查找
从表的第一端向另一端逐个将元素与既定值进行对比,若相等,则查找成功,给出元素在表中位置;若无相等值,则查找失败,返回NULL;
PS:我觉得这个东西就是循环遍历外加一个跳出判断,就不放代码了
改进的顺序查找
对于顺序查找有两个结束条件:(1)跳出条件,即满足条件时立刻跳出循环(2)结束条件,即查找超出既定范围后结束循环
对此每次循环会产生两次比较,对此可作出改进,将范围边界设为跳出条件时,可以减少一个判断条件
//1、普通的顺序查找
int SeqSearch1(int r[], int n, int k)
{
i=n;
while(i>0&&r[i]!=k)
{
i--;
}
return i;
}
//2、改进的顺序查找
int SeqSearch1(int r[], int n, int k)
{
r[0]=k;
i=n;
while(r[i]!=k)
{
i--;
}
return i;
}
串匹配问题
也称模式匹配,即在主串S中查找子串T
需要注意的是(1)此算法的依次执行时间不容忽视:当问题规模n很大时,常常需要在大量的信息中进行匹配(2)算法改进所取得的积累效益不容忽视:串匹配操作经常被调用,执行频率是极其高的
注:串匹配的匹配算法为BF算法,以及略有些难以理解的KMP算法,再次不在多做描述,可以参考网上的解释博客(PS:疫情期间,很是颓废)
蛮力法的经典排序问题
(1)选择排序 (2)冒泡排序
注:这个也是最基础的两个排序问题,在此也不再过多描述(PS:我觉得这个大家应该都会)
蛮力法的经典组合问题
生成排列对象
假设已经生成了所有的(n-1)!个排列,可以把n插入到n-1个元素的每一种排列中去,来得到问题规模为n的所有排列(PS:在此之前我从未接触过这个问题,细想之后发现不知如何通过书上的三重循环来实现全排列尝试,因此转载此篇文章以供参考:排列算法c++实现)
生成子集
n个元素的集合A&