Biorąc pod uwagę N tablic o rozmiarze N i wszystkie są posortowane, jeśli nie pozwala ci na użycie dodatkowej przestrzeni, w jaki sposób znajdziesz ich wspólne dane wydajnie lub z mniejszą złożonością czasu ?Znajdź wspólne elementy w N posortowanych tablicach bez dodatkowej przestrzeni
Dla ex:
1. 10 160 200 500 500
2. 4 150 160 170 500
3. 2 160 200 202 203
4. 3 150 155 160 300
5. 3 150 155 160 301
To pytanie wywiad, znalazłem kilka pytań, które były podobne, ale nie obejmują dodatkowych warunków wejścia są sortowane ani nie jest w stanie korzystać z dodatkowej pamięci.
Nie mogłem wymyślić żadnego rozwiązania mniejszego niż złożoność O (n^2 lg n). W tym przypadku wolałbym iść z najprostszego rozwiązania, które daje mi tej złożoności, który jest:
not_found_flag = false
for each element 'v' in row-1
for each row 'i' in the remaining set
perform binary search for 'v' in 'i'
if 'v' not found in row 'i'
not_found_flag = true
break
if not not_found_flag
print element 'v' as it is one of the common element
Możemy to poprawić poprzez porównanie wartości minimalne i maksymalne w każdym rzędzie i zdecydować, czy na podstawie tego, że jest możliwe, aby liczba "num" mieściła się między "min_num" a "max_num" tego wiersza.
Przeszukiwanie binarne -> O (log n) Do przeszukiwania 1 num do n-1, wiersze: O (nlogn) binarne wyszukiwania dla każdej liczby z pierwszego rzędu: O (n2logn)
I wybrany pierwszym rzędzie możemy wybrać dowolny wiersz i jeśli w żadnym z wierszy (N-1) nie znaleziono żadnego elementu wybranego wiersza, to tak naprawdę nie mamy wspólnych danych.
potrzebujesz "trochę" dodatkowej przestrzeni do przechowywania (możliwych) wspólnych elementów ... –
@M itchWheat. Proszę spojrzeć na powyższy pseudo kod. Jeśli dobrze nam idzie po prostu drukowanie wspólnych elementów, czy naprawdę potrzebujemy dodatkowej przestrzeni dyskowej? – user1071840
Naprawdę zapisujesz wszystko przez binarne wyszukiwanie .. ponieważ musisz znaleźć wszystkie typowe elementy, po prostu skanuj posortowaną tablicę i wykonaj w O (n) – smk