python实现全排列代码(回溯、深度优先搜索)


Posted in Python onFebruary 26, 2020

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

公式:全排列数f(n)=n!(定义0!=1)

1 递归实现全排列(回溯思想)

1.1 思想

举个例子,比如你要对a,b,c三个字符进行全排列,那么它的全排列有abc,acb,bac,bca,cba,cab这六种可能就是当指针指向第一个元素a时,它可以是其本身a(即和自己进行交换),还可以和b,c进行交换,故有3种可能,当第一个元素a确定以后,指针移向第二位置,第二个位置可以和其本身b及其后的元素c进行交换,又可以形成两种排列,当指针指向第三个元素c的时候,这个时候其后没有元素了,此时,则确定了一组排列,输出。但是每次输出后要把数组恢复为原来的样子。

python实现全排列代码(回溯、深度优先搜索)

1.2 python实现

def permutations(arr, position, end):
  if position == end:
    print(arr)
  else:
    for index in range(position, end):
      arr[index], arr[position] = arr[position], arr[index]
      permutations(arr, position + 1, end)
      arr[index], arr[position] = arr[position], arr[index] # 还原到交换前的状态,为了进行下一次交换
 
 
arr = [1, 2, 3, 4]
permutations(arr, 0, len(arr))

2 深度优先搜索(DFS)实现全排列

2.1 思想

定义全排列问题:输入一个长度为n的列表arr,输出arr的全排列。

(1)首先可以确定的是,每一种全排列的结果中包含的列表长度均是n。想象面前有n个空盒子,现在要把这n个数放到这些空盒子里去,每个盒子只能放一个数。那么第一个盒子中可以放的选择是n种,可以使用一个循环来逐个尝试。

for index in range(0, len(arr)):
temp[position] = arr[index]

(2)第一个盒子放完后,就该往第二个盒子里放了。假设第一个盒子里放的是arr的第一个数,那么第二个盒子就只能放第2~n个数了(不能重复)。为此引入visit列表用来标记arr中哪些数字被使用过了。初始化:

visit = [True, True, True, True]

这样,当第一个位置已经使用过时,就在visit里做标记:visit = [False, True, True, True]

因此放第一个盒子的代码可以改写如下:

for index in range(0, len(arr)):
    if visit[index] == True:
      temp[position] = arr[index]
      visit[index] = False

(3)当第k个盒子处理完毕后,处理下一个盒子直接调用dfs(k+1)即可,也就是递归调用。解决了当下该如何做,下一步也就知道怎么做了。

(4)递归调用的一定要注意的问题是递归调用的出口,否则循环调用下去程序会崩溃无法运行。在这个问题中什么时候结束递归调用呢?答案是当这n个盒子都放满了,即处理到第n+1个盒子时结束调用,同时输出此时的排列结果。

2.2 python实现

visit = [True, True, True, True]
temp = ["" for x in range(0, 4)]
 
 
def dfs(position):
  # 递归出口
  if position == len(arr):
    print(temp)
    return
  # 递归主体
  for index in range(0, len(arr)):
    if visit[index] == True:
      temp[position] = arr[index]
      visit[index] = False # 试探 
      dfs(position + 1)
      visit[index] = True # 回溯。非常重要
 
 
arr = [1, 2, 3, 4]
dfs(0)

注释了“非常重要”的语句是不能省略的,省略后仅出现[1, 2, 3, 4]一条结果。dfs(k+1)前后的两条语句分别称之为试探和回溯。

3 combination和permutations函数的区别

permutations方法重在排列:

import itertools
n=3
a=[str(i) for i in range(n)]
s=""
s=s.join(a)
for i in itertools.permutations(s,n):
  print (''.join(i))
 
# 结果  
012
021
102
120
201
210

combinations方法重在组合:

import itertools
n=3
a=[str(i) for i in range(n)]
s=""
s=s.join(a)
for i in itertools.combinations(s,n):
  print (''.join(i))
 
# 结果  
012

以上这篇python实现全排列代码(回溯、深度优先搜索)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
python中的变量如何开辟内存
Jun 26 Python
python实现二维插值的三维显示
Dec 17 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
Python 写入训练日志文件并控制台输出解析
Aug 13 Python
深入了解Python在HDA中的应用
Sep 05 Python
python 动态调用函数实例解析
Oct 21 Python
Python 音频生成器的实现示例
Dec 24 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
Python高并发解决方案实现过程详解
Jul 31 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 #Python
python 使用递归回溯完美解决八皇后的问题
Feb 26 #Python
基于Python数据结构之递归与回溯搜索
Feb 26 #Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 #Python
Python基于Dlib的人脸识别系统的实现
Feb 26 #Python
python 回溯法模板详解
Feb 26 #Python
python实现信号时域统计特征提取代码
Feb 26 #Python
You might like
ZF等常用php框架中存在的问题
2008/01/10 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
简单说下OSPF的操作过程
2014/08/13 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
药学专业毕业生求职信
2013/10/20 职场文书
回门宴答谢词
2014/01/13 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
管理建议书范文
2014/05/13 职场文书
授权委托书
2014/07/31 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
实习计划书范文
2015/01/16 职场文书
唐山大地震的观后感
2015/06/05 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
SQL注入详解及防范方法
2021/12/06 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python