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实现多线程的两种方式
May 22 Python
python的多重继承的理解
Aug 06 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
Python返回数组/List长度的实例
Jun 23 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
python获取url的返回信息方法
Dec 17 Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 Python
Python属性和内建属性实例解析
Jan 14 Python
Python生成器next方法和send方法区别详解
May 30 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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 Token(令牌)设计
2008/03/15 PHP
php处理斐波那契数列非递归方法
2012/02/04 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
php去除HTML标签实例
2013/11/06 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
DWR Ext 加载数据
2009/03/22 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
2017/02/20 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
Python实现excel转sqlite的方法
2017/07/17 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
python logging 日志的级别调整方式
2020/02/21 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
python 实现的车牌识别项目
2021/01/25 Python
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
斯福泰克软件测试面试题
2015/02/16 面试题
毕业学生推荐信
2013/12/01 职场文书
高中生自我评语大全
2014/01/19 职场文书
英语老师推荐信
2014/02/26 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
高中生操行评语大全
2014/04/25 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript