2013-08-10 7 views
5

Dostajesz zestaw interwałów S. Musisz znaleźć wszystkie przedziały w S, które są zawarte w danym przedziale (a, b) w minimalnej złożoności czasu.Dostajesz zestaw interwałów S. Musisz znaleźć wszystkie interwały w S, które są zawarte w danym przedziale (a, b) w minimalnym czasie złożoności

Można to zrobić w czasie O(n) przez brute force, gdzie n to liczba przedziałów w zestawie S. Ale jeśli mogę wykonać pewne wstępne przetwarzanie, można to zrobić w czasie krótszym niż O(n) np. O(log n) czas?

Początkowo myślałem o interval tree, ale nie sądzę, że jest tu zastosowania, ponieważ drzewo przedziałowe stosowany jest, aby wszystkie przedziały że pokrywa z danego przedziału.

+0

Jak stwierdzono, najlepiej można zrobić, to 'O (n)' bo w najgorszym przypadku, wszystkie elementy 's' musi zostać skopiowany do wyjścia. –

+0

Tak, to prawda. Miałem jednak nadzieję na coś w rodzaju O (logn) + O (m), gdzie m jest liczbą elementów na wyjściu. –

+0

@SteveM należy również zauważyć, że pod względem dużej notacji O, 'O (logn) + O (m) = O (n)', ponieważ m może być tak duże jak n. Wstępny czas przetwarzania jest również dołączany do środowiska wykonawczego, ponieważ jeśli chcesz posortować przedziały lub ułożyć je przy użyciu pewnych struktur danych, to są one również częścią twojego algorytmu. – Fallen

Odpowiedz

5

Możesz zmienić swój problem na płaszczyźnie 2D. Niech (begin, end) każdego interwału będzie punktem dwuwymiarowym. (Zauważ, że wszystkie ważne odstępy skończy się powyżej przekątnej)

Twój Interval-search-problemu przekształca się dobrze studiował prostopadłym zakresie 2D odpytuje z algorytmami, które mają O(sqrt(n)+k) lub O(log^2+n +k) czas pracy, gdzie k jest liczbą punktów zgłaszane.

range query

+0

Niezły pomysł, ale nie znam algorytmu o złożoności mniejszej niż O (k), gdzie k to liczba zgłoszonych punktów. Tak więc Patricia ma rację. – Matthias

+0

Tak, to prawda. Zaktualizowałem swoją odpowiedź, dodając opis k. Ale czasami dane są ładnie dystrybuowane, a twoje zapytania obejmują tylko niewielki zestaw, więc amortyzowany k << n. –

1

Persistent binary search tree można użyć tutaj.

Pre-processing:

  1. Tworzenie pustego trwałe drzewo. Powinien przechowywać interwały posortowane według punktów końcowych.
  2. Sortuj interwały według ich punktów początkowych.
  3. Dla każdego interwału, zaczynając od końca posortowanej listy, utwórz "kopię" trwałego drzewa i dodaj ten odstęp do tej kopii.

Szukaj:

  1. Znajdź punkt przedziału zapytań w posortowanej liście startowej.
  2. Powtórz odpowiednią "kopię" drzewa trwałego od najmniejszego klawisza do końca interwału zapytania.

Złożoność czasu wyszukiwania to O (log (n) + m), gdzie m to liczba elementów na wyjściu.

+0

Wydaje się, że jego złożoność przestrzenna to O (n^2). Proszę, popraw mnie jeśli się mylę. –

+0

@SteveM: Złożoność przestrzeni to O (n * log (n)). Trwałe struktury danych pozwalają tworzyć płytkie "kopie", w których większość danych jest dzielona między "kopiami", więc każda aktualizacja BST wymaga tylko O ​​(log (n)) dodatkowych węzłów. –

Powiązane problemy