Dane są trzy posortowane tablice liczb całkowitych. Zadanie polega na znalezieniu wszystkich liczb, które występująca na każdej z trzech tablic. Innymi słowy należy znaleźć przecięcie trzech tablic. Zakładamy, że tablice nie mają powtarzających się elementów.
Przykładowo dla następujących tablic:
Program powinien zwrócić, że powtarzającymi się elementami we wszystkich tablicach są elementy 12 oraz 24.
W celu rozwiązania powyższego zadania w czasie liniowym należy zadeklarować trzy indeksy i1, i2 i i3. Po jednym dla każdej tablicy. Następnie jeśli pod wskazanymi indeksami jest ta sama wartość to wszystkie indeksy należy zwiększyć. Jeśli jednak są różne wartości to: indeks i1 zostaje zwiększony, gdy element i1 pierwszej tablicy jest mniejszy od elementu na pozycji i2 w drugiej tablicy. Analogicznie należy postąpić dla tablicy drugiej i trzeciej. Z kolei indeks trzeciej tablicy jest zwiększany, gdy nie są spełnione dwa wcześniejsze warunki. Algorytm kończy działanie, gdy k-ty indeks wykroczy poza granice k-tej tablicy.
Dane są następujące tablice:
Program wykona następujące operacje:
Tablica 1 | Tablica 2 | Tablica 3 | Komentarz |
---|---|---|---|
[0]: 1 | [0]: 3 | [0]: 3 | El. tablicy 1 jest mniejszy od el. tablicy 2, zwiększamy indeks tablicy 1 |
[1]: 3 | [0]: 3 | [0]: 3 | Wszystkie elementy takie same, zwiększamy wszystkie indeksy i zapisujemy trafienie |
[2]: 5 | [1]: 4 | [1]: 6 | El. tablicy 2 mniejszy od el. tablicy 3, zwiększamy indeks tablicy 2 |
[2]: 5 | [2]: 5 | [1]: 6 | Ponownie zwiększamy indeks tablicy 2 |
[2]: 5 | [3]: 12 | [1]: 6 | Zwiększamy indeks tablicy 1 |
[3]: 7 | [3]: 12 | [1]: 6 | Zwiększamy indeks tablicy 1 |
[4]: 9 | [3]: 12 | [1]: 6 | Zwiększamy indeks tablicy 1 |
[5]: 12 | [3]: 12 | [1]: 6 | Brak równości oraz zmiany indeksu tablicy 1 i 2, więc zwiększamy indeks tablicy 3 |
[5]: 12 | [3]: 12 | [2]: 9 | Zwiększamy indeks tablicy 1 |
[5]: 12 | [3]: 12 | [3]: 12 | Wszystkie elementy takie same, zwiększamy wszystkie indeksy i zapisujemy trafienie |
[6]: - | [4]: - | [4]: 15 | Dla podanych indeksów wykonanie iteracji jest niemożliwe |
W podanych tablicach znalezione zostały tylko dwa powtarzające się elementy: 3 oraz 12.
Oto przykładowa implementacja funkcji znajdzWspolneElementy(). Funkcja nie zwraca żadnej wartości, ponieważ znalezione przecięcie tablic wypisuje bezpośrednio na konsole.
(2.) Przygotuj indeksy, a następnie (3.) rozpocznij wyszukiwanie w pętli, aż w której z tablic zabraknie elementów. (4.) Jeśli zostanie znaleziony element we wszystkich tablicach to: (5.) wypisz go i (6. - 8.) zwiększ wszystkie indeksy. (9.) Jednak w przeciwnym przypadku (10. - 16.) zwiększ odpowiedni indeks.
Oto przykładowy kod, który wczyta od użytkownika wszystkie tablice, a następnie wywoła funkcję poszukującą przecięcia trzech tablic.