回溯法求解N皇后问题及其时间复杂度分析

您所在的位置:网站首页 用递归函数设计八皇后问题的回溯算法 回溯法求解N皇后问题及其时间复杂度分析

回溯法求解N皇后问题及其时间复杂度分析

2024-07-01 17:03| 来源: 网络整理| 查看: 265

回溯法求解N皇后问题及其时间复杂度分析 一、回溯法简介1. 什么是回溯法?2. 回溯法的时间复杂度分析蒙特卡罗方法蒙特卡罗方法在回溯法求解时间复杂度中的应用 二、回溯法求解N皇后问题1. 回溯法求解N皇后问题的过程2. 回溯法求解N皇后问题的时间复杂度2.1 求解时的效率分析回溯法进行效率分析的代码 2.2 时间复杂度分析

一、回溯法简介 1. 什么是回溯法?

  相信"迷宫"是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教导,都知道走迷宫的策略是:

当遇到一个岔路口,会有以下两种情况: 存在没走过的路。此时可以任意选一条没走过的路深入,只要记住我们所走过的路径即可。倘若下次再来到这个路口,便不再沿着走过的路径继续深入,而是沿着没走过的路径深入下去;所有路都已经走过。如果所有岔路口都已经遍历,则回退至上一个最近的岔路口。 当遇到死胡同,便回退到刚才距离最近的岔路口。不断前进并重复该过程,直到找到终点或回退到起点位置。

  其实,这就是回溯法——一个基于深度优先搜索和约束函数的问题求解方法。

2. 回溯法的时间复杂度分析

  众所周知,回溯法的时间复杂度主要取决于如下几点:

生成每个节点x[k](x[k]表示第k层的当前节点)所用的时间。满足约束函数(用约束函数剪去得不到可行解的子树)的x[k]值的个数(第k层有可能生成几个这样的节点)。计算约束函数Constraint对节点进行判断的时间。计算上界(限界)函数Bound的时间。满足约束函数和限界函数的所有节点x[k]的个数。

  当问题和算法一旦确定下来,就只剩下第5点的实际产生的节点数目是根据问题的具体实例而动态生成,不可预知的。   对于一个具体的问题实例,很难预测出回溯法的行为(先选哪一条岔路,这条岔路是否能很快得到最优解),这时应该怎么办呢?

蒙特卡罗方法

  此时,可以使用蒙特卡罗方法估计回溯法产生的节点数目。   所谓蒙特卡罗方法,其实就是一种以概率统计理论为指导的,使用随机数(或伪随机数)来解决计算问题的方法,通过对大量随机试验求平均,以求得相近的值。   蒙特卡罗方法的基本思想是:当求解的问题是某种随机事件出现的概率或数学期望时,通过大量“实验”的方法,以频率估计概率或者得到某些数字特征,将其近似看作问题的解。   1777年,法国数学家布丰(Buffon)提出使用投针试验的方法求解圆周率π,这被认为是蒙特卡罗方法的起源(扯远了)。

蒙特卡罗方法在回溯法求解时间复杂度中的应用

  我们需要估计的是回溯法实际产生的节点数目,以此计算回溯法的时间复杂度。   其主要思想是,在解空间树(状态空间树)上动态、随机的产生一条路径,然后沿此路径来估算解空间树中所有满足约束条件的节点总数(这里计算的是最差时间复杂度,假设要走遍所有满足约束条件的节点)。   多次进行上述实验,对结果求平均值,即可得到回溯法中实际生成的节点数目的估计值。

二、回溯法求解N皇后问题 1. 回溯法求解N皇后问题的过程

  问题背景:8皇后问题是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。N皇后问题由此推广而来。   问题描述:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即不能处于同一列或同一行,也不能处在同一斜线上,请问有多少种摆法? 8皇后问题

  N皇后问题也是回溯算法的典型案例,这里,我们可以使用递归和循环迭代两种不同的回溯方式编写代码:

// // main.cpp // BackTrack Solution of N-Queens Problem. // // Created by Kang on 2020/7/2 at NJUPT. // Copyright © 2020 Kang. All rights reserved. // #include #include #include using namespace std; const int maxSize = 10; int x[maxSize]; /** Judge if the Queen can be placed at (k, x[k]), if OK, return true. */ bool CanPlace(int k){ for(int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3