wtorek, 5 czerwca 2012

Zadanie 2 - szukanie najbliższych wartości

Dane są tablice A i B o tej samej długości.
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