当前位置:   article > 正文

数据结构与算法--算法思维之回溯算法_回溯算法的优缺点

回溯算法的优缺点

目录

回溯算法

概念

经典问题:N皇后问题

时间复杂度

优缺点

适用场景


回溯算法

概念

        回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。

经典问题:N皇后问题

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。  

        我们把这个问题划分成 8 个阶段,依次将 8 个棋子放到第一行、第二行、第三行……第八行。在放置的过程中,我们不停地检查当前放法,是否满足要求。如果满足,则跳到下一行继续放置棋子;如果不满足,那就再换一种放法,继续尝试。

  1. public class NQueens {
  2. static int QUEENS = 8;
  3. int[] result = new int[QUEENS];
  4. public void setQueens(int row){
  5. if (row == QUEENS){
  6. printQueens();
  7. return;
  8. }
  9. for (int col = 0; col < QUEENS; col++) {
  10. if (isOk(row, col)){
  11. //设置列
  12. result[row] = col;
  13. //开始下一行
  14. setQueens(row + 1);
  15. }
  16. }
  17. }
  18. private void printQueens(){
  19. for (int i = 0; i < QUEENS; i++) {
  20. for (int j = 0; j < QUEENS; j++) {
  21. if (result[i] == j){
  22. System.out.print("Q| ");
  23. }else {
  24. System.out.print("*| ");
  25. }
  26. }
  27. System.out.println();
  28. }
  29. System.out.println("---------------------------------");
  30. }
  31. private boolean isOk(int row, int col){
  32. int leftup = col - 1;
  33. int rightup = col + 1;
  34. for (int i = row -1; i >= 0; i--){
  35. //列上存在queen
  36. if (result[i] == col){
  37. return false;
  38. }
  39. //左上对角线存在queen
  40. if (leftup >= 0){
  41. if (result[i] == leftup){
  42. return false;
  43. }
  44. }
  45. //右下对角线存在queen
  46. if (rightup < QUEENS){
  47. if (result[i] == rightup) {
  48. return false;
  49. }
  50. }
  51. leftup--;
  52. rightup++;
  53. }
  54. return true;
  55. }
  56. public static void main(String[] args) {
  57. fangge queens = new fangge();
  58. queens.setQueens(0);
  59. }
  60. }

 

时间复杂度

 N皇后问题的时间复杂度为: 实际为 O(n!) 实际为n!/ 2

 

优缺点

        优点: 回溯算法的思想非常简单,大部分情况下,都是用来解决广义的搜索问题,也就是,从一组可能的解中,选择出一个满足要求的解。回溯算法非常适合用递归来实现,在实现的过程中,剪枝操作是提高回溯效率的一种技巧。利用剪枝,我们并不需要穷举搜索所有的情况,从而提高搜索效率。

        劣势: 效率相对于低(动态规划)

 

适用场景

        回溯算法是个“万金油”。基本上能用的动态规划、贪心解决的问题,我们都可以用回溯算法解决。回溯算法相当于穷举搜索。穷举所有的情况,然后对比得到最优解。不过,回溯算法的时间复杂度非常高, 是指数级别的,只能用来解决小规模数据的问题。对于大规模数据的问题,用回溯算法解决的执行效率会非常低 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/477846
推荐阅读
相关标签
  

闽ICP备14008679号