Calcolo delle permutazioni di un set di caratteri esadecimali [chiuso]

-1

Quanto tempo occorre per eseguire tutte le permutazioni / combinazioni di un set di dieci caratteri; supponendo che il set di caratteri sia limitato a un alfabeto esadecimale? (ovvero 16 caratteri {0..9} {A..F}, ad esempio A1B2C3D4E5 o A7454F4F74).

Non sono sicuro di una velocità / frequenza / frequenza realistica (ad esempio x.words / secondo; y.words / minuto) ma forse qualcuno lo sa.

O forse dovrei iniziare con; quante possibili combinazioni / permutazioni esistono? E in futuro; come potrei capirlo da solo? (cioè è semplicemente qualcosa come 10 ^ 16?)

    
posta tjt263 30.08.2016 - 10:18
fonte

2 risposte

1

Per rispondere a quest'ultimo, 16 ^ 10, poiché ogni personaggio ha 16 possibili opzioni su una lunghezza totale di 10. Oppure 16 * 16 * 16 .... che risulta in 1.099.511.627.776 combinazioni possibili. Ora se dovessimo contare su questo numero il più velocemente possibile (uno script C ottimizzato) e stampare i numeri sullo schermo, sarebbero necessari circa 10 secondi per 10000000 iterazioni o 1099511 secondi, 12 giorni. Questo è solo se contiamo da 0 e stampiamo ogni numero.

Un semplice programma per calcolare solo le permutazioni

#include <stdio.h>
#include <string.h>

void swap(char *x, char *y) {
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

void permute(char *a, int l, int r) {
    int i;
    if (l == r) {
        printf("%s\n", a);
    } else {
        for (i = l; i <= r; ++i) {
            swap((a + l), (a + i));
            permute(a, l + 1, r);
            swap((a + l), (a + i));
        }
    }
}

int main(int argc, char *argv[]) {
    char str[] = "ABCDEF0123456789";
    permute(str, 0, strlen(str) - 1);
    return 0;
}

Questo non copre l'intero spazio, ma fornisce una buona indicazione. Ricorda che questo ha permutazioni scambiabili solo, e non è affatto completo. Calcolare mediamente le possibili permutazioni superiori a 10 caratteri richiede circa 20 secondi . Ogni personaggio aggiunge circa 10 volte il tempo di esecuzione precedente poiché questa è una crescita esponenziale, 11 caratteri impiegano già circa 3 minuti e così via. Un'indicazione approssimativa potrebbe stimare tutte le permutazioni superiori a 16 caratteri fino a 230 giorni . In pratica questo sarà più, dal momento che non vuoi solo stampare le combinazioni sullo schermo.

Per accelerare il processo devi dividere il dominio ed eseguire le combinazioni in parallelo.

    
risposta data 30.08.2016 - 11:26
fonte
1

Supponendo che la sequenza sia importante, il numero di possibili permutazioni di una stringa di 10 caratteri esadecimali (16 caratteri univoci) sarebbe = 16 x 16 x ... (10 volte) = 16 ^ 10 = 1.099,511,627,776 Questo è poco più di un quadrilione.

    
risposta data 30.08.2016 - 11:01
fonte