sabat24
11.03.2015, 09:49:16
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:
'bo_1' =>
0 => 'bo_5'
1 => 'bo_1'
'bo_5' =>
0 => 'bo_1'
1 => 'bo_5'
2 => 'bo_17'
'bo_17' =>
0 => 'bo_17'
1 => 'bo_18'
'bo_19' =>
0 => 'bo_19'
1 => 'bo_1'
2 => 'bo_5'
3 => 'bo_17'
Wyjście
0 =>
0 => 'bo_19'
1 => 'bo_1'
2 => 'bo_5'
3 => 'bo_17'
1 =>
0 => 'bo_17'
1 => 'bo_18'
Próbowałem to wykonać za pomocą array_diff i rekurencji, ale dostawałem nieunikalne wyniki i nie zawsze poprawne.
sabat24
11.03.2015, 10:30:41
Po poprawce zwraca także zbiór niepoprawny:
0 =>
0 => string 'bo_5' (length=4)
1 => string 'bo_1' (length=4)
2 => string 'bo_17' (length=5)
3 => string 'bo_19' (length=5)
1 =>
0 => string 'bo_1' (length=4)
1 => string 'bo_5' (length=4)
2 => string 'bo_18' (length=5)
2 =>
0 => string 'bo_17' (length=5)
1 => string 'bo_5' (length=4)
3 =>
0 => string 'bo_17' (length=5)
CuteOne
11.03.2015, 10:33:17
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
11.03.2015, 10:40:33
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
11.03.2015, 10:58:37
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
11.03.2015, 11:05:11
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
11.03.2015, 13:15:51
Nie jest to kod polotów master developera ale działa
http://pastebin.com/uzB22vE6
sabat24
11.03.2015, 14:25:16
Dziękuję. Wygląda bardziej przyzwoicie niż mój kod. Jedno pytanie. Przy powyższych danych wejściowych daje mi następujący rezultat:
(
[c] => 2
)
(
(
[0] => 2
[1] => 3
[2] => 4
[3] => 5
)
(
[0] => 5
[1] => 6
)
(
[0] => 5
[1] => 7
)
)
$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
11.03.2015, 14:38:26
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
sabat24
11.03.2015, 14:44:48
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.