字典序排序生成
数字使用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 ]