Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] generowanie kombinacji
1q2w3e4r
post 22.08.2014, 09:52:26
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
djgarsi
post 22.08.2014, 16:55:23
Post #2





Grupa: Zarejestrowani
Postów: 459
Pomógł: 26
Dołączył: 1.06.2009

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


Chwila w Google.

  1. function pc_permute($items, $perms = array()) {
  2. if (empty($items)) {
  3. echo join(' ', $perms) . "<br />";
  4. } else {
  5. for ($i = count($items) - 1; $i >= 0; --$i) {
  6. $newitems = $items;
  7. $newperms = $perms;
  8. list($foo) = array_splice($newitems, $i, 1);
  9. array_unshift($newperms, $foo);
  10. pc_permute($newitems, $newperms);
  11. }
  12. }
  13. }
  14.  
  15. $arr = array('6', '9', '3', 'k', 'd', 'e', 'w', 'b');
  16.  
  17. pc_permute($arr);


--------------------
Go to the top of the page
+Quote Post
1q2w3e4r
post 24.08.2014, 13:51:26
Post #3





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

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


Dzięki za odpowiedź. Już widziałem ten skrypt ale on generuje wszystkie kombinacje o długości ilości kluczy w tablicy i nie da się tego limitować. Ja potrzebuję tak jak pisałem (i podałem w przykładzie) wygenerować wszystkie kombinacje O ZADANEJ DŁUGOŚCI. Czyli z podanej tablicy o długości kombinacji 3, będzie to przykładowo:
669
699
639
6k9
6d9
6e9
6w9
6b9
...itd

Jak podam 2 to będzie przykładowo:
66
69
63
6k
6d
6e
6w
6b
..itd

Go to the top of the page
+Quote Post
golabow
post 24.08.2014, 14:51:39
Post #4





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

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

 



RSS Wersja Lo-Fi Aktualny czas: 1.06.2024 - 08:48