首页 > 编程知识 正文

全排列编程,python排列组合多少种怎么写

时间:2023-05-06 17:33:36 阅读:174741 作者:4227

一.引言给定正整数n,输出数列1、2、3、n的全序列。 简单分析一下,n个正整数,全部满足的可能性是n!=n*(n-1 ) . *1。 通过在每个位置放置不同的数字,可以满足问题的要求。

首先请用最for的方案理解:

nums=[ 1,2,3 ] candidates=[ ] foriinnums 3360 forjinnums 3360 forkinnums 3360 ifi!=j and i!=k and j!=k:candidates.append(str(I ) str ) j ) str ) k )的第一位固定为1,剩下的两个数字分别固定,如此,如果数组元素过多,则写入if条件会变得麻烦

123132213231312321二.回朔

第一个位置有可能是n中。 对于每种可能性,固定第一位数字,将后面的N-1个数字全部排列,依次进行直到最后一个数字全部排列。 因此,可以用递归和朔来解决。

默认备用跟踪(nums ) 3360默认备用跟踪(position,end ) : if position==end : RES.append ) nums ) 3360 ) ee nums[position]=nums[position],nums[index] backtrack(position 1,end ) nums [ index ] nums [ index ] RES=[ ] BBS

backtrack方法从position 0开始,第一个for循环将0与所有其他位置交换。 这相当于固定第一个要素。 此时,有n种可能性,因为每个数字都将被替换为初始位置,然后回退当前数组的剩馀N-1位置。 同样,请注意,backtrack返回朔时将返回到以前的状态。

A.递归与回朔:

位置变为最后的位置。 也就是说,最后只能用position的要素和end的要素改变位置。 这意味着当前只剩下一个元素,当前数组已完成并结束。

3 .深度搜索

第一个位置有n种可能性。 对于每种可能性,将其作为根节点,后面的N-1个数字可以是当前根节点的node,继续建议使用。 这N-1个node在每个节点下有N-2个node,依次向下,可以用DFS解决。

defSolveBydfs(nums ) : visit=[ true for _ in range (len ) nums ) ]tmp=nums ) :]defDFS ) position ) 3360ifposition ) return for index in range(0) 0, len(nums ) ) 3360 if visit [ index ] : tmp [ position ]=nums [ index ] visit [ index ]=false DFS ) position1) visit [ iiit ]=false DFS (位置1 ) ) 652返回列表(map (lambda arr : '.join )列表) lambdax:str(x,arr )、res )

这里,使用长度为n的数组进行状态标签,最初的for循环固定1-N个数字,访问后的节点标记为False,然后输入dfs(position 1为position=len (在成为nums之前为后续True的

B.退出条件

当position访问Len(nums )时,只有最后一个元素为Ture,将此位置标记为false (DFS ) position ),然后将结果保存并返回res。

四.暴力解法

总共有n个! 有可能。 构建Set,然后使用random.shuffle分解数组并将其添加到Set中。 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:breakrandom.shuffle ) numS2str ) candidate.add('.Join )

一共n个! 种,因为Set可以去除重量,所以当Set的size达到所有可能数时,标志都是并排完成的。

五.测试defcost(n, epoch ) : back _ cost=0DFS _ cost=0lazy _ cost=0foriinrange (epoch ) :_nums=list ) Razy ) Rach n 1 ) imporach n1 ) print(lazysolution(_nums ) ) time4=time.time ) ) back _ cost=time2- time1DFS _ cost=time3- time2lazy _ cost float ) DFS_cost )/epoch ) print )、float )、Lazoch )包中的搜索需要平均时间

遍历序列选择1-7,跑50次测定平均速度:

回朔平均时间为: 0.009738812446594238DFS平均时间为: 0.010725607872009277暴力搜索平均时间为: 0.0832136631011963

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。