暴力穷举和回溯法(八皇后问题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暴力穷举和回溯法(八皇后问题)相关的知识,希望对你有一定的参考价值。

参考技术A

以前每次遇到算法问题都是直接暴力求解,一直以为自己用的是暴力穷举法,现在学了回溯法,发现部分问题其实使用的是回溯法,而不是单纯的暴力穷举。

例如求解一个n皇后问题:

1.使用暴力穷举,由于没有两个皇后能够放在一列上,那么解向量一定是数1,2,····,n的一个排列(第一行n种放法,第二行n-1种,以此类推)。时间复杂度O(n!).

为什么是一维而不是两维?因为没有两个皇后能在同一列,所以只用行标志就可以表示出皇后的位置,简化了问题

2.回溯法,就等于是一个一个的试,从1到n,时间复杂度O(n^n),每一行n种放法,总共n行。

看起来回溯法要比暴力穷举差很多,但是实际上回溯法很多时候实际算法复杂度并没有暴力穷举高。比如4皇后问题中,仅需要341个可能节点中的27个节点就可以找到解,但是暴力穷举实际会慢很多。

换一个思路,比如第一个皇后放在了0位置,暴力穷举第二个皇后放在1位置,那么之后的皇后无论怎么放都是错误的,也就是(n-2)!个向量全部都是错误的,而回溯法面对这种问题,会在之前就直接抛弃这种情况,速度会快很多。不要问为什么暴力穷举为什么不学回溯法那样提前抛弃,因为它是 暴力穷举 (这还算优化过一次,不然直接O(n^n))。

总而言之,回溯法并不需要得到所有情况,而且运行过程中会提前抛弃不合要求的情况,所以算法复杂度一般不会到最差的情况。

以上是关于暴力穷举和回溯法(八皇后问题)的主要内容,如果未能解决你的问题,请参考以下文章

八皇后(回溯法)

求教C语言回溯法写出八皇后问题的92种解

八皇后问题遗传算法实现(python版)

一次暴力穷举解八皇后问题的血腥尝试(心疼我的CPU)

回溯法解决八皇后问题

回溯法和八皇后问题