© 2013 All rights reserved.
5

Abecední kombinace znaků (Java/C/PHP)

Jednoduchý algoritmus na vytvoření kombinace zadaných znaků o zadané délce výsledného řetězce.

Pro různé potřeby testování řetězců můžete někdy potřebovat postupně generovat ze vstupních zadaných znaků všechny jejich kombinace.

Uvedu na příkladu:

Mám zadány znaky AB a chci pro ně generovat všechny různé kombinace o délce 4 znaků.

Potřebuji dosáhnout tohoto výsledku:

Algoritmus funguje tak, že si nejprve ze vstupního řetězce(znaky z nichž se kombinace generují) vytvoří pole. Pole obsahuje tolik prvků, kolik je znaků v řetězci.

Stejně tak si vytvoří druhé pole, které obsahuje tolik prvků, kolik je požadovaných znaků v kombinacích. Hodnoty tohoto pole budou reprezentovat indexy v prvním poli, které budou značit znaky.

Na začátku nastavíme hodnoty pole indexů na 0, abychom dosáhli první kombinaci, čili kombinaci pouze prvních znaků ze vstupního řetězce.

Ve funkci budeme neustále měnit indexy tohoto pole a zvyšovat je až do velikosti pole znaků. Potom přejdeme na vedlejší index vlevo.

Vždy po zvětšení každého indexu musíme začít rekurzivně měnit indexy v pravé části od námi měněného indexu a to od konce pole.

Lepší pochopení bude z programu, který by šel řešit jednodušeji bez pole indexů, ovšem tento způsob je přehlednější.

Zdrojový kód v Javě:

Zdrojový kód v Céčku:

Zdrojový kód v PHP:

Comments (5)

Děkuji za článek, zajímavé je různé pojeti v ruznych jazycich. Urcite by se ale hodilo i srovnani rychlosti skriptu. Dale by chtelo vice zminit vyuziti, nejak jsem nepochopil k cemu mi to nekdy bude dobre.

Tohle se mi zrovna hodi k vytvoreni MD5 crackeru, kde jsem potreboval generovat postupne vsechny mozne kombinace, aby jsem mohl porovnavat jejich hashe. diky

Nebylo by to snazší rekurzí na 10 řádků? ;-)

Tak nevím jestli jsi to četl, protože je to řešeno rekurzí.
Ten kód kolem je jenom pro připravení proměnných. Je to schválně rozepsané, aby to bylo pochopitelnější, jak jsem napsal i v textu.

Add comment

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836