您的位置 首页 > 德语词汇

backtrack是什么意思?用法、例句?python经典算法实践:回溯算法backtrack

其实backtrack是什么意思?用法、例句的问题并不复杂,但是又很多的朋友都不太了解python经典算法实践:回溯算法backtrack,因此呢,今天小编就来为大家分享backtrack是什么意思?用法、例句的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

backtrack是什么意思?用法、例句?python经典算法实践:回溯算法backtrack

回溯法(backtracking)(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

1:定义问题的解空间(搜索中动态生成)

2:确定搜索的解空间结构(一般为树形结构或图)

3:以深度优先的方式搜索解空间,搜索中用剪枝函数避免无效搜索

1:用约束函数在扩展节点处减去不满足约束条件的子树;

2:用限界函数减去不能得到最优解的子树

1.回溯算法之全排列

输入:[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

defpermute(nums):\n"""\n全排列\n:paramnums输入nums=[1,2,3]\n:return:输出[\n[1,2,3],\n[1,3,2],\n[2,1,3],\n[2,3,1],\n[3,1,2],\n[3,2,1]\n]\n"""\n#保存满足条件的解\n#第1步:定义结果集变量\nres=[]\nnums_len=len(nums)\n#第2步:定义回溯方法\ndefbacktrack(visitedItems,leftNums):\n"""\n:paramvisitedItems:已遍历的元素\n:paramleftNums:剩下的数组(待遍历的数组)\n:return:\n"""\niflen(visitedItems)==nums_len:\n#当遍历的元素数目等于输入nums的数组长度时,寻找到解,添加到res数组\nres.append(visitedItems)\n#递归出口,【注意:递归的结束一定要有return】\nreturn\n\n#递归回溯方法backtrack\nforiinrange(len(leftNums)):\n"""\nvisitedItems+[leftNums[i]]:已遍历的数组追加\nleftNums[:i]+leftNums[i+1:]:表示剩余的数组,即除掉当前的元素\n"""\nbacktrack(visitedItems+[leftNums[i]],leftNums[:i]+leftNums[i+1:])\n\n\n\n#调用内部回溯算法\nbacktrack([],nums)\n\n#返回结果集\nreturnres\n

2.回溯算法之数组组合

A=[1,2,3,3]B=[2,3,3,4]C=[2,3,3,4]

集合A,B,C,各取一个元素,获取所有组合

defcombinations(A,B,C):\n"""\n集合A,B,C,各取一个元素,获取所有组合\nA=[1,2,3,3]\nB=[2,3,3,4]\nC=[2,3,3,4]\n:paramA:\n:paramB:\n:paramC:\n:return:\n"""\n\n#返回的结果集\nres=[]\n\ndefbacktrack(vistedItems):\n"""\n:paramvistedItems:已遍历的元素\n:return:\n"""\niflen(vistedItems)==3:\n#当遍历的元素数目等于3,寻找到解,添加到res数组\nres.append(vistedItems)\n#递归出口,【注意:递归的结束一定要有return】\nreturn\n\n#获取(A,B,C)接下来需要遍历的数组\ncandidates=construct_candidates(vistedItems)\nforcandidateincandidates:\n#vistedItems+[candidate]已遍历的数组追加\nbacktrack(vistedItems+[candidate])\n\n\n\ndefconstruct_candidates(vistedItems):\n"""\n根据已遍历的元素,获取下一个需要遍历的数组\n:paramvistedItems:已遍历的元素\n:return:\n"""\n#默认A数组\narray=A\n#已遍历元素已有一个,则接下来遍历B数组\niflen(vistedItems)==1:\narray=B\n#已遍历元素有2个,则接下来遍历C数组\niflen(vistedItems)==2:\narray=C\n\n#返回接下来需要遍历的数组\nreturnarray\n\n#调用内部回溯算法\nbacktrack([])\n\n#返回结果集\nreturnres

3.回溯算法之数字组合

defcombinationArray(nums,target):\n"""\n数字组合,注意数组的值都是整数\n输入:nums=[2,3,6,7],target=7,\n所求解集为:\n[\n[7],\n[2,2,3]\n]\n:paramnums:\n:paramtarget:\n:return:\n"""\n#第1步:定义结果集变量\nres=[]\ndefbacktrack(visitedNums):\n"""\n:paramvisitedNums:已遍历元素\n:return:\n"""\nsumValue=sum(visitedNums)\n#和值>=target值退出(元素都为正数)\nifsumValue>=target:\nifsumValue==target:\n#满足条件,追加结果集\nres.append(visitedNums)\n#递归出口,【注意:递归的结束一定要有return】\nreturn\n\n#遍历递归\nfornuminnums:\nbacktrack(visitedNums+[num])\n\n\n#调用内部回溯算法\nbacktrack([])\n\n#返回结果集\nreturnres

4.回溯算法之求数组子集

[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]

文章到此结束,如果本次分享的backtrack是什么意思?用法、例句和python经典算法实践:回溯算法backtrack的问题解决了您的问题,那么我们由衷的感到高兴!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023