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