Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] generowanie kombinacji
1q2w3e4r
post
Post #1





Grupa: Zarejestrowani
Postów: 238
Pomógł: 0
Dołączył: 6.05.2011

Ostrzeżenie: (10%)
X----


Witam

Jak wygenerować wszystkie możliwe kombinacje o zadnej długości z podanej w tablicy znaków?

  1. function generujKombinacje($tablica, $dlugosc)
  2. {
  3.  
  4. echo $ciagi."\r\n";
  5. }
  6.  
  7. $tablica = array('6', '9', '3', 'k', 'd', 'e', 'w', 'b');
  8. generujKombinacje($tablica, 3);


Ten post edytował 1q2w3e4r 22.08.2014, 10:01:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
golabow
post
Post #2





Grupa: Zarejestrowani
Postów: 53
Pomógł: 17
Dołączył: 4.07.2014

Ostrzeżenie: (0%)
-----


Napisałem przykładowe rozwiązanie, zobacz czy Ci odpowiada ( przetestuj ) :

  1. <?php
  2.  
  3. function silnia( $n ) { return !$n ? 1 : $n * silnia( $n - 1 ); }
  4.  
  5. function czyJest( $kombinacje, $tmp )
  6. {
  7. foreach( $kombinacje as $element )
  8. {
  9. if ( $element == $tmp ) return true;
  10. }
  11.  
  12. return false;
  13. }
  14.  
  15. function generujKombinacje($tablica, $dlugosc)
  16. {
  17. $arr = array();
  18. for ( $i = 0; $i < $dlugosc; $i++ ) $arr[$i] = 0;
  19. $len = count( $tablica );
  20. // ilosc kombinacji wzór z Wikipedii :)
  21. $iloscKombinacji = silnia( $dlugosc + $len - 1 ) / ( silnia( $dlugosc ) * silnia( $len - 1 ) );
  22.  
  23. $kombinacje = array();
  24. while ( $iloscKombinacji )
  25. {
  26. $tmp = '';
  27. foreach( $arr as $j ) $tmp .= $tablica[ $j ];
  28. $tmp = str_split( $tmp );
  29. sort( $tmp );
  30. $tmp = implode( '', $tmp );
  31.  
  32. if ( !czyJest( $kombinacje, $tmp ) )
  33. {
  34. $kombinacje[] = $tmp;
  35. $iloscKombinacji--;
  36. }
  37.  
  38. for ( $k = $dlugosc - 1; $k >= 0; $k-- )
  39. {
  40. $arr[$k]++;
  41. if ( $arr[$k] == $len )
  42. {
  43. $arr[$k] %= $len;
  44. }
  45. else break;
  46. }
  47. }
  48.  
  49. return $kombinacje;
  50. }
  51.  
  52. $wynik = generujKombinacje( array('6', '9', '3', 'k', 'd', 'e', 'w', 'b'), 2 );
  53.  
  54. foreach( $wynik as $element ) echo $element.'<br />';
  55.  
  56. ?>


EDIT: porawiłem, teraz powinny być dobre wyniki. Warto wspomnieć że nie jest to optymalne rozwiązanie, ale sam jestem początkujący.

Ten post edytował golabow 24.08.2014, 15:20:43
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 16:46