【分治算法】【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)构成


Python实现

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

    res = []

    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:
            res.append([m] + p)

    return res


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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值