python非递归全排列实现方法

yizhihongxing

当我们需要对一个列表进行全排列时,通常会使用递归的方法,但是递归的深度随着列表长度的增加而增加,可能会导致栈溢出的问题。因此,我们可以使用非递归的方法实现列表的全排列。

下面是使用Python实现非递归全排列的完整攻略:

问题描述

给定一个列表nums,求出它的全排列。列表中元素不重复,且元素个数小于等于10。

示例输入:[1,2,3]

示例输出:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

解决方法

1.交换法

我们可以用交换的方式对列表进行全排列。

具体实现步骤如下:

  1. 初始化一个res列表用来存储全排列结果,初始化一个stack列表用来模拟递归栈。

  2. 把初始列表nums入栈(列表中的元素均未交换)

  3. 当栈不为空时,弹出一个元素,初始化一个used集合,表示当前所取过的元素。

  4. 对于弹出的元素,从0开始遍历到最后一个元素,如果这个元素没有被取过,那么就交换元素并把它入栈,否则跳过。

  5. 如果遍历到了列表的末尾,把当前元素存储到res列表中。

  6. 重复执行3-5步,直到栈为空。

def permute(nums):
    res = []
    stack = [(nums, 0)]
    while stack:
        lst, i = stack.pop()
        if i == len(lst):
            res.append(lst)
        else:
            used = set()
            for j in range(i, len(lst)):
                if lst[j] not in used:
                    used.add(lst[j])
                    lst[i], lst[j] = lst[j], lst[i]
                    stack.append((lst[:], i + 1))
                    lst[i], lst[j] = lst[j], lst[i]
    return res

2. 迭代法

迭代法相对于交换法来说实现代码更加简洁。

具体实现步骤如下:

  1. 定义一个生成器函数gen(nums)。

  2. 首先定义一个长度为n(n为nums中元素个数)的数组p,用来存储当前输出排列。

1) 首先将每个元素的前一个元素下标存入p,并把p[0]设置为-1,指示结束排列。

2) 将每个元素i前面的所有元素集合A放入字典D中,并用0初始化,用于记录集合A已输出排列的数量。

例如,对于列表[1,2,3],字典D应该为{1:0, 2:0, 3:0}。

  1. 在gen函数中使用while循环遍历,每次得到一个排列,然后在p中查找字典D对应集合已经输出的排列数量加一,然后再继续查找,依次类推直到数字排列结束。
def gen(nums):
    n = len(nums)
    p = [-1] + list(range(n-1))
    D = {i:0 for i in nums}
    yield [nums[p[i+1]] for i in range(n-1)]
    i = 0
    while i < n-1:
        D[nums[p[i+1]]] += 1
        while p[i+1] < i + 1:
            p[i+1] += 1
        if D[nums[p[i+1]]] < i + 1:
            p[i+1], p[i+D[nums[p[i+1]]]+1] = p[i+D[nums[p[i+1]]]+1], p[i+1]
            yield [nums[p[i+1]]] + [nums[p[j+1]] for j in range(i)]
            i = 0
        else:
            p[i+1:] = [p[i]] + p[i+1:-1]
            i += 1

def permute(nums):
    return [x for x in gen(nums)]

示例说明

例如,对于列表[1,2,3],我们可以分别使用上述的两个方法来得到全排列。

使用交换法:

nums = [1,2,3]
print(permute(nums))

输出:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]

使用迭代法:

nums = [1,2,3]
print(permute(nums))

输出:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

可以看到,输出结果都是正确的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python非递归全排列实现方法 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • canvas动画库createjs之easeljs(上篇)

    以下是关于“canvas动画库createjs之easeljs(上篇)”的完整攻略,包括基本概念、解决方法、示例说明和注意事项。 基本概念 EaselJS是CreateJS中的一个模块,是一个用于HTML5 Canvas的JavaScript库,可以帮助开发者快速创建交互式图形和动画。EaselJS提供了一组易于使用的API,可以轻松地创建形状、文本、位图、…

    other 2023年5月7日
    00
  • 下载神器网络蚂蚁Ant Download Manager Pro 安装步骤及授权激活详细图文教程

    下载神器网络蚂蚁Ant Download Manager Pro 安装步骤及授权激活详细图文教程 Ant Download Manager Pro 是一款功能强大的下载管理工具,下面是安装步骤及授权激活的详细攻略。 步骤一:下载 Ant Download Manager Pro 首先,你需要下载 Ant Download Manager Pro 的安装文件。…

    other 2023年8月3日
    00
  • 部署vmware-vcsa 6.5

    下面是“部署vmware-vcsa 6.5的完整攻略”,包括准备工作、安装vCenter Server Appliance和配置vCenter Server等方面。 准备工作 在部署vmware-vcsa 6.5之前,需要进行以下准备工作: 确认硬件和软件要求; 下载vCenter Server Appliance安装文件; 确认网络设置; 确认DNS设置;…

    other 2023年5月6日
    00
  • git工具常用命令及ssh操作方法

    Git工具常用命令及SSH操作方法 Git工具常用命令 Git是一个版本控制系统,可以管理代码的版本和变化。以下是一些常用的Git命令: 初始化 创建一个新的Git存储库,使用以下命令: git init 添加文件到GIT存储库 使用以下命令将文件添加到Git存储库: git add <file> 提交到Git存储库 使用以下命令将文件提交到Gi…

    other 2023年6月26日
    00
  • 苹果iOS9与iOS8哪个好?iOS9与iOS8界面详细对比评测

    苹果iOS9与iOS8对比评测攻略 1. 界面设计 iOS 9界面设计 iOS 9引入了一些新的界面设计元素,使用户体验更加流畅和直观。以下是iOS 9界面设计的一些亮点: 新的通知中心:iOS 9的通知中心进行了重新设计,增加了更多的小部件和快捷操作,使用户能够更方便地查看和处理通知。 改进的多任务处理:iOS 9引入了分屏多任务处理功能,允许用户同时在两…

    other 2023年8月18日
    00
  • MPAndroidChart绘制自定义运动数据图表示例详解

    下面我将为你详细讲解“MPAndroidChart绘制自定义运动数据图表示例详解”的完整攻略。 一、简介 MPAndroidChart是一个开源的Android图表控件库,它支持多种图表类型,包括线形图、柱状图、饼图等。它的功能非常强大,能够实现多种复杂的图表需求。本篇攻略将详细讲解如何使用MPAndroidChart绘制自定义运动数据图。 二、创建新项目 …

    other 2023年6月25日
    00
  • python如何查询mysql

    以下是Python如何查询MySQL的完整攻略,包括MySQL连接、查询、结果处理等内容,过程中包含两个示例说明。 1. MySQL连接 在Python中,我们可以使用mysql-connector-python模块来连接MySQL数据库。以下是一个连接MySQL数据库的示例: import mysql.connector # 连接MySQL数据库 mydb…

    other 2023年5月10日
    00
  • 没有U盘系统和光驱的用户的福音 硬盘安装win10系统方法

    下面是详细讲解“没有U盘系统和光驱的用户的福音 硬盘安装win10系统方法”的完整攻略。 背景 在安装Windows操作系统时,通常的方式是通过U盘或DVD光盘引导并安装系统。但对于没有U盘系统和光驱的电脑,如何安装系统呢?本文将介绍一种通过硬盘安装Windows 10操作系统的方法。 准备工作 下载Windows 10系统镜像文件,并将其解压至硬盘根目录下…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部