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处理字符串之isspace()方法的使用
May 19 Python
深入学习python的yield和generator
Mar 10 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
利用keras加载训练好的.H5文件,并实现预测图片
Jan 24 Python
Python os模块常用方法和属性总结
Feb 20 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 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
德生PL330测评
2021/03/02 无线电
PHP PDO函数库详解
2010/04/27 PHP
php smarty 二级分类代码和模版循环例子
2011/06/16 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
javascript使用activex控件的代码
2011/01/27 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
python实现电子词典
2020/04/23 Python
python访问系统环境变量的方法
2015/04/29 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
大学生校园创业计划书
2014/02/08 职场文书
初中新生军训方案
2014/05/13 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
离婚协议书范文2015
2015/01/26 职场文书
教师个人年终总结
2015/02/11 职场文书
会计工作能力自我评价
2015/03/05 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python