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 相关文章推荐
Linux下使用python调用top命令获得CPU利用率
Mar 10 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python设置默认编码为utf8的方法
Jul 01 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python机器学习之贝叶斯分类
Mar 26 Python
python实现五子棋游戏
Jun 18 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 Python
pytorch 如何使用amp进行混合精度训练
May 24 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树的代码,可以嵌套任意层
2006/10/09 PHP
PHP操作xml代码
2010/06/17 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
PHP PDO操作总结
2014/11/17 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
JavaScrip关于创建常量的知识点
2017/12/07 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
python封装对象实现时间效果
2020/04/23 Python
Python CSV模块使用实例
2015/04/09 Python
使用Python和xlwt向Excel文件中写入中文的实例
2018/04/21 Python
python实现抖音点赞功能
2019/04/07 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
英国足球店:UK Soccer Shop
2017/11/19 全球购物
村委会贫困证明
2014/01/14 职场文书
分公司任命书
2014/06/06 职场文书
岗位安全生产责任书
2014/07/28 职场文书
大一新生检讨书
2014/10/29 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python