蛮力法是一种简单直接地解决问题的方法(暴力求解),常常直接基于问题的描述和所涉及的概念定义。注意,这里的“力”是指计算机的计算“能力”。一般来说,蛮力策略常常是最容易应用的办法。
虽然巧妙和高效的算法很少来自于蛮力法,但我们不应该忽略它作为一种重要的算法设计策略的地位。第一,蛮力法可以解决广阔领域的各种问题。实际上,它可能是唯一一种几乎什么问题都能解决的一般性方法。第二,对于一些重要的问题(如排序、查找、字符串匹配等)来说,蛮力法可以产生一些合理的算法。第三,如果要解决的问题实例不多,而且蛮力法可以用一种能够接受的速度对实例求解,那么设计一个更高效算法所花费的代价很可能是不值得的。第四,即使效率通常很低,仍可使用蛮力法解决一些小规模的问题实例。第五,蛮力法可以作为研究或教学目的服务,如可以以之为准绳,来衡量同样问题的更高效算法(如计算最坏时间复杂度)。

设计思想

蛮力法是指采用遍历(扫描)技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。依次处理所有元素是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。
蛮力法本质是先有策略地穷举,然后验证。简单来说,就是列举问题所有可能的解,然后去看看是否满足题目要求,是一种逆向解题方式。(虽然不知道答案是什么,但知道答案肯定在这些范围里面,一个个试就完了。)
注意,即便是穷举,也要“聪明地”穷举。同样是穷举,也有不同的方法。

实例

接下来,将从实例出发,介绍蛮力法的具体应用。

选择排序

考虑蛮力法在排序问题中的应用,给定一个可排序的nnn个元素序列,将它们按照非降序方式排列。针对这个问题,存在多种解法。这里介绍下选择排序。
选择排序在开始的时候,先扫描整个列表,以找到列表中的最小元素,然后将这个元素与第一个元素进行交换。这样最小元素就放到它的最终位置上。然后,从第二个元素开始扫描,找到n-1个元素中的最小元素,然后再与第二个元素进行交换。以此类推,直到第n-1个元素(如果前n-1个元素都已在最终位置,则最后一个元素也将在最终位置上)。更多选择排序相关介绍,参考链接。

冒泡排序

除了选择排序,蛮力法在排序算法的另一个应用是冒泡排序。冒泡排序,需要比较表中的相邻元素,如果它们是逆序的话,就交换它们的位置。重复多次之后,最终,最大的元素就"冒泡"到列表的最后一个位置。第二遍操作,将第二大元素"冒泡"到最终位置。依次执行n-1次,直到前n-1个元素到达最终位置。更多冒泡排序相关介绍,参考链接。

顺序查找

蛮力法除了在排序算法中有应用,在查找算法中也有应用。这里介绍下顺序查找算法。顺序查找的查找过程为:从表中最后一个元素开始,逐个元素进行比较,如果存在相等的元素,则查找成功。如果直至第一个元素,也没有与之相等的元素,则表明没有所查找的元素,查找不成功。当使用列表来存储元素时,为避免每次循环检查是否到达了行尾,可以将查找的元素插入行尾。更多顺序查找相关介绍,参考链接。

字符串匹配

接下来介绍蛮力法在字符串匹配问题上的应用。字符串匹配问题描述如下:给定一个n个字符组成的文本,再给定一个m个字符的子串,从文本中寻找匹配模式的子串。
使用蛮力法求解的算法描述如下:将模式对准文本的前m个字符,然后从左到右匹配每一个相应的字符,直到m个字符全部匹配或者遇到不匹配的字符。在不匹配的情况下,模式向右移动一位,然后重复匹配文本上的相应字符。这里,最坏情况下,最后一轮子串匹配的起始位置是n-m(假设下标从0开始)。该算法的伪代码实现如下:

假设数组T[0...n-1]表示待查找文本
假设数组P[0...m-1]表示待匹配子串
for i=0 to i<=n-m thenfor(j=0;j<m-1;j++) thenif(T[i+j] != P[j]) then breakif(j == m-1) thenreturn true
return false

该算法的输入规模是同时依赖待查找文本长度和待匹配子串。对于该非递归算法,其基本操作是内层for循环的比较操作。其最坏情况下的执行次数是:(n-m+1)*m。所以该算法的时间复杂度是KaTeX parse error: Undefined control sequence: \* at position 4: O(n\̲*̲m)。
这里给出java版本实现:

public boolean match(char[] text, char[] pattern) {if (isEmpty(text) && isEmpty(pattern)) {return true;}if (isEmpty(text) || isEmpty(pattern)) {return false;}for (int i = 0; i <= text.length - pattern.length; i++) {for (int j = 0; j < pattern.length; j++) {if (text[i + j] - pattern[j] != 0) {break;}if (j == pattern.length - 1) {return true;}}}return false;
}private boolean isEmpty(char[] charArray) {if (charArray == null || charArray.length <= 0) {return true;}return false;
}

深度优先查找和广度优先查找

