Witam,
Mam problem ze znalezieniem elementu wystepujacego w kazdej tablicy.
A konkretnie tablica wejsciowa wyglada np tak:
> a = [[573, 574], [573, 574], [573], [573, 574]]
Teraz potrzebuje wydobyc tylko “573” bo wystepuje w kazdej z tablic. Ktos ma pomysł jak to zrobic ?
def find_common_number(arrays)
counters = Hash.new(0)
arrays.each do |array|
array.each do |number|
counters[number] += 1
end
end
entry = counters.find { |_, v| v == arrays.size }
entry ? entry[0] : nil
end
find_common_number([[573, 574], [573, 574], [573], [573, 574]])
Algorytm poprawny przy założeniu, że elementy w tablicy się nie powtarzają (w przeciwnym wypadku wymaga przeróbki). Złożoność O(n), gdzie n to sumaryczna liczba elementów we wszystkich tablicach.
W sumie dałoby się go jeszcze trochę podrasować by przerywać poszukiwanie w n-tym kroku gdy już wiadomo że nie ma elementu który występowałby we wszystkich dotychczasowych n tablicach.
Mój pomysł jest taki, żeby zamienić tablice wewnętrzne na zbiory (klasa Set), bo kolejność elementów nie gra tu roli, za to będzie przeprowadzone działanie typowe dla zbiorów, czyli szukanie wspólnego elementu.