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实现ftp客户端示例分享
Feb 17 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
Python使用wxPython实现计算器
Jan 30 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
python连接mongodb集群方法详解
Feb 13 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
python RSA加密的示例
Dec 09 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
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
限制复选框的最大可选数
2006/07/01 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
python Spyder界面无法打开的解决方法
2018/04/27 Python
python xpath获取页面注释的方法
2019/01/14 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
2021/01/10 Python
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
初中生个人学习的自我评价
2013/12/04 职场文书
教师岗位职责范本
2013/12/29 职场文书
上课迟到检讨书100字
2014/01/11 职场文书
请假条标准格式规范
2014/04/10 职场文书
中药学专业求职信
2014/05/31 职场文书
创优争先心得体会
2014/09/11 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
正规欠条模板
2015/07/03 职场文书
2016年元旦主持词
2015/07/06 职场文书