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多线程threading.Lock锁用法实例
Nov 01 Python
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python基于matplotlib实现绘制三维图形功能示例
Jan 18 Python
Python多线程扫描端口代码示例
Feb 09 Python
Python实现使用request模块下载图片demo示例
May 24 Python
python SVM 线性分类模型的实现
Jul 19 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
python 实现按对象传值
Dec 26 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
pycharm设置python文件模板信息过程图解
Mar 10 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
php下批量挂马和批量清马代码
2011/02/27 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
新浪的图片新闻效果
2007/01/13 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
原生js轮播特效
2017/05/18 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
入党申请自荐书范文
2014/02/11 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
go原生库的中bytes.Buffer用法
2021/04/25 Golang
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
MySQL数据管理操作示例讲解
2022/12/24 MySQL