matlab生成组合字典序法,组合数学 排列生成算法 字典序

本文详细探讨了如何使用递归方法在1到MAX范围内生成所有递进制数,并通过字典序操作将其转换为排列,涉及字典序计算、序数转换和排列生成等步骤。展示了从递增数到排列序列的完整过程,包括中介数和序数的转换技巧。
摘要由CSDN通过智能技术生成

字典序排序生成

数字使用1~MAX

function dfs(n) {

if (n == MAX) {

// console.log(a)

ALL.push(Array.from(a))

used.delete(a.pop())

return

}

for (let i = 1; i <= MAX; i++) {

if (!used.has(i)) {

a.push(i)

used.add(i)

dfs(n + 1)

}

}

used.delete(a.pop())

}

递增进位制

由于n个排列有n!个,n位递增进制数可以一一对应一个排列

各种转换

排列转中介数

中介数转排列

序数转中介数

中介数转序数

let a = []

let MAX = 4

let used = new Set()

let ALL = []

function dfs(n) {

if (n == MAX) {

// console.log(a)

ALL.push(Array.from(a))

used.delete(a.pop())

return

}

for (let i = 1; i <= MAX; i++) {

if (!used.has(i)) {

a.push(i)

used.add(i)

dfs(n + 1)

}

}

used.delete(a.pop())

}

// 阶乘

function fac(n) {

return n < 2 ? 1 : n * fac(n - 1)

}

// 字典序中介数计算

function f1(arr) {

let ret = []

for (let i = 0; i < arr.length; i++) {

let c = 0

for (let j = i + 1; j < arr.length; j++)

arr[j] < arr[i] ? c++ : c

ret[i] = c

}

return ret

}

// 字典序求序数

function getM1(arr) {

return arr.reduce(

(pre, cur, index) => pre + cur * fac(arr.length - 1 - index),

0

)

}

// 字典序序数转中介数

function g1(m) {

let len = MAX

while (fac(len) < m)

len++

let arr = []

for (let i = 1; i < len; i++) {

m = Math.floor(m / i)

arr.push(Math.floor(m) % (i + 1))

}

return arr.reverse()

}

// 中介数转排列

function h1(arr) {

let used = new Set()

let ret = []

for (let i = 0; i < arr.length; i++) {

let t = arr[i] + 1

while (used.has(t))

t++

ret.push(t)

used.add(t)

}

return ret

}

dfs(0)

for (let i of ALL) {

console.log(i, f1(i), getM1(f1(i)), g1(getM1(f1(i))), h1(f1(i)))

}

[ 1, 2, 3, 4 ] [ 0, 0, 0, 0 ] 0 [ 0, 0, 0 ] [ 1, 2, 3, 4 ]

[ 1, 2, 4, 3 ] [ 0, 0, 1, 0 ] 1 [ 0, 0, 1 ] [ 1, 2, 3, 4 ]

[ 1, 3, 2, 4 ] [ 0, 1, 0, 0 ] 2 [ 0, 1, 0 ] [ 1, 2, 3, 4 ]

[ 1, 3, 4, 2 ] [ 0, 1, 1, 0 ] 3 [ 0, 1, 1 ] [ 1, 2, 3, 4 ]

[ 1, 4, 2, 3 ] [ 0, 2, 0, 0 ] 4 [ 0, 2, 0 ] [ 1, 3, 2, 4 ]

[ 1, 4, 3, 2 ] [ 0, 2, 1, 0 ] 5 [ 0, 2, 1 ] [ 1, 3, 2, 4 ]

[ 2, 1, 3, 4 ] [ 1, 0, 0, 0 ] 6 [ 1, 0, 0 ] [ 2, 1, 3, 4 ]

[ 2, 1, 4, 3 ] [ 1, 0, 1, 0 ] 7 [ 1, 0, 1 ] [ 2, 1, 3, 4 ]

[ 2, 3, 1, 4 ] [ 1, 1, 0, 0 ] 8 [ 1, 1, 0 ] [ 2, 3, 1, 4 ]

[ 2, 3, 4, 1 ] [ 1, 1, 1, 0 ] 9 [ 1, 1, 1 ] [ 2, 3, 4, 1 ]

[ 2, 4, 1, 3 ] [ 1, 2, 0, 0 ] 10 [ 1, 2, 0 ] [ 2, 3, 1, 4 ]

[ 2, 4, 3, 1 ] [ 1, 2, 1, 0 ] 11 [ 1, 2, 1 ] [ 2, 3, 4, 1 ]

[ 3, 1, 2, 4 ] [ 2, 0, 0, 0 ] 12 [ 2, 0, 0 ] [ 3, 1, 2, 4 ]

[ 3, 1, 4, 2 ] [ 2, 0, 1, 0 ] 13 [ 2, 0, 1 ] [ 3, 1, 2, 4 ]

[ 3, 2, 1, 4 ] [ 2, 1, 0, 0 ] 14 [ 2, 1, 0 ] [ 3, 2, 1, 4 ]

[ 3, 2, 4, 1 ] [ 2, 1, 1, 0 ] 15 [ 2, 1, 1 ] [ 3, 2, 4, 1 ]

[ 3, 4, 1, 2 ] [ 2, 2, 0, 0 ] 16 [ 2, 2, 0 ] [ 3, 4, 1, 2 ]

[ 3, 4, 2, 1 ] [ 2, 2, 1, 0 ] 17 [ 2, 2, 1 ] [ 3, 4, 2, 1 ]

[ 4, 1, 2, 3 ] [ 3, 0, 0, 0 ] 18 [ 3, 0, 0 ] [ 4, 1, 2, 3 ]

[ 4, 1, 3, 2 ] [ 3, 0, 1, 0 ] 19 [ 3, 0, 1 ] [ 4, 1, 2, 3 ]

[ 4, 2, 1, 3 ] [ 3, 1, 0, 0 ] 20 [ 3, 1, 0 ] [ 4, 2, 1, 3 ]

[ 4, 2, 3, 1 ] [ 3, 1, 1, 0 ] 21 [ 3, 1, 1 ] [ 4, 2, 3, 1 ]

[ 4, 3, 1, 2 ] [ 3, 2, 0, 0 ] 22 [ 3, 2, 0 ] [ 4, 3, 1, 2 ]

[ 4, 3, 2, 1 ] [ 3, 2, 1, 0 ] 23 [ 3, 2, 1 ] [ 4, 3, 2, 1 ]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值