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实现判断数组是否包含指定元素的方法
Jul 15 Python
Django实现组合搜索的方法示例
Jan 23 Python
django 删除数据库表后重新同步的方法
May 27 Python
Python静态类型检查新工具之pyright 使用指南
Apr 26 Python
在自动化中用python实现键盘操作的方法详解
Jul 19 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
利用python+request通过接口实现人员通行记录上传功能
Jan 13 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
Mar 20 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
浅谈PHP中的
2016/04/23 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
2019/03/21 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
Python实现文件复制删除
2016/04/19 Python
Python OpenCV获取视频的方法
2018/02/28 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
Python列表切片常用操作实例解析
2019/12/16 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
百货商场楼层班组长竞聘书
2014/03/31 职场文书
地理科学专业自荐信
2014/09/01 职场文书
员工培训协议书
2014/09/15 职场文书
七一建党节慰问信
2015/02/14 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
windows安装python超详细图文教程
2021/05/21 Python
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript