Poniżej znajduje się pytanie dotyczące ćwiczenia, które zostało mi udzielone przez kogoś, i nie jestem pewien, jakie najlepsze rozwiązanie do tego dochodzi:Biorąc pod uwagę zestaw zakresów S i pokrywający się zakres R, znajdź najmniejszy podzbiór w S, który obejmuje R
Biorąc pod uwagę zestaw zakresów:
(npS = {(1, 4), (30, 40), (20, 91) ,(8, 10), (6, 7), (3, 9), (9, 12), (11, 14)}
a biorąc pod uwagę zakres docelowy R (npR = (3, 13)
- czyli zakres począwszy od 3 do 13) Napisz algorytm.. znajdź najmniejszy zestaw zakresów obejmujący zakres docelowy. Wszystkie zakresy w zestawie muszą się pokrywać, aby można je było uznać za obejmujące cały zakres docelowy. (W tym przykładzie, odpowiedź byłaby{(3, 9), (9, 12), (11, 14)}
.
Jaki jest najlepszy sposób, aby rozwiązać ten problem? Myślałam byłoby to zrobić za pomocą algorytmu zachłannego. W naszym przykładzie powyżej, będziemy patrzeć na wszystko liczb, które przecinają się z 3, i wybieraj spośród tych, które mają najwyższą wartość maksymalną, a następnie zrobilibyśmy to samo z tym, którego właśnie wybieraliśmy, więc odkąd wybraliśmy (3, 9), teraz chcemy znaleźć wszystkie zakresy przecinają się 9, a spośród nich wybieramy ten, który ma najwyższą maks. W tej iteracji wybraliśmy (9, 12). Robimy to samo z tym i stwierdzamy, że następny zakres przecina 12 , z najwyższym maksimum wynosi (11, 14).Po tej iteracji widzimy, że 14 jest większe niż 13 (maksimum naszego zakresu), więc możemy się zatrzymać.
Problem z tym algorytmem polega na tym, jak efektywnie wyszukiwać zakresy przecinające się? Jeśli spróbujemy wyszukiwania liniowego, otrzymamy algorytm, który jest O(n^2)
. Moja następna myśl polegała na tym, by za każdym razem, gdy przechodzimy przez pętlę, wykreślać każdy z naszych przecinających się zakresów z naszej listy. Tak więc w pierwszej iteracji przechodzimy przez (1, 4) i (3, 9). W następnej iteracji przechodzimy przez: (9, 12), (3, 9) i (8, 10). Tak więc ostatnia iteracja, wszystko, co musimy przejrzeć, to: {(30, 40), (20, 91), (6, 7)}. Moglibyśmy uczynić to jeszcze bardziej efektywnym, również poprzez wykreślenie wszystkiego, co ma min> 13, i maks. < 3. Problem w tym, że to wciąż może nie wystarczyć. Nadal istnieje potencjalny problem polegający na posiadaniu dużej liczby zduplikowanych sekwencji w granicach naszego zakresu. Jeśli nasza lista zakresów zawierała coś w rodzaju {(6, 7), (6, 7), (6, 7), (6, 7), (6, 7)}, musielibyśmy przejrzeć te za każdym razem , chociaż nie są dla nas przydatne. Nawet gdybyśmy mieli przechowywać tylko unikalne wartości (umieszczając je wszystkie w zestawie), moglibyśmy mieć naprawdę duży zasięg, z szeregiem zakresów, które znajdują się w naszym zakresie docelowym, ale mamy również jeden zakres wewnątrz tego rozpiętości. cały zakres docelowy.
Jaki byłby skuteczny sposób zapytania naszych zakresów? A może, jaki byłby skuteczniejszy algorytm rozwiązania tego problemu?
można ważne rozwiązanie to '(8,10)' zamiast '(9,12)' w przykładzie? –
Elementy zestawu muszą się pokrywać. Gdyby nie, nie obejmowałyby całego zakresu. Więc jeśli zawarlibyśmy '(8, 10)' to nadal musiałoby zawierać '(9, 12)'. Gdybyśmy to zrobili, byłby to zbiór wielkości 4, a nie wielkości 3. Nie jest to już zatem najmniejszy możliwy zbiór zakresów obejmujący zakres '(3, 13)'. – Ephraim