Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wszystkie mozliwe kombinacje, algorytm
deniol13
post 5.07.2010, 00:09:24
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 2
Dołączył: 30.11.2009

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


witam, poszukuje skryptu/algorytmu ktory z jakiejs tablicy ktora zawiera integery wszystkie kombinacje bez powtorzen
np

$tab[a] = 1;
$tab[b] = 2;
$tab[c] = 3;

wszystkie kombinacje to
123
213
321
312
231
i moze jeszcze pare
Go to the top of the page
+Quote Post
cojack
post 5.07.2010, 00:22:09
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


http://pl.wikipedia.org/wiki/Kombinacja_be...%C3%B3rze%C5%84

n/c

@edit
a nawet http://pl.wikipedia.org/wiki/Wariacja_bez_...%C3%B3rze%C5%84

Ten post edytował cojack 5.07.2010, 00:25:09


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
paxton
post 5.07.2010, 00:25:58
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 22.06.2009
Skąd: Londyn, UK

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


10 sekund szukania w google
  1. <?php
  2. header('Content-Type: text/plain');
  3.  
  4. function showCombinations($string, $traits, $i)
  5. {
  6. if ($i >= count($traits))
  7. echo trim($string) . "\n";
  8. else
  9. {
  10. foreach ($traits[$i] as $trait)
  11. showCombinations("$string $trait", $traits, $i + 1);
  12. }
  13. }
  14.  
  15. $traits = array
  16. (
  17. array(1, 2, 3, 4),
  18. array(1, 2, 3, 4),
  19. array(1, 2, 3, 4)
  20. );
  21.  
  22. showCombinations('', $traits, 0);
  23. ?>

Go to the top of the page
+Quote Post
set4812
post 5.07.2010, 01:46:02
Post #4





Grupa: Zarejestrowani
Postów: 150
Pomógł: 3
Dołączył: 13.04.2010

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


http://forum.php.pl/index.php?showtopic=15...mp;#entry755035
Go to the top of the page
+Quote Post
thek
post 5.07.2010, 12:48:09
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Set... Mój post jaki linkujesz tyczy wariacji z powtórzeniami. Nie kombinacji z powtórzeniami. A patrząc co chce autor to ma to być wariacja, ale bez powtórzeń (ważna kolejność, nie może się powtarzać element). Jak najprościej zrobić ją? Algorytm:
1. Weź tablicę liczb i usuń duplikaty ( no chyba, że może być kilka wystąpień tej samej liczby, ale wątpię, bo to spowoduje wystąpienie duplikatów w wyniku! )
2. W pętli przesuwaj się po wszystkich elementach tablicy
3. Zastosuj (ilość_elementów-2) takich pętli pomniejszonych o element pętli wyższego rzędu. Jak to miałoby wyglądać?
tablica = (2,4,7,9)
Pętla_1 (2,4,7,9)
Bierzesz 2, Pętla_2 (4,7,9)
Bierzesz 4, Pętla_3 (7,9)
Z tego dostaniesz liczby 2,4,7,9 i 2,4,9,7
Zmienia się Pętla_2, która wskazuje teraz nie na 4, ale 7. Pętla_3 też się zmienia! Zawiera bowiem (4,9)
Mamy więc 2,7,4,9 i 2,7,9,4
Znowu zmiana w Petla_2 z 7 na 9 i po raz kolejny Pętla_3 zmiany uwidacznia (4,7)
Mamy 2,9,4,7 i 2,9,7,4
Zarówno Pętla 2 i 3 doszły do ostatnich elementów, więc zmiana w Pętla_1, z 2 na 4. Lec tak dalej a sam zauważysz jak to ma działać winksmiley.jpg Podpowiem... znów zagnieżdżone rekurencyjnie foreach smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
cojack
post 5.07.2010, 17:02:54
Post #6





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


