Come posso permutare coppie su un set?

2

Sto scrivendo un'app per la scommessa che si trova in C # e WinForms. Ho 6 selezioni, 4 di loro hanno vinto. So che utilizzando la seguente formula da Excel:

=FACT(selections)/(FACT(selections-doubles))/FACT(doubles)

Questo è codificato nella mia app e funziona bene: posso calcolare quanti possibili doppi (ad es., AB, AC, AD, AE, BC, BD, BE, ecc.) devono essere risolti.

Ma quello che non riesco a capire è come fare il calcolo effettivo. Come posso codificarlo in modo efficiente in modo che sia stata calcolata ogni combinazione di A, B, C e D?

Tutti i miei sforzi finora sulla carta si sono rivelati brutti e prolissi: c'è una soluzione elegante a questo problema?

    
posta sila 19.11.2011 - 09:52
fonte

2 risposte

1

Non parlo C #, ma ecco l'idea generale in pseudocodice C-like:

items = {A, B, C, D, E}
for (i = 0; i < items.count-1; i++)
    for (j = i+1; j < items.count; j++) {
        doSomethingWithPair(items[i], items[j])
    }
}

In inglese, scegli il primo oggetto e combinalo con tutti gli oggetti successivi. Quindi scegli l'elemento successivo e combinalo con tutti gli oggetti successivi, e così via fino a quando non hai combinato il penultimo oggetto con l'ultimo oggetto.

Se l'ordine fosse importante, cioè volevi permutazioni invece di combinazioni, scegli entrambi i membri di ogni coppia nell'intervallo completo di items . Cambia il ciclo esterno in modo che vada fino alla fine e il ciclo interno in modo che inizi dall'inizio. Ricordati di controllare che i! = J se non vuoi permutazioni con sostituzione:

for (i = 0; i < items.count; i++) {
    for (j = 0; j < items.count; j++) {
        if (i == j) continue;        // avoid AA, BB, etc.
        doSomethingWithPair(items[i], items[j]);
    }
}
    
risposta data 19.11.2011 - 11:22
fonte
2

In LINQ puoi fare qualcosa di simile:

string[] items = new[] { "A", "B", "C", "D" };
var pairs = from firstIndex in Enumerable.Range(0, items.Length)
            from secondIndex in Enumerable.Range(firstIndex + 1, items.Length - firstIndex - 1)
            select new {First = items[firstIndex], Second = items[secondIndex]};
foreach(var pair in pairs)
    Console.WriteLine("{0},{1}", pair.First, pair.Second);
    
risposta data 22.11.2011 - 21:55
fonte

Leggi altre domande sui tag