• LeetCode回溯系列(0)——回溯算法讲解


    什么是回溯算法?  

      回溯法是一种系统搜索问题解空间的方法。为了实现回溯,需要给问题定义一个解空间。说到底它是一种搜索算法。只是这里的搜索是在一个叫做解空间的地方搜索。而往往所谓的dfs,bfs都是在图或者树这种数据结构上的搜索。

      根据定义来看,要实现回溯,需要两点:

    • 搜索
    • 解空间

    先看什么是解空间

      就是形如数组的一个向量[a1,a2,....,an]。这个向量的每个元素都是问题的部分解,只有当这个数组的每一个元素都填满(得到全部解)的时候,才表明这个问题得到了解答。

    再看搜索

    • 最简单的就是for循环,上面的向量有n个维度,因此就是n个for循环。
      形如:
    for(求a1位置上的解)
       for(求a2位置上的解)
          for(求a3位置上的解)
           ......
           ......
           for(求an位置上的解)

      但是如果n是100?n是100000?那么如何回溯?当然也可以写n个for循环,但是这样的程序会惨不忍睹。。。而且似乎10000个(不过往往回溯的时间复杂度太大,一般n不会这么大)for循环也很难写出来。。。

    因此我们需要一种全新的书写回溯的方法。形如:

    void backtrack(int i,int n,other parameters)
    {
          if( i == n)
       {
            //get one answer
             record answer;
             return;
         }
         //下面的意思是求解空间第i个位置上的下一个解
         for(next ans in position i of solution space)
         {
              backtrack(i+1,n,other parameters);
         }
    }

    就是这么简单!!!
    上面的模板适用于所有"解空间确定"的回溯法的问题!!!
    上面的i代表解空间的第i个位置,往往从0开始,而n则代表解空间的大小。每一次的backtrack(i,n,other)调用,代表求解空间第i个位置上的解。而当i=n时,代表解空间上的所有位置的解都已经求出。
    有了上述模板,我们就解决了搜索的问题。
    因此几乎所有回溯的问题的难度都在于如何定义解空间。

  • 相关阅读:
    一个简单的C++程序反汇编解析
    一个简单的C++程序反汇编解析
    Oracle 10g 用户数及价格
    若何应对被公开的Oracle口令加密算法(3)
    Solaris办事管理对象 SMF快速入门指南(1)
    Solaris 10完成安好Kerberos身份验证(1)
    Solaris效力操持工具 SMF疾速入门指南(3)
    Oracle Warehouse Builder 自动化ETL措置历程(4)
    如何经过PHP获得MySQL procedure成效
    Solaris 10下设置EJB 3.0情况(2)
  • 原文地址:https://www.cnblogs.com/SupremeBoy/p/12275631.html
Copyright © 2020-2023  润新知