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多线程和队列操作实例
Jun 21 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
python截取两个单词之间的内容方法
Dec 25 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
使用python快速实现不同机器间文件夹共享方式
Dec 22 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
第三篇Bootstrap网格基础
2016/06/21 Javascript
JS访问DOM节点方法详解
2016/11/29 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
微信小程序tabBar模板用法实例分析【附demo源码下载】
2017/11/28 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
JS精确判断数据类型代码实例
2019/12/18 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
python连接字符串的方法小结
2015/07/13 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
python迭代dict的key和value的方法
2018/07/06 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
网络教育自我鉴定
2013/11/01 职场文书
《花木兰》教学反思
2014/04/09 职场文书
教师工作自我鉴定范文
2014/09/14 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
车间质检员岗位职责
2015/04/08 职场文书
英语投诉信范文
2015/07/03 职场文书
解析Java中的static关键字
2021/06/14 Java/Android
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android