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生成随机图形验证码详解
Nov 08 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
Python Logging 日志记录入门学习
Jun 02 Python
Python解析Excle文件中的数据方法
Oct 23 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
pandas分批读取大数据集教程
Jun 06 Python
解决keras模型保存h5文件提示无此目录问题
Jul 01 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
Python实现微信表情包炸群功能
Jan 28 Python
python flask框架快速入门
May 14 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 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
drupal 代码实现URL重写
2011/05/04 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP xpath()函数讲解
2019/02/11 PHP
JS实现的省份级联实例代码
2013/06/24 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
简单谈谈python中的Queue与多进程
2016/08/25 Python
python 性能优化方法小结
2017/03/31 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
一夜的工作教学反思
2014/02/08 职场文书
服务承诺书格式
2014/05/21 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
小学生优秀评语
2014/12/29 职场文书
二手房购房意向书
2015/05/09 职场文书
资产移交协议书
2016/03/24 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电