算法学习之蛮力法

算法学习之蛮力法

蛮力法的思想

蛮力法是指采用遍历技术,使用一定的策略将待求解问题的所有元素依次处理一次,其关键为依次处理所有元素,要使已处理过的元素不再被访问

蛮力法的基本

基本技术——遍历
关键——依次处理所有元素
基本的遍历对象:(1)集合(2)线性表(3)树(4)图

蛮力法的优点

  1. 逻辑清晰,编写程序简洁,容易编写
  2. 对于一些问题(排序、查找、矩阵乘法、字符串匹配),可以配合着产生一些合理算法
  3. 当遍历空间很小时,可以使用较小的代价
  4. 可以解决小规模问题(毕竟优化算法本身就有一定的复杂度,不如蛮力法来的简洁明了)
  5. 可以为其他高效算法做衡量

蛮力法的解题步骤

  1. 找出枚举范围:分析问题所涉及的各种情况
  2. 找出约束表达式:分析问题的解需要满足的条件,并应逻辑表达式表示

蛮力法的经典查找问题

顺序查找

从表的第一端向另一端逐个将元素与既定值进行对比,若相等,则查找成功,给出元素在表中位置;若无相等值,则查找失败,返回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={ a 1 , a 2 , … … , a n a_{1},a_{2},……,a_{n} a1,a2,,an}的所有 2 n 2^{n} 2n个子集和长度为n的所有 2 n 2^{n} 2n个比特串之间的意义对应关系(PS:简单的来说就是类似于数电的交并集,001={ a 3 a_{3} a3},011={ a 2 , a 3 a_{2},a_{3} a2,a3}依次类推)

注:这个代码还没写过目测可写,但是疫情期间有点懒,日后如果能记起来就写

0/1背包问题

在给定的所有的元素中选出小于容量c的最有价值的子集,本质仍然是找出所有子集,然后计算每个子集的总价值,找到价值最大的子集,但是其复杂度仍然是O( 2 n 2^{n} 2n)

任务分配问题

问题描述:假设有n个任务需要分配给n个人执行,每个人物只分配给一个人,每个人只分配一个任务,且第j个任务分配给第i个人的成本是C[i,j],要求找出总成本最小的分配方案

此方案需要考虑全排列,算出每个排列的成本,排列数量为n!,复杂度很高,除非问题规模很小,否则蛮力法基本与此无缘】

蛮力法的经典图问题

哈密顿回路

适用蛮力法寻找哈密顿回路也是寻找排列,当排列内所有元素的边都连通时即可

TSP问题

就是变相加权哈密顿回路的寻找!!!

注:蛮力法终究还是蛮力法,一般情况下,即使进行一定程度的改进后,也只能改变其时间复杂度的系数,而不是数量级。(PS:个人感觉有点虎头蛇尾,毕竟所有例子如果都要用到的话代码量会很大,所以我决定不写代码,简单的将思路写一下,毕竟后续中基本不可能用蛮力法来实现)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值