ďťż

[php][algorytm postępowania] - Generowanie wszystkich możliwych słów z danych z tablic

       

Podstrony


telcocafe

Mam np tak tablice:

cos[0][0]="l";
cos[0][1]="ł";
cos[1][0]="a";
cos[1][1]="ą"
cos[2][0]="s";
cos[2][1]="ś";

I chce zrobic zeby w innej tablicy zapisaly sie wszystkie kombinacje wyrazow (nie koniecznie musza cos znaczyc), z tym, że cos[0][0] i cos[0][1] to pierwsze litery wyrazu cos[1][0] cos[1][1] to 2 litery etc

czyli np las łas ląs łąs laś ląś etc ma ktos jakis pomysl na pętle?
Użytkownik MikolajOsowski edytował ten post 01 październik 2006, 15:21


<? $cos[0][0]='l'; $cos[0][1]='ł'; $cos[1][0]='a'; $cos[1][1]='ą'; $cos[2][0]='s'; $cos[2][1]='ś'; foreach($cos[0] as $i) { foreach($cos[1] as $j) { foreach ($cos[2] as $k) { $wyrazy[] = $i.$j.$k; } } } foreach ($wyrazy as $wyraz) { echo $wyraz.'</br>'; } ?>
Użytkownik El Mariachi edytował ten post 01 październik 2006, 16:24
działa, ale to co tam dalem to jest tylko przykład ze takich par jak ta:
$cos[1][0]='a';
$cos[1][1]='ą';

jest x czyli jest ich tyle: count($cos)


działa, ale to co tam dalem to jest tylko przykład ze takich par jak ta:
$cos[1][0]='a';
$cos[1][1]='ą';

jest x czyli jest ich tyle: count($cos)


Pomyśl nad rekurencjyjnym rozwiązaniem




Pomyśl nad rekurencjyjnym rozwiązaniem

Oczywiście jak napisał Kodie rekurencyjne rozwiązanie będzie dobre ale jako ciekawostkę wymyśliłem iteracyjny algorytm bazujący na koniunkcji bitowej /bardzo możliwe, że może niepoprawnie się zachowywać bo obliczenia robiłem na szybko na wykładzie, ale dla 3 i 4 elementów jeszcze działa ;) /

<? $cos[0][0]='l'; $cos[0][1]='ł'; $cos[1][0]='a'; $cos[1][1]='ą'; $cos[2][0]='s'; $cos[2][1]='ś'; $cos[3][0]='u'; $cos[3][1]='ó'; for($i=0, $ile = pow(2, count($cos)); $i<$ile; $i++) { $wyraz = ''; for($j=1; $j < $ile; $j*=2) { if($i & $j) { $wyraz .= $cos[log($j,2)][1]; } else { $wyraz .= $cos[log($j,2)][0]; } } $wyrazy[] = $wyraz; } foreach($wyrazy as $a) { echo $a.'</br>'; } ?>

//EDIT: zapomniał bym: Pozdrowienia Kodie - kopę lat :] chyba rok czasu nie byłem na tym forum
Użytkownik El Mariachi edytował ten post 02 październik 2006, 14:48
El Mariachi, Dzinx działa, ale jak mam np taka tablice:
co[0][0]=M co[0][1]=M co[1][0]=i co[1][1]=i co[2][0]=k co[2][1]=k co[3][0]=o co[3][1]=ó co[4][0]=l co[4][1]=ł co[5][0]=a co[5][1]=ą co[6][0]=j co[6][1]=j

To jak powinien wyglądać skrypt, aby sprawdził czy dany wygenerowany wyraz nie istnieje w tablicy? Jesli by istnial to był by pomijany!?

Możesz po prostu wszystkie słowa dodać do tablicy, a na końcu przejechać po niej array_unique() ;)

Albo sprawdzić, czy taka wartość już jest, jeśli tak, to continue ;)
Użytkownik pbnan edytował ten post 03 październik 2006, 17:19

//EDIT: zapomniał bym: Pozdrowienia Kodie - kopę lat :] chyba rok czasu nie byłem na tym forum

hehe fajny pomysł :) Zapamietam sobie ten sposób :) Jeśli działa (a jestem o tym przekonany - sam nie analizowałem:P) to polecam algorytm iteracyjny :) Zużywa mniej pamieci.

Tak tylko przypomniało mi się, żebyś pamiętał, że nie pogenerujesz w rozsądnym słów większych niż 25 znaków

@MikolajOsowski:
Hm.. nie ma wiekszego problemu:

? $cos[0][0]='l'; $cos[0][1]='ł'; $cos[1][0]='a'; $cos[1][1]='ą'; $cos[2][0]='s'; $cos[2][1]='ś'; $cos[3][0]='u'; $cos[3][1]='ó'; for($i=0, $ile = pow(2, count($cos)); $i<$ile; $i++) { $wyraz = ''; for($j=1; $j < $ile; $j*=2) { if($i & $j) { $wyraz .= $cos[log($j,2)][1]; } else { $wyraz .= $cos[log($j,2)][0]; } } $wyrazy[$wyraz] = true; } foreach($wyrazy as $k=>$a) { echo $k.'</br>'; } ?>

Tak można to najszybciej zrobić. Program troche zwolnii (bo używa stringów jako klucze)

BTW. Też pozdrawiam :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.