Variace (kombinatorika)

(přesměrováno z Variace s opakováním)

Variace k-té třídy z n prvků je každá uspořádaná k-tice vytvořená z celkového počtu n prvků, přičemž při výběru záleží na pořadí jednotlivých prvků. Rozlišujeme variace s opakováním a bez opakování. Pro výpočet hodnoty je používán faktoriál.

Variace bez opakování editovat

  • Variace bez opakování je k-členná skupina utvořená z daných n prvků tak, že v nich záleží na pořadí a žádný z daných prvků se v ní neopakuje.
  • Počet k-členných variací z n prvků:   pro  
  • například: 2členná variace ze 3 prvků a, b, c: (ab), (ba), (ac), (ca), (bc), (cb)  

Variace s opakováním editovat

  • Variace s opakováním je uspořádaná k-tice z n prvků sestavená tak, že každý se v ní vyskytuje nejvýše k-krát. Opět záleží na pořadí.
  • Počet k-členných variací s opakováním z n prvků:   platí i pro  
  • například: 2členná variace s opakováním ze 3 prvků a, b, c: (aa), (ab), (ac), (ba), (bb), (bc), (ca), (cb), (cc)  

Příklady editovat

Příklad 1 editovat

Kolik trojciferných čísel je možné sestavit z číslic 1, 2, 3, 4, jestliže:

a) se v čísle každá cifra může vyskytovat nejvýše jednou

 

b) se v čísle cifry mohou opakovat

 

Příklad 2 editovat

Kolik je možností pro obsazení 1., 2. a 3. místa v závodě s 20 účastníky?

 

Příklad 3 editovat

Posádka lodi potřebuje k dorozumívání vytvořit 50 různých signálů. Budou jim k tomu stačit 4 různobarevné praporky?

  • jednopraporkové signály:  
  • dvoupraporkové signály:  
  • třípraporkové signály:  
  • čtyřpraporkové signály:  
celkem lze vytvořit:   signálů
Na vytvoření 50 signálů budou 4 různobarevné praporky stačit.

Příklad 4 editovat

Kolika způsoby můžete nastavit šestimístný číselný kód trezoru?

 

Algoritmus editovat

Algoritmus pro nalezení všech variací znaků (s opakováním, v jazyku Java)

    public static List<String> variaceSOpakovanim(int trida, String pouzitelneZnaky) {
        List<String> list = new ArrayList<String>((int) Math.pow(pouzitelneZnaky.length(), trida)/*(1)*/);

        if (trida == 0) {
            list.add(""); /*(2)*/
        } else {
            List<String> l = variaceSOpakovanim(trida - 1, pouzitelneZnaky);
            for (char c : pouzitelneZnaky.toCharArray()) { /*(3)*/
                for (String s : l) {
                    list.add(c + s); /*(4)*/
                }
            }
        }
        return list;
    }
  1. Počet variací s opakováním je dán jako počet použitelných prvků umocněný na třídu variace.
  2. Variace nulté třídy je právě jedna: prázdná množina.
  3. Variace s opakováním se dá vnímat jako kartézský součin množiny použitelných prvků s množinou variací ze stejných použitelných prvků, ale s třídou o jednu menší. Z toho vyplývá použití rekurze.
  4. Přidá do výstupního (vraceného) seznamu příslušný prvek, vzniklý spojením jednoho (každého) prvku s jednou (každou) variací nižší třídy.

Literatura editovat

Související články editovat