Permutace
Školení, která pořádám 
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.
Diskuse
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.
Qels:
šlo by to přepsat do Céčka?
tedy kromě těch sterilních soutěží...
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ť.
jux:
johooo, uz nekoho vidim, jak pomoci jednoho z nejpomalejsich skriptovacich jazyku na svete lusti hesla:))
josef:
Mám jednu prosbu, potřeboval bych vědět jednu věc ze života. Byl jsem v restauraci se dvěma kamarádama a číšník měl 9 druhů různých nápojů, od sladkých až po ty nejtvrdší. Tyto nápoje nám poprvé rozlil tak, že každý jsme měli ve sklenici tři druhy nápojů. Dohromad tedy devět. Otázka zní, kolikrát musí číšník nalét všech devět nápojů do skleniček, po třech nápojích do skleničky, aby všichni tři hosté měli dohromady jinou skladbu nápoje ve skleničkách. Je jedno jestli ve skleničce bude nápoj nahoře, uprostřed nebo dole( např. alžírská káva vaječný koňak- káva- mléko nebo šlehačka. Obsah sklenice se může i zamýchat. nevím jak to vypočítat domnívám se že se jedná o permutace. Dík za odpověd