Co Wy nawet do wzoru nie potraficie podstawić liczb?

  1.  
  2. function silnia( $x) {
  3. if( $x == 0 )
  4. return 1;
  5. return $x * silnia( $x - 1 );
  6. };
  7.  
  8. $n = 3; // czyli mamy 1,2 i 3
  9. $k = 3; // kombinacja 3 cyfr
  10.  
  11. $wynik = ( (silnia( $n ) / silnia( $n - $k ) );


takie trudne?


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
Crozin
post 5.07.2010, 17:49:24
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Co Wy nawet do wzoru nie potraficie podstawić liczb?
Eee.. a wiesz jaka jest różnica pomiędzy obliczeniem ilości tych wariacji, a wygenerowaniem ich?
Go to the top of the page
+Quote Post
cojack
post 5.07.2010, 17:52:29
Post #8





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


Nie ma.


@EDIT a jednak jest ;D

Ten post edytował cojack 6.07.2010, 08:03:09


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
celbarowicz
post 5.07.2010, 21:34:19
Post #9





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


człowieku, to nie są kombinacje, to są permutacje.
Go to the top of the page
+Quote Post
thek
post 6.07.2010, 10:36:49
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To ja po kilku postach naszkicuję szybko algorytm:
1. Weź tablicę i usuń duplikaty.
2. Jeśli tablica ma jakieś elementy weź ją i ustaw ją do przechodzenia w pętli
3. Jeśli tablica ma 1 element wyświetl elementy ze znajdujących się "wyżej" pętli i ten element oraz wróć do pętli wyższego rzędu i przesuń licznik na kolejny element
3. Jeśli ma więcej elementów, tablicę pomniejsz o wybrany element
4. Pomniejszona tablica jest pętlą kolejnego rzędu, czyli wracamy do kroku 2.

Można to optymalizować jak ja zasugerowałem, czyli gdy tablica ma już tylko 2 elementy, to wyświetlamy wszystkie wcześniejsze a owe dwa elementy tylko zamieniamy miejscami w wynikach. Z jednej rekurencji wtedy spadamy dodając 2 wyniki w tym przebiegu.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
celbarowicz
post 7.07.2010, 20:37:07
Post #11





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


szkic niezbyt ambitnego sposobu wypisywania wszystkich permutacji zbioru np:{a,b,c,d,e,...}

w tablicy t1 umieszczamy w t1[1] element a , t1[1]=a
pobieramy następny element ->b , i w nowej tablicy t2 wpisujemy w t2[1] łańcuch ba czyli: t2[1] = ba
a w t2[2] łańcuch ab czyli: t2[2] = ab
---------------------------------------------------------------------------------------------------------------------------------
teraz manewry łańcuchem na elemencie t2[1] = ba pobieramy element c w wpisujemy do tablicy t1

t1[1]=cba
t1[2]=bca
t1[3]=bac
podobnie robimy to z t2[2] = ab t1[4]=cab
t1[5]=acb
t1[6]=abc
--------------------------------------------------------------------------------------------------------------------
wykorzystując poprzednie dane z tablicy t1 i pobierając następny element d mamy:
(teraz dane wprowadzamy ponownie do tablicy t2)
t1[1]=cba daje nam t2[1]=dcba
t2[2]=cdba
t2[3]=cbda
t2[4]=cbad
--------------------------------------------------------------------------------------------------------
t1[2]=bca daje nam t2[5]=dbca
t2[6]=bdca
t2[7]=bcda
t2[8]=bcad
--------------------------------------------------------------------------------------------------------
itd dla t1[3] ,...,t1[6]

=================================================================
przy pobraniu następnego elementu ->e dane będą wpisywane do tablicy t1 a wydłużane będą łańcuchy tablicy t2

pozdrawiam.






Go to the top of the page
+Quote Post
Fifi209
post 7.07.2010, 21:03:19
Post #12





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Masz tutaj dwie metody:

  1. <?php
  2.  
  3. function silnia($x) {
  4. if ($x == 0) {
  5. return 1;
  6. }elseif ($x > 0) {
  7. for ($i=1,$y=1; $i <= $x; $i++) {
  8. $y *= $i;
  9. }
  10. return $y;
  11. }else{
  12. return 0;
  13. }
  14. }
  15.  
  16. function permutation($array) {
  17. $x = array();
  18. $l = silnia(count($array));
  19.  
  20. while (count($x) != $l) {
  21. $temp = implode('', $array);
  22. $temp = str_shuffle($temp);
  23. if (!in_array($temp, $x)) {
  24. $x[] = $temp;
  25. }
  26. }
  27.  
  28. return $x;
  29. }
  30.  
  31. function permutation_r($array) {
  32. static $temp = array();
  33. if (count($temp) != silnia(count($array))) {
  34. $x = implode('', $array);
  35. $x = str_shuffle($x);
  36. if (!in_array($x,$temp)) {
  37. $temp[] = $x;
  38. }
  39. unset($x);
  40. return permutation_r($array);
  41. }else{
  42. return $temp;
  43. }
  44. }
  45.  
  46. echo '<pre>';
  47. $t = permutation(array('a','b','c','d','e','f'));
  48. print_r($t);
  49.  
  50. ?>
  51.  


Jednak z góry piszę, że nie są one optymalne.
permutation będzie działało najprawdopodobniej szybciej od permutation_r - albo przynajmniej mniej pamięci zje.

Ten post edytował fifi209 7.07.2010, 21:03:53


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
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: 13.06.2025 - 00:21