Considerando i seguenti dati:
chars = [a, b, c, d]
perm = [c, d, a, b]
ids = get_indexes(perm, chars) = [2, 3, 0, 1]
Una possibile soluzione per permutazione con ripetizioni va come segue:
len = length(perm) (len = 4)
num_chars = length(chars) (len = 4)
base = num_chars^len (base = 4^4 = 256)
base = base/len (base = 256/4 = 64)
id = base * ids[0] (id = 64 * 2 = 128)
base = base/len (base = 64/4 = 16)
id = id + (base * ids[1]) (id = 128 + (16 * 3) = 176)
base = base/len (base = 16/4 = 4)
id = id + (base * ids[2]) (id = 176 + (4 * 0) = 176)
base = base/len (base = 4/4 = 1)
id = id + (base * ids[3]) (id = 176 + (1 * 1) = 177)
processo inverso:
id = 177
(id/(4^3)) % 4 = (177/64) % 4 = 2 % 4 = 2 -> chars[2] -> c
(id/(4^2)) % 4 = (177/16) % 4 = 11 % 4 = 3 -> chars[3] -> d
(id/(4^1)) % 4 = (177/4) % 4 = 44 % 4 = 0 -> chars[0] -> a
(id/(4^0)) % 4 = (177/1) % 4 = 177 % 4 = 1 -> chars[1] -> b
Il numero di possibili le permutazioni sono date da num_chars^num_perm_digits
, con num_chars
come numero di possibili caratteri e num_perm_digits
come numero di cifre in una permutazione.
Ciò richiede O(1)
nello spazio, considerando l'elenco iniziale come un costo costante; e richiede O(N)
in tempo, considerando N
come il numero di cifre della tua permutazione.
Sulla base dei punti di cui sopra, si può fare:
function identify_permutation(perm, chars) {
for (i = 0; i < length(perm); i++) {
ids[i] = get_index(perm[i], chars);
}
len = length(perm);
num_chars = length(chars);
index = 0;
base = num_chars^len - 1;
for (i = 0; i < length(perm); i++) {
index += base * ids[i];
base = base/len;
}
}
E 'una pseudocodice, ma è anche abbastanza facile da convertire in qualsiasi lingua (:!.
Cosa si intende per "indice di lessicografia di questa data permutazione"? – Cratylus
Quali sono gli algoritmi O (n) che conosci? Sei sicuro che non siano adatti o facilmente modificabili per essere adatti? – hugomg
@Cratylus che ha una matrice con '[a, b, c, d]' e genera permutazioni in questo ordine: 'abcd, abdc, acbd, acdb, ...' – Rubens