【分治算法】【Python实现】排列问题

因上努力

个人主页:丷从心

系列专栏:分治算法

学习指南:Python学习指南

果上随缘


问题描述

  • R = {   r 1 , r 2 , ⋯   , r n   } R = \set{r_{1} , r_{2} , \cdots , r_{n}} R={r1,r2,,rn}是要进行全排列的 n n n个元素

分治算法

  • R i = R − {   r i   } R_{i} = R - \set{r_{i}} Ri=R{ri}

  • 集合 X X X中的元素的全排列记为 P e r m ( X ) Perm(X) Perm(X) ( r i ) P e r m ( X ) (r_{i}) Perm(X) (ri)Perm(X)表示在全排列 P e r m ( X ) Perm(X) Perm(X)的每个排列前加上前缀 r i r_{i} ri得到的排列

  • R R R的全排列可递归定义为

    • n = 1 n = 1 n=1时, P e r m ( R ) = ( r ) Perm(R) = (r) Perm(R)=(r),其中 r r r是集合 R R R中唯一的元素

    • n > 1 n > 1 n>1时, P e r m ( R ) Perm(R) Perm(R) ( r 1 ) P e r m ( R 1 ) (r_{1}) Perm(R_{1}) (r1)Perm(R1) ( r 2 ) P e r m ( R 2 ) (r_{2}) Perm(R_{2}) (r2)Perm(R2) ⋯ \cdots ( r n ) P e r m ( R n ) (r_{n}) Perm(R_{n}) (rn)Perm(Rn)构成

  • 递归地产生所有前缀是 n u m [ 0 : k − 1 ] num[0 : k - 1] num[0:k1],且后缀是 n u m [ k : m ] num[k : m] num[k:m]的全排列的所有排列


Python实现

def permute(nums):
    if len(nums) <= 1:
        return [nums]

    result = []

    for i in range(len(nums)):
        m = nums[i]
        remaining_nums = nums[:i] + nums[i + 1:]

        sub_permutations = permute(remaining_nums)

        for p in sub_permutations:
            result.append([m] + p)

    return result


nums = [1, 2, 3]

permutations = permute(nums)

for p in permutations:
    print(p)
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

相关推荐

  1. 快速排序算法Python实现

    2024-04-27 23:20:02       31 阅读
  2. 基数排序算法Python实现

    2024-04-27 23:20:02       24 阅读
  3. 归并排序算法Python实现

    2024-04-27 23:20:02       27 阅读
  4. Python实战开发及案例分析(7)—— 排序算法

    2024-04-27 23:20:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 23:20:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 23:20:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 23:20:02       87 阅读
  4. Python语言-面向对象

    2024-04-27 23:20:02       96 阅读

热门阅读

  1. 【C++】使用 std::shared_ptr 导致的循环引用问题

    2024-04-27 23:20:02       30 阅读
  2. mysql 连接数配置,解决Too many connections错误

    2024-04-27 23:20:02       27 阅读
  3. 数据结构中的栈和队列(附实际案例代码)

    2024-04-27 23:20:02       26 阅读
  4. 【QT】QPointF、QRectF、QPolygonF 介绍

    2024-04-27 23:20:02       30 阅读
  5. 如何读取一个整行的字符串

    2024-04-27 23:20:02       28 阅读
  6. 顺序排列的二叉树的删除

    2024-04-27 23:20:02       28 阅读