首页 > 其他分享 >回溯法与分支限界法

回溯法与分支限界法

时间:2023-11-12 20:34:38浏览次数:16  
标签:排列 int 子集 回溯 空间组织 限界 分支

回溯法

2023-11-12 20:16:25

好文分享:https://blog.csdn.net/qq_53549930/article/details/124136986

1. 子集树

有时问题是要从一个集合的所有子集中搜索一个集合,作为问题的解。

当问题是要计算n个元素的子集,以便达到某种优化目标时,可以把这个解空间组织成一棵子集树。

复杂度Ω(2n)

 1 //形参t为树的深度,根为1
 2 void backtrack (int t)
 3 {
 4   if (t>n) update(x);
 5   else
 6     for (int i=0; i<=1; i++)  //每个结点只有两个子树
 7     {
 8       x[t]=i;         //即0/1
 9       if (constraint(t) && bound(t)) backtrack(t+1);
10     }
11 }
12  
13 约束函数constraint(t)和限界函数bound(t),称为剪枝函数。
14 函数update(x)是更新解向量x的。
15 约束函数constraint(t),一般可以从问题描述中找到。
2. 排列树

当所给的问题是确定n个元素满足某种性质的排列时,可以把这个解空间组织成一棵排列树。

排列树通常有n!个叶子结点。因此遍历排列树时,其计算时间复杂度是Ω(n!) 。

例如,旅行商问题就是一棵排列树。

 1 //形参t为树的深度,根为1
 2 void backtrack (int t)
 3 {
 4   if (t>n) update(x);
 5   else
 6     for (int i=t; i<=n; i++)
 7     {
 8       //为了保证排列中每个元素不同,通过交换 来实现
 9       swap(x[t], x[i]);
10       if (constraint(t) && bound(t)) backtrack(t+1);
11       swap(x[t], x[i]);    //恢复状态
12     }

 

标签:排列,int,子集,回溯,空间组织,限界,分支
From: https://www.cnblogs.com/myxblogs/p/17827712.html

相关文章

  • shell 分支case语句
    case语句是shell中流控制的第二种方式,语法如下: case$变量in  pattern1)     list1     ;;          ---------------------结尾。  pattern2)     list2     ;;  ......  pat......
  • 回溯算法
    回溯算法处理5w条数据优化❓:我想根据当前节点id回溯出他的路径层级扁平数组......
  • 14-回溯
    14.回溯问自己三个问题:当前操作应该是什么?子问题是什么?下一个子问题应该是什么?14.1Master公式形如$$T(N)=a*T(\frac{N}{b})+O(N^d)$$其中的a、b、d都是常数的递归函数,可以直接通过Master公式来确定时间复杂度如果log(b,a)<d,复杂度为O(N^d)如果log(b,a)......
  • 分支模型介绍
    怎么管理分支是每个研发团队都会比较关心的问题,好的管理模式可以帮助我们提高效率减少问题,相反如果分支模型和业务不太匹配,那么可能给大家带来的将是无尽的伤痛。下面介绍下几个比较出名的分支模型,我们可以选择直接按照某个模型实施,也可以在其上进行适当的调整来更好的匹配我们的......
  • if单分支,if双分支语句
    print('-------单分支if结构-------')age=eval(input('请输入您的年龄:'))ifage>=100:print('你die')if0<=age<100:print('你还活着')#单分支语句,从上往下运行,如果第一个表达式布尔值是True,值直接执行第一个表达式,不在往下运行了;如果第#一个表达式布尔值是Fals......
  • 回溯随笔
    回溯问题通用模板voidbacktracking(参数){if(终止条件){存放结果;return;}for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){处理节点;backtracking(路径,选择列表);//递归回溯,撤销处理结果}......
  • Git创建远程分支并提交代码到远程分支
    1、可以通过gitbranch-r命令查看远端库的分支情况  动图演示(选择项目右键选择GitBashHere,然后输入命令gitbranch-r):  2、从已有的分支创建新的分支(如从master分支),创建一个dev分支  但此时并没有在远程仓库上创建分支如图所示还是只有一个master分支  ......
  • git 分支与标签 操作
    1.标准工作流程1.1管理分支Git是一个分布式版本控制系统,分支管理是其核心功能之一。分支允许开发者在不同的版本上进行并行开发,之后可以将其合并到主分支。这里我们将详细介绍如何使用Git进行分支管理。查看分支:要查看本地分支,可以使用以下命令:gitbranch若要查看远程分支......
  • gitlab 设置 分支只读
    一,设置master分支只读,并且只有Maintainers拥有合并权限。 二,设置成员权限改为developer 三,邀请成员点击右上角InviteMembers  ......
  • 实验二 C语言分支与循环基础应用
    1.实验11#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN246589intmain()10{11intnumber;12inti;1314srand(time(0));1516for(i=......