蛮力法在图论中也有应用,如图的深度优先查找和广度优先查找。深度优先查找基本思想如下:假设初始状态时图中所有顶点都未曾被访问,则深度优先遍历算法从图中某个顶点(任一顶点)出发,访问此顶点并把该顶点标记为已访问,然后依次从该顶点邻接的未被访问的顶点出发,深度优先遍历图,直至图中所有和该顶点有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。更多深度优先查找相关介绍,参考链接。
广度优先查找基本思想如下:假设初始状态时图中所有顶点都未曾被访问,则广度优先遍历算法从图中某个顶点(任一顶点)出发,访问此顶点并依次访问该顶点的各个未曾访问过的邻接点。然后,分别从这些邻接点出发依次访问他们的临邻接点,并使"先被访问的顶点的邻接点"先于"后被访问的顶点的邻接点"被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。换句话说,广度优先遍历的过程是以任一顶点开始,由近及远,依次访问和该顶点路径相通且路径长度为1,2,3,…的顶点。更多广度优先查找相关介绍,参考链接。

总结

蛮力法,通过使用问题规模的所有元素来求解问题,是一种穷举算法。如果问题的输入规模在一个可预估的范围内,蛮力法表现出实用性。但随着问题规模的增大,蛮力法在某些场景(如时间复杂度是指数级的蛮力法,如使用蛮力法求解的背包问题)下将不再适用。
蛮力法的一个应用是得到一个算法,此算法可以通过适度的努力来提升它的性能。也就是,蛮力法提供了一个性能提升的基准。

参考

《算法设计与分析基础》 第三版 Anany Levitin 著 潘彦 译
https://blog.csdn.net/weixin_42929607/article/details/108895699 蛮力法的基本问题分析
https://blog.csdn.net/Wwinky/article/details/115052584 算法小结之蛮力法

原创不易,如果本文对您有帮助,欢迎关注我,谢谢 ~_~

蛮力法(Brute Force)相关推荐

  1. JavaScript实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码)

    JavaScript实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码) bfMaximumSubarray.js完整源代码 bfMaximumSuba ...

  2. 蛮力法求解百元买百鸡问题

    蛮力法(brute force methord,也称穷举法或者枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述.所以,蛮力法也是最容易应用的方法. 蛮力法所依赖的基本技术是遍历(trav ...

  3. Brute force and exhaustive search

    Brute force and exhaustive search(蛮力和彻底搜索) Brute force is a straightforward approach to solving a pr ...

  4. DVWA学习(三)Brute Force(暴力破解)

    BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相 ...

  5. DVWA Brute Force(low)

    0x00 设置安全水平 小白刚接触DVWA,先从简单的开始 00x1 Brute Force(蛮力:爆破) 0x02 开启firefox代理 首选项 0x03 使用brupsuite爆破 输入: ad ...

  6. Unit 2: Password Cracking 2.1 Password Cracking Brute Force Attacks

    >> In a future unit, we'll learn how attackers can get possession of a database containing has ...

  7. 新手指南:DVWA-1.9全级别教程之Brute Force

    目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,且没有针对DVWA high级别的教程,因此萌发了一个撰写新手教程的想法,错误的 ...

  8. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  9. Brute Force算法介绍及C++实现

    字符串的模式匹配操作可以通过Brute Force算法来实现.字符串匹配操作即是查看S串(目标串或主串)中是否含有T串(模式串或子串),如果在主串中查找到了子串,则模式匹配成功,返回模式串中的第一个字 ...

  10. linux冒泡算法程序,用蛮力法解决冒泡排序 - linux-tao的个人空间 - OSCHINA - 中文开源技术交流社区...

    冒泡排序是蛮力法的另一个经典体现. 算法思想:比较列表中相邻的元素,如果是逆序的话,就交换他们的位置.重复多次之后,最大的元素就排到了最后一个位置.第二遍操作将第二个元素排到了倒数第二个位置上,这样一 ...

最新文章

  1. HDU5692(线段树+dfs序)
  2. Presto日志中出现大量的Triggering GC to avoid Code Cache eviction bugs
  3. spring boot微服务通用部署启动脚本
  4. 基于OpenCV实现------图像的转置
  5. p4n 今天与朋友沟通支付云服务普及以及跨境电子商务的光辉前景
  6. 【雷达通信】基于matlab SVM识别雷达数据【含Matlab源码 305期】
  7. 反脆弱性—露天广场与办公楼
  8. php screw.so,php screw加密
  9. php 月初时间,php 月初,月末时间大统计
  10. 路由器连接上但上不了网如何操作
  11. ElasticSearch基础学习
  12. 春节微信刷屏的拜年兔,幕后是卑职献祭掉的头发
  13. 2022年安全员-B证操作证考试题库及答案
  14. Debug Hacks中文版——深入调试的技术和工具
  15. 首期InnoSpace国际创业集训营举办DemoDay
  16. GK 1424 L劳易测标签识别开关
  17. 12月编程语言排行榜,java跌至低点,低代码发展迅猛
  18. 本地数据库同步到云主机上
  19. linux 启动脚本rcs解析
  20. JavaScript核心知识第二章---事件高级(含大量代码分析)

热门文章

  1. linux驱动开发之内核线程
  2. 加密网站地址——从根本解决盗连
  3. css去掉ie浏览器输入框后面的小叉叉,和密码框后面的小眼睛
  4. 简介IntelliJ IDEAD
  5. 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了
  6. redis分布式方案redis cluster的介绍和实践
  7. Arista发布容器化、开放EOS版本
  8. qt结合vs,opengl基础示例
  9. 2022-01-10:路径交叉。给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南
  10. C4D 入门笔记(一)