Znajdź najmniejszą, bezwzględną wartość różnicy A[i] - B[j], czyli
Min(Abs(A[i] - B[j]))Oczywiście najlepsza złożoność algorytmu jak najniższa :)
Pierwszym elementem algorytmów porównujących tablice, zawsze powinno być sortowanie.
Array.Sort(A); Array.Sort(B);Dla pierwszego elementu z tablicy A, szukamy najbliższego elementu z tablicy B.
"Najbliższego" czyli takiego, dla którego wynik obliczony według wzoru
Min(Abs(A[i] - B[j]))będzie mniejszy od od elementu go poprzedzającego i elementu następującego po nim.
Następnie, przechodzimy do kolejnego elementu tablicy A, i dla niego też szukamy elementu "najbliższego".
Tylko, że tego elementu szukamy od miejsca, w którym znaleźliśmy poprzedni "najbliższy".
Nie musimy szukać od początku tablicy ponieważ tablice są posortowane i każdy następny element jest większy od poprzedniego.
Chyba o wiele lepiej niż ja wytłumaczy to kod.
public int FindAbsMin(int[] A, int[] B) { if (A.Length != B.Length) return 0; Array.Sort(A); Array.Sort(B); int result = int.MaxValue; int position = 0; for(int i = 0; i < A.Length; i++) { position = LinearFind(B, A[i], position, ref result); if(position == A.Length - 1) break; } return result; } private int LinearFind(int[] A, int minuend, int startPosition, ref int minDifference) { int result = A.Length - 1; int index = startPosition; int value = Math.Abs(minuend - A[index]); while (value < minDifference) { minDifference = value; result = index; index++; if(index > A.Length -1) break; value = Math.Abs(minuend - A[index]); } return result; }Ponownie dobrneliśmy do końca. Problem rozwiązany można wracać do realu.
Brak komentarzy:
Prześlij komentarz