Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kombinacje bez powtórzeń + dodatkowy warunek
Forum PHP.pl > Forum > PHP
beginner
Witam serdecznie!

Zamierzam linkować ze sobą kilkadziesiąt stron za pomocą linkowania po "trójkącie", tj strona a -> b -> c -> a (gdzie -> to odnośnik do strony). O ile przy małej ilości stron obliczenie wszystkich kombinacji linków jest proste, przy kilkunastu pojawia się problem. Idea linkowania po trójkącie polega na tym, że gdy strona a linkuje do strony b, to w żadnej innej kombinacji taki link (nie ważne czy a->b czy b->a) nie może wystąpić po raz drugi.

Postanowiłem ugryźć tej problem od strony kombinatoryki - kombinacji bez powtórzeń. Niżej prosty skrypt, który wyświetla takie zbiory trójelementowe (o takie właśnie chodzi) dla tablicy $tab1.
Nie potrafię jednak rozbudować skryptu tak, żeby wykluczyć elementy "niepotrzebne", czyli takie, które zawierają więcej niż jeden powtórzony element. Już tłumaczę najprościej jak się da

123 124 125 134 135 145 234 235 245 345

Są to wszystkie kombinacje bez powtórzeń dla zbioru (1,2,3,4,5), natomiast mi potrzebne są elementy 123, 145 (powtarza się w nich tylko jeden element, jedynka). W każdym innym elemencie są co najmniej dwie liczby występujące w tych zbiorach. Oczywiście wszystko powinno działać dla dowolnej ilości elementów $tab1.

Jedyny pomysł jaki przychodzi mi do głowy to porównywanie każdego elementu z elementami poprzedzającymi go i sprawdzanie (in_array?), czy jego liczby w elementach poprzedzających powtarzają się nie więcej niż jeden raz. Jeżeli tak jest, element zostaje zapisany do jakiejś dodatkowej tablicy. Nie potrafię jednak tego zaimplementować.


  1. <?
  2.  
  3. $tab1 = array(1,2,3,4,5);
  4. $ilosc=count($tab1);
  5.  
  6. $tab2 = $tab1;
  7. $tab3 = $tab1;
  8.  
  9. for($i=0;$i<$ilosc;$i++)
  10. {
  11. $j=$i+1;
  12. while($j<$ilosc)
  13. {
  14. $k=$j+1;
  15. while($k<$ilosc)
  16. {
  17. //wypisanie kombinacji
  18. echo $tab1[$i].''.$tab2[$j].''.$tab3[$k].'<br/>';
  19. $k++;
  20. }
  21. $j++;
  22. }
  23. }
  24. ?>


Powyżej kod wyświetlający kombinacje bez powtórzeń.

Czy ktoś już rozwiązywał podobny problem albo wie jak to ugryźć? Mam nadzieję, że wytłumaczyłem to wystarczająco zrozumiale. Dziękuję z góry.
kowalcook
jeżeli linki będą pobierane np z bazy danych to dlaczego nie dodasz np znacznika


link1 - a
link2 - b
link3 - c
link4 - b
link5 - a itd...,



wtedy możesz zdefiniować aby te linki były wyświetlane tylko i wyłacznie dla danego znacznika a-strona1,b-strona2,c-strona3


czy tak nie byłoby najprościej ?
Quadina
Efekt 5 minut:

  1. $tab = array(1,2,3,4,5,6);
  2. $ilosc = count($tab);
  3. $ret = array();
  4.  
  5.  
  6. for($i=0;$i<$ilosc;$i++){
  7. for($j=$i+1;$j<$ilosc;$j++){
  8. for($k=$j+1;$k<$ilosc;$k++){
  9. $ret[] = $tab[$i].$tab[$j].$tab[$k];
  10. $j=$k+1;
  11. $k=$k+1;
  12. }
  13. }
  14. }
  15. print_r($ret);
  16. /* zwroci:
  17. Array
  18. (
  19.   [0] => 123
  20.   [1] => 145
  21.   [2] => 234
  22.   [3] => 256
  23.   [4] => 345
  24.   [5] => 456
  25. )
  26. */


Jeżeli chodzi o trójkąty to chyba o to chodziło.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.