蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)

        之前参加蓝桥杯的时候一直听网上人说,这是暴力杯,之前以为的暴力杯就是穷举的思想,这下看了暴力求解的解释,发现也基本类似。

        暴力求解法就是:列出所有可能的情况,从中寻找满足题目要求的方案数。暴力就是暴力在这所有可能的情况,这个看似简单其实又难,因为有些问题:迷宫问题。如何判断是否找过了所有的情况,也是一个难点。

再比如,如果是一个全排列问题,那么暴力法的话,就是直接循环到底,列出所有可能,循环循环循环。这对时间要求很高,但是往往题目要求的时间很短,所以暴力求解法时常伴随的弊端就是:时间超限。

        对于大量重复计算导致的时间超限的问题,需要剪枝,这个可以参考斐波那契数列/爬楼梯问题等等。

        关于暴力法更多的介绍,以下粘贴书本内容。

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第1张图片

      暴力的通用手段就是搜索,DFS与BFS。

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第2张图片

 

递归和排列

搜索问题里面会涉及到一个叫做全排列的问题,全排列的解决方法一个是用STL的next_permutation函数另一个就是dfs。

用STL解决的方式在上一个笔记中已经做出详细解释,此处直接粘贴书上代码。

 

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第3张图片

第二个方法就是dfs,dfs其实也是递归的体现。

        在用dfs之前,先考虑暴力的方法来做,由于循环过多,便直接用代码来补充。重要的是明白暴力的思想。

书上的代码的大致思路:从数组的第一个数开始,一次往后填写,后面的每一个数都和前面一个数不一样,那么当第一个数是数组的第一个数即7的时候,后面第二个数可以是7后面的所有数,所以这个循环的终点是num,但是因为是数组的全排列且数组的数据都不一样,所以全排列出来的每一个数都是不一样的。也就有了if(j!=i)这个条件,后面依次写循环。总的来说,这样写很复杂,很麻烦。

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第4张图片

递归的方法来做,如何递归,递归的关系式寻找是重点。

看一下书上的推导过程。

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第5张图片

这里引用书上的代码进行实现验证。

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第6张图片蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第7张图片

        关于clock()函数,这个函数得到的时间单位是毫秒,因为我们人常用单位是秒,所以在得出的毫秒级中要除以CLOCKS_PER_SEC,这个就是一秒的时长。得到的最终单位是秒。

        我们发现这个输出数据的秒和第三行执行时间有些许不同,这是因为clock()函数所返回的时间是从,start到end这两句话之间的语句执行的时间,相对于整个代码程序来说,这只是一部分,并不包含上面声明等部分。而这个execution time则是整个代码段执行所需要的时间。

蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)_第8张图片

 

写在最后:可恶的TX,今天因为玩了CF,再打开CodeBlocks结果却出现16位不兼容的问题,这个百度上都是说卸载腾讯系列产品,比如CF   [○・`Д´・ ○]。之前用DevC++作为官方指定编译器的时候也是这种情况,卸了重装很多很多次,治标不治本。

今天发现,如果玩了腾讯游戏,想用DevC++或者CodeBlocks那么一定要重启,不然就会出现不兼容的问题。看来还是得先学习再敲代码。

 

 

 

你可能感兴趣的:(算法竞赛笔记,算法,数据结构)