Ho un insieme di numeri interi, ad esempio 1..20, e voglio ottenere tutte le possibili combinazioni di quel set per disegnare 5 numeri.
Quindi ogni combinazione ha 5 numeri da quel set di numeri interi. Ma non voglio che i numeri nella combinazione siano duplicati e voglio che la combinazione non ordinata sia unica.
Suppongo che non sia facile da capire, il mio inglese non è il migliore e non conosco tutti i termini matematici. Quindi ecco un'illustrazione.
Il mio set è 1..20
e ovviamente ha una lunghezza di 20
.
Voglio che ogni combinazione possibile sia come [1, 2, 3, 4, 5]
, [1, 2, 3, 4, 6]
, ..., [1, 4, 8, 14, 20]
, sempre una lunghezza di 5.
E questo dovrebbe essere proibito: [1, 2, 3, 4, 5]
, [3, 2, 1, 5, 4]
poiché questi due contengono gli stessi numeri esatti.
Anche questo non è permesso: [1, 1, 2, 3, 4]
poiché questa combinazione contiene numeri duplicati.
Quindi un approccio ingenuo sarebbe quello di iterare tramite il 5% difor
di cicli su 20, salvare tutte le combinazioni precedenti e verificare la presenza di duplicati attraverso le combinazioni e all'interno della combinazione più recente. Ma questo risulterebbe in 3.200.000 cicli, che non è molto efficiente, dal momento che il numero finale di combinazioni è 1.860.480 (se non ho calcolato male, ma dovrebbe essere n! / ((n -k)! * k!)
se non sbaglio completamente, dove n = 20
e k = 5
).
Quindi, come posso eliminare i loop duplicati in primo luogo? Ho bisogno di un algoritmo che sia veloce e che non compia passi inutili poiché calcolerò cose con questi dati che richiedono un po 'di tempo e quindi voglio ridurre il più possibile il numero di cicli.