python递归 数字全排列_非递归全排列 python实现

python algorithm

全排列(Permutation)

排列(英语:Permutation)是将相异物件或符号根据确定的顺序重排。每个顺序都称作一个排列。例如,从一到六的数字有720种排列,对应于由这些数字组成的所有不重复亦不阙漏的序列,例如4, 5, 6, 1, 2, 3 与1, 3, 5, 2, 4, 6。【From Wikipedia】

从n个相异元素中取出 k个元素,k个元素的排列数量为:

\[ {P_{k}^{n}={\frac {n!}{(n-k)!}}}

\]

其中P意为Permutation(排列),!表示阶乘运算。全排列而取k为n,则结果为n!。

全排列生成算法

字典序法

字典序,就是将元素按照字典的顺序(a-z, 1-9)进行排列。以字典的顺序作为比较的依据,可以比较出两个串的大小。比如 "1" < "13"<"14"<"153", 就是按每个数字位逐个比较的结果。对于一个串“123456789”, 可以知道最小的串是“123456789”,而最大的串“987654321”。这样针对这个串以字典序法生成全排列生成全排列,就是依次生成“123456789”->“123456798”->......->"987654312"->"987654321"这样的串。字典序法要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。

邻位对换法

该算法由Johnson-Trotter首先提出,是一个能快速生成全排列的算法。它的下一个全排列总是上一个全排列对换某相邻两位得到的。如果已知n-1个元素的排列,将n插入到排列的不同位置,就得到了n个元素的排列。用这种方法可以产生出任意n个元素的排列。这个方法有一个缺点:为了产生n个元素的排列,我们必须知道并存储所有n-1个元素的排列,然后才能产生出所有n阶排列。

递增进位制法

这个算法是基于序列的递增进位制数[3]。递增进位制数是指数字的进制随着位数的递增而递增。一般情况下,数字最右边的进制是2,次右边的进制是3,以此类推。n位递增进位制数一共包含n!个数字,所以它可以与全排列生成算法结合在一起。

递减进位制法

该方法与递增进位制法的原理相似,不同的是它定义的“递减进位制数”是数字的进制随着位数的递增而递减。这种进制一般最左边的进制是2,次左边的进制是3。其余原理与递增进位制法基本相同。

Python实现

字典序法

非递归算法

设P是集合{1,2,……n-1,n}的一个全排列:P=P1P2……Pj-1PjPj+1……Pn(1≤P1,P2,……,Pn≤n-1)

1.从排列的右端开始,找出第一个比右边数字小的数字的序号j,即j=max{i|Pi<Pi+1,i>j}在Pj的右边的数字中,

找出所有比Pj大的数字中最小的数字Pk,即k=min{i|Pi>Pj,i>j}

2.交换Pi,Pk

3.再将排列右端的递减部分Pj+1Pj+2……Pn倒转,因为j右端的数字是降序,所以只需要其左边和右边的交换,直到中间,因此可以得到一个新的排列P'=P1P2……Pj-1PkPn……Pj+2Pj+1

代码

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

@author: gsharp

"""

def Swap(n,a,b):

n[a],n[b] = n[b],n[a]

return None

def Reverse(n,begin):

if len(n) > begin:

i = begin

j = len(n)-1

while i < j:

Swap(n,i,j)

i += 1

j -= 1

return n

def FindMin(n,i):

j = len(n)-1

k = i + 1

while j > i:

if n[j] > n[i] and n[j] < n[k]:

k = j

j -= 1

return k

def Permut(n):

count = 0

j = len(n) -1

if j < 1:

return n

else :

print n

count += 1

while j >= 1:

i = j - 1

if n[i] < n [j] :

k = FindMin(n,i)

Swap (n,i,k)

Reverse (n,j)

j = len(n) - 1

count += 1

print n

else :

j -= 1

print count

n =[1,2,3,4,5,6]

Permut(n)

注意:

这里只能对于具有可比较值的列表排序,对于如【'~','!','@','#'】无法直接排序。

初始序列必须为最小序列,否则无法列出全部排列。可先使用快速排序来排序后作为输入。

python非递归全排列

刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...

数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

全排列问题&lpar;递归&amp&semi;非递归&amp&semi;STL函数&rpar;

问题描述: 打印输出1-9的所有全排序列,或者打印输出a-d的全排列. 思路分析: 将每个元素放到余下n-1个元素组成的队列最前方,然后对剩余元素进行全排列,依次递归下去. 比如:1 2 3 为例首先 ...

【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历

代码如下: # coding=utf-8 class myNode(object): def __init__(self, data=-1, lchild=None, rchild=None): se ...

python实现图的遍历(递归和非递归)

class graph: def __init__(self,value): self.value=value self.neighbors=None # 图的广度优先遍历 # 1.利用队列实现 # ...

Python 非递归遍历图

class Queue: def __init__(self,max_size): self.max_size = int(max_size) self.queue = [] def put(self ...

递归&sol;非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

python递归与非递归实现斐波那契数列

1.题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). 递归实现: class Solution(): def Fibnacci(self ...

&lbrack;python&rsqb;兔子问题,斐波那契数列 递归&amp&semi;非递归

假设一对幼年兔子需要一个月长成成年兔子,一对成年兔子一个月后每个月都可以繁衍出一对新的幼年兔子(即兔子诞生两个月后开始繁殖).不考虑死亡的情况,问第 N 个月时共有多少对兔子? 结果前几个月的兔子数量 ...

随机推荐

&lbrack;LeetCode&rsqb; Unique Paths II 不同的路径之二

Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

最短路&lpar;Floyd&lowbar;Warshall&rpar; POJ 2253 Frogger

题目传送门 /* 最短路:Floyd算法模板题 */ #include #include #include

linux gdb 没有符号表被读取。请使用 &quot&semi;file&quot&semi; 命令。

使用gdb时遇到这个问题,刚开始接触linux下使用gdb调试程序,其原因是生成的二进制可执行文件没有使用-g选项. gcc中-g选项是为了获得有关调试信息,要用gdb进行调试,必须使用-g生成二进制 ...

。。。Ajax的回调函数function&lpar;data&rpar;中,data的返回类型。。。

今天在做项目的过程中,突然发现了一个有趣的问题,那就是我在Java服务器端写程序,String result = "0";然后通过out.println(result),将resu ...

使用python通过selenium模拟打开chrome窗口报错 出现 &quot&semi;您使用的是不受支持的命令行标记&colon;--ignore-certificate-errors

#在程序前加上这段代码 from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimen ...

MySQL定时检查是否宕机并邮件通知

我们有时候需要一些检查MySQL是否宕机,如果宕机了应自动重新启动应用并通知运维人员!此脚本用来简单的实现MySQL宕机后自动重启并邮件通知运维,此为SHELL脚本,当然也有一些朋友喜欢用Python ...

mxGraph改变图形大小重置overlay位置

要在改变图形大小的时候改变overlay的位置.那肯定就要对重置图形大小的方法进行改造了.以下是源文件里的代码 mxGraph.prototype.resizeCells = function(cel ...

CI 路由设置

$route['news/show/(:num)']='news/show/$1';   前边是匹配 网址   后边是  指定控制器 在application/config/文件夹下有routes.p ...

五子棋AI大战OC实现

Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...

关于微信小程序的的总结

微信小程序学完了,给大家分享一些自己学小程序的心得,希望能帮到大家. 首先,我谈谈小程序数据绑定的那一块,所有从本地或者远程服务器的API传过来,都必须绑定到data: {}, 绑定格式是一个一个的键 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值