2010-07-24 14 views

Odpowiedz

17

Oto krótki opis algorytmu przecięcia przedstawionego w DuduAlul linku „s.

Rozwiązanie wymaga użycia drzewa wyszukiwania zdolnego do wykonywania zapytań dotyczących zakresu. Zapytanie zakresowe prosi o wszystkie elementy z wartościami między K1 i K2, i powinno być operacją O (R + log N), gdzie N jest całkowitą liczbą elementów drzewa, a R jest liczbą wyników.

Algorytm wykorzystuje podejście Przesunięcie:

1) Sortuj wszyscy lewej i prawej krawędzi prostokąta, w zależności od ich wartości X, w liście L.

2) Utwórz nowy pusty szukaj zakres drzewa T, o Y zamawiania wierzchołki prostokąta/podestylacyjnej

3) Tworzenie nowych zbiór pusty wynik RS unikalnych par prostokątnych

4) Traverse L w porządku rosnącym. Dla wszystkich V w l:

      Jeśli V.isRightEdge()

            T.remove (V.rectangle.top)

            T .remove (V.rectangle.bottom)

      inny

            Dla wszystkich U (w T.getRange V.rectangle.top, V.rectangle.bottom)

                  RS.add (< V.rectangle, U.rectangle>)

          T.add (V.rectangle.top)

            T.add (V.rectangle.bottom)

5) powrót RS


Złożony czas O (R + N log n), gdzie R to rzeczywista liczba skrzyżowań.

- EDIT -

prostu zorientowali się, że rozwiązanie nie jest w pełni poprawne - test skrzyżowanie w drzewie T strzela niektórych przypadkach. Drzewo powinno zachowywać odstępy Y zamiast wartości Y, najlepiej powinno być to Interval Tree.

+0

To jest dobra odpowiedź. Znalazłem go także na ulotce z klasy _Hacking a Google Interview_ from csail.mit.edu –

Powiązane problemy