python 组合排列,全排列python实现讲解
1.简介给定一个正整数N,输出序列1,2,3,N的完整序列简单分析,N个正整数,全部被满足的可能性是N!=n*(n-1)。*1。通过在每个位置放置不同的数字,可以满足问题的要求。
首先,请用最适合的方案来理解:
nums=[ 1,2,3]candidates=[]for iinums 3360 for jinnum 3360 for kinnums 3360 ifi!=j和我!=k和j!=k:候选人。append (str (i) str) j) str) k)第一位固定为1,其余两位分别固定。这样,如果数组中元素太多,写if条件就麻烦了。
1313213231312321二。惠硕
第一个位置可能在N中,对于每种可能性,固定第一个数字,依次排列后面所有的N-1个数字,直到最后一个数字全部排列完毕。所以可以用递归和新月来解决。
默认备用跟踪(nums) 3360默认备用跟踪(position,end):if position==end:RES . append)nums)3360)ee nums[position]=nums[position],nums[index]回溯(position 1,end)nums[index]nums[index]RES=[]BBS
回溯方法从位置0开始,第一个for循环与所有其他位置交换0。这相当于固定第一个元素。这时候有N种可能,因为每一个数字都会被初始位置替换,然后当前数组剩余的N-1个位置会被回滚。另外,请注意,当backtrack返回到纽约时,它将返回到以前的状态。
A.递归与回朔:
该位置成为最后一个位置。也就是说,最后只能用position和end这两个元素来改变位置。这意味着当前只剩下一个元素,当前数组已经完成并结束。
3.深度搜索
第一个位置有n种可能。对于每一种可能,取其为根节点,后面的N-1个数可以是当前根节点的节点。建议连续使用。这N-1个节点每个节点下有N-2个节点,依次递减,可以用DFS求解。
defSolveBydfs(nums):visit=[true for _ in range(Len)nums)]tmp=nums):]defDFS)position)3360 if position)Return for index in range(0)0,Len(nums))3360 if visit[index]:tmp[position]=nums[index]visit[index]=false DFS)position 1)visit[iiit]=false DFS(position 1))62 Return list(map(lambda arr:。join) list) lambdax:str(x,arr),res)
这里,长度为N的数组用于标记状态,初始的for循环修复1-N个数字,被访问的节点被标记为False,然后是dfs(位置1是position=len(后面的True在它变成nums之前)
B.退出条件
当position访问Len(nums)时,只有最后一个元素为true,将这个位置标记为false(DFS position),然后保存结果并返回给res。
四。暴力解决方案
总共有n个!这是可能的。集合,然后使用random.shuffle分解数组并将其添加到集合中。Set.size=N!时间意味着所有的排列都被找到了。
deflazysolution(nums):candidate=set(num S2 str=list)map)lambdax:str,nums))total=reduce(lad)nums)652 nums(while true:if len(candidate)=total:break random . shuffle)nums 2 str)candidate . add(。加入)
一共n个!因为集合可以去重,所以当集合的大小达到所有可能的数字时,标记就并排完成了。
Test defcost(n,epoch):back _ cost=0 DFS _ cost=0 lazy _ cost=0 foriinrange(epoch):_ nums=list)Razy)Rach n 1)imporach n1)print(lazy solution(_ nums))4=time。time))back _ cost=time 2-time 1 DFS _ cost=time 3-time 2 lazy _ cost float)DFS _ cost)/epoch)print)、float)、Lazoch)包内搜索平均花费时间。
遍历从1到7的序列,并运行50次以测量平均速度:
回到月嫂的平均时间是:0.0097381246594238,DFS的平均时间是:0.0777,暴力搜索的平均时间是:12451.686686686617
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。