Permutace

Školení, která pořádám

Dopsal jsem knihu

Občas (např. při luštění šifer) potřebuji pracovat s permutacemi. K tomu lze přistoupit dvěma způsoby – buď si pokaždé napsat funkci, která bude s permutací přímo pracovat tak, jak je potřeba, nebo napsat funkci, která vygeneruje všechny permutace, se kterými budeme pracovat až mimo ni. Druhý způsob je jistě univerzálnější:

<?php
/** Vygenerování permutací
* @param array pole z prvky, ze kterých se má permutace vytvořit, např. range(1, 2)
* @return array pole všech permutací, např. array(array(1, 2), array(2, 1))
* @copyright Jakub Vrána, http://php.vrana.cz/
*/
function permutace($prvky) {
    if (count($prvky) == 1) {
        return array($prvky);
    }
    $return = array();
    foreach ($prvky as $prvek) {
        foreach (permutace(array_diff($prvky, array($prvek))) as $zbytek) {
            $return[] = array_merge(array($prvek), $zbytek);
        }
    }
    return $return;
}

// použití
foreach (permutace(range(1, 3)) as $permutace) {
    echo implode(", ", $permutace) . "\n";
}
?>

Pro vyřazení prvku z pole se používá funkce array_diff, která prvek musí v poli znovu vyhledat. Rychlejší by nejspíš bylo použít funkci array_splice, která prvek vyjme přímo podle jeho pozice, ale bylo by s tím o něco víc práce.

Jakub Vrána, Řešení problému, 25.9.2006, diskuse: 5 (nové: 0)

Diskuse

pif:

moc hezký algoritmus, ale kdybych uvažoval, kde permutace použít v php ;DDD napadlo by mě pravé nefalšované nic. K pozastavení už je jen to, žes to někdy potřeboval.
# 26.9.2006 19:54:41 reagovat

Qels:

šlo by to přepsat do Céčka?
# 20.2.2007 01:18:18 reagovat

pif:

tedy kromě těch sterilních soutěží...
# 26.9.2006 19:55:21 reagovat

Juro Hajdúch:

Kombinatorika je zaujímavá, ale ma napadá (zatiaľ) len jedno použitie - lámanie hesla :-(. Inak dobrá funkcia. Večer sa idem hrať.
# 26.9.2006 20:26:55 reagovat

jux:

johooo, uz nekoho vidim, jak pomoci jednoho z nejpomalejsich skriptovacich jazyku na svete lusti hesla:))
# 23.10.2006 11:01:31 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

© 2005-2010 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.