Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wszystkie części wspólne podzbiorów
Forum PHP.pl > Forum > PHP
sabat24
Interesuje mnie, czy jest gotowy algorytm (na wzór Longest common substring), który operowałby bezpośrednio na tablicach z nieposortowanymi elementami? Przykład dużo bardziej rozjaśni, czego poszukuję:
Wejście:
  1. 'bo_1' =>
  2. 0 => 'bo_5'
  3. 1 => 'bo_1'
  4. 'bo_5' =>
  5. 0 => 'bo_1'
  6. 1 => 'bo_5'
  7. 2 => 'bo_17'
  8. 'bo_17' =>
  9. 0 => 'bo_17'
  10. 1 => 'bo_18'
  11. 'bo_19' =>
  12. 0 => 'bo_19'
  13. 1 => 'bo_1'
  14. 2 => 'bo_5'
  15. 3 => 'bo_17'


Wyjście
  1. 0 =>
  2. 0 => 'bo_19'
  3. 1 => 'bo_1'
  4. 2 => 'bo_5'
  5. 3 => 'bo_17'
  6. 1 =>
  7. 0 => 'bo_17'
  8. 1 => 'bo_18'


Próbowałem to wykonać za pomocą array_diff i rekurencji, ale dostawałem nieunikalne wyniki i nie zawsze poprawne.
sabat24
Po poprawce zwraca także zbiór niepoprawny:

  1. 0 =>
  2. 0 => string 'bo_5' (length=4)
  3. 1 => string 'bo_1' (length=4)
  4. 2 => string 'bo_17' (length=5)
  5. 3 => string 'bo_19' (length=5)
  6. 1 =>
  7. 0 => string 'bo_1' (length=4)
  8. 1 => string 'bo_5' (length=4)
  9. 2 => string 'bo_18' (length=5)
  10. 2 =>
  11. 0 => string 'bo_17' (length=5)
  12. 1 => string 'bo_5' (length=4)
  13. 3 =>
  14. 0 => string 'bo_17' (length=5)
CuteOne
Co dokładnie ma być na wyjściu, bo twój przykład jest dość niejasny, i można go interpretować na kilka sposobów
sabat24
Każda "podtablica" jest swoistym podzbiorem, stanowiącym pewną całość. Czyli mamy zbiory (prefix 'bo_' pominę, bo jest nieistotny i tak, a mogą być tam inne wartości):
a = {5, 1}
b = {1, 5, 17}
c = {17, 18}
d = {19, 1, 5, 17}

Zbiór d zawiera w sobie całkowicie zbiór a oraz b, zatem do wyjścia powinien zostać wybrany zbiór d. Zbiór c nie zawiera się w całości nigdzie, więc także powinien być dodany do wyniku. Kolejność w podzbiorach nie ma znaczenia. Tzn. {5, 1} jest równe {1, 5}.
Pyton_000
czyli na wyjściu powinien być zbiór który nie zawiera się w żadnym innym zbiorze oraz zbiór który zawiera maksymalną ilość podzbiorów zawierających się w całości?
sabat24
Zgadza się. Oczywiście zarówno zbiorów, które nie zawierają się w innych zbiorach w całości może być kilka, jak i może być kilka różnych zbiorów, które posiadają "w sobie" maksymalną liczbę podzbiorów. Np.
wejście:
a = {1, 2, 3}
b = {2, 3, 5}
c = {1, 2, 3, 4}
b = {2, 3, 4, 5}
e = {5, 6}
f = {5, 7}

powinno dać wyjście:

{1, 2, 3, 4}, {2, 3, 4, 5}, {5, 6}, {5, 7}
Pyton_000
Nie jest to kod polotów master developera ale działa smile.gif

http://pastebin.com/uzB22vE6
sabat24
Dziękuję. Wygląda bardziej przyzwoicie niż mój kod. Jedno pytanie. Przy powyższych danych wejściowych daje mi następujący rezultat:
  1. (
  2. [c] => 2
  3. )
  4. (
  5. [b] => Array
  6. (
  7. [0] => 2
  8. [1] => 3
  9. [2] => 4
  10. [3] => 5
  11. )
  12.  
  13. [e] => Array
  14. (
  15. [0] => 5
  16. [1] => 6
  17. )
  18.  
  19. [f] => Array
  20. (
  21. [0] => 5
  22. [1] => 7
  23. )
  24.  
  25. )


$maxArrays zawiera zbiór c, ale posiada tylko wartość 2
$none jest w porządku, ale ląduje tam zbiór b, który powinien być chyba w $maxArrays

Generalnie dla mnie nie ma to znaczenia, bo i tak sobie mogę pobrać orginalne dane ze zbioru c i też nie muszę mieć podziału na dwie zmienne, więc nieważne gdzie finalnie wyląduje b. Pytam z ciekawości, czy taki jest zamierzony efekt?
Pyton_000
nie bo B nie zawiera się w żadnym zbiorze w całości,

a w maxArrays masz tylko klucze zbiorów które mają maksymalną ilość zbiorów w których dany zbiór się zawiera , jak podzielisz przez /2 to dostaniesz ile zbiorów zawiera się w tym zbiorze smile.gif
sabat24
Mój błąd. W przykładzie dałem 2 zbiory z kluczem B (przez co jeden nadpisywał drugi), a powinno być D dla czwartego zbioru. Wieczorem zrobię jeszcze różne testy. Jeśli nie obrazisz się za symboliczną zapłatę, to podeślij mi proszę nr konta w PW.
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.