zoukankan      html  css  js  c++  java
  • 回溯法、子集树、排列树、满m叉树

    显示图:

    明确给出了图中的各顶点及边

    隐式图:

    仅给出初始节点、目标节点及产生子节点的条件(一般有问题提议隐含给出)的情况下,构造一个图。

    回溯法:

    从初始状态出发,在隐式图中以深度优先的方式搜索问题的解。当发现不满足求解条件时,就回溯,尝试其他路径。通俗的说,回溯法就是一种能进则进,进不了就换,换不了就退的基本搜索方法。

    回溯法的算法框架和思想:

    1、回溯法的算法框架及思想
    回溯法是一种搜索算法,解决问题时,首先应明确搜索范围,即问题所有可能解的组成范围、这个范围越小越好,且至少包含问题的一个(最优)解。 为了定义搜索范围,需要明确以下几个方面:
    (1)问题解的形式:回溯法看重问题的解能够表示成一个n元组(x1,x2...xn)的形式。
    (2)显约束:对分量xi(i=1,2...n)的取值范围限定。
    (3)隐约束:为满足问题的解而对不同分量之间施加的约束。
    (4)解空间:对于问题的一个实例,解向量满足显约束的所有n元组构成了该实例的一个解空间。
    注意:同一个问题的显约束可能有多种,相应解空间的大小就会不同,通常情况下,解空间越小,算法效率越高。
     

    子集树:

    子集树是使用回溯法解题时经常遇到的一种典型的解空间树。

    子集树中所有非叶子节点均有左右两个分支,我们一般设定左分支为1,右分支为0。树的根结点表示初始状态,中间节点表示某种情况下的中间状态,叶子节点表示结束状态。分支表示从一个状态过度到另一个状态的行为。从根节点到叶结点的路径表示一个可能解。

    示例:

    从n个元素中选取一些元素

    • 这类子集树通常有2n个叶结点,其结点总个数为2n+1-1。
    • 遍历子集树的任何算法均需O(2n)的计算时间。

    子集树形式:(下面以n==3为例)

    对于根节点0号元素,它有两个分支,左边是1,右边是0。左边就代表我们会选择第0号元素,右边就代表我们不选取第0号元素。之后的类似。

    对于叶节点P1表示:3个元素都选

    对于叶节点P2表示:选取元素编号为:0,1

    对于叶节点P3表示:选取元素编号为:0,2

    ......

     

    排列树:

    排列树是用回溯法解题时经常遇到的第二种典型的解空间树。

    当所给的问题是从n个元素的排列中找到满足某种性质的一个排列时,相应的解空间树就是排列树。

    • 排列树通常有n!个叶结点。
    • 因此遍历排列树需要O(n!)的计算时间

    示例:

    给你3个元素(1,2,3),它的排列树如下:

    从根节点A,到它的子节点B、C、D这个路径是来选择第一个元素,走到B节点代表第一个元素选取的是1,走到C节点代表第一个元素选取的是2,后面的类似

    满m叉树:

    满m叉树是用回溯法解题时经常遇到的第三种典型的解空间树,也称为组合树。

    当所给问题的n个元素中每一个元素均有m种选择,要求确定其中的一种选择,使得对这n个向量的选择结果组成的向量满足某种性质。

    n==3的m叉树

    除了叶节点之外,每一个节点都有3个子节点,这就代表的3种选择

  • 相关阅读:
    HDU 5937 Equation
    HDU 5936 Difference
    hdu 4348 To the moon
    SPOJ QTREE Query on a tree
    HDU 3966 Aragorn's Story
    Codeforces 733F Drivers Dissatisfaction
    道良心题
    dp小总结
    数据结构
    数学相关(偏数学向题目的集中地)
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/14107488.html
Copyright © 2011-2022 走看看