Problemy 3sum-trudne w geometrii
Kiedy rozwiązujemy jakiś problem informatyczny, często naszym celem jest podanie jak najefektywniejszego algorytmu. Jednak czasem możemy natknąć się przy tym na „ścianę” – danego problemu nie da się rozwiązać tak efektywnie, jak byśmy tego chcieli. Najpowszechniej znanym przykładem opisanego zjawiska jest klasa problemów NP-zupełnych. O problemach z tej klasy (a należy do niej wiele naturalnych i praktycznych zagadnień) podejrzewa się, że nie da się ich rozwiązać w czasie wielomianowym względem rozmiaru danych wejściowych. Niestety, tylko podejrzewa się, a rozstrzygnięcie tej hipotezy (znanej też jako ?) jest obecnie najsłynniejszym otwartym problemem informatyki teoretycznej.
Na szczęście wiele ważnych problemów obliczeniowych umiemy rozwiązywać w czasie wielomianowym. Jednak w praktyce wielomian wielomianowi nierówny – jest przecież istotne, czy dany problem umiemy rozwiązać w czasie czy też w czasie Okazuje się, że także w przypadku problemów rozwiązywalnych w czasie wielomianowym (tzw. klasa problemów P) znane są pewne narzędzia pozwalające stwierdzić, że danego problemu zapewne nie da się rozwiązać w czasie szybszym niż taki a taki, a jeśli nawet się da, to jest to bardzo trudne.
W tym artykule skupimy naszą uwagę na następującym problemie:
Problem (3SUM). Dany jest zbiór złożony z liczb całkowitych. Czy istnieją takie liczby że
Wszystkie omawiane w tym artykule problemy mają charakter decyzyjny, tzn. odpowiedzią w każdym z nich jest pojedyncza wartość logiczna. Na potrzeby naszego artykułu przyjmiemy następującą definicję redukcji problemu:
Definicja. Powiemy, że problem można zredukować do problemu w czasie jeśli dowolną instancję (czyli dane wejściowe) problemu o rozmiarze można przekształcić w czasie w stałą liczbę instancji problemu o rozmiarze tak, żeby na podstawie odpowiedzi dla wyznaczonych instancji problemu można było udzielić odpowiedzi dla rozważanej instancji problemu
Będziemy wówczas pisali, że co oznacza tyle, że problem jest co najmniej tak trudny jak problem gdyż jeśli umiemy w czasie rozwiązać problem to umiemy w takim samym czasie rozwiązać problem Jeśli oraz to będziemy pisali, że
Problemem, który będziemy redukować do innych zagadnień, jest wspomniany już problem . Przez wiele lat znany był algorytm rozwiązujący ten problem w czasie (patrz zadanie 1 na marginesie) i uważano, że nie da się go rozwiązać w złożoności mniejszej niż Wprowadzono też klasę problemów -trudnych, czyli problemów, do których można zredukować problem w czasie Od 2005 roku wiadomo jednak, że problem można rozwiązać troszeczkę szybciej, a mianowicie w czasie
Mimo tego usprawnienia wciąż nie widać nadziei na znalezienie algorytmu rozwiązującego ten problem w czasie istotnie lepszym niż
Zadanie 2. W problemie elementy mogą się powtarzać. Nie ma to jednak większego znaczenia, gdyż w czasie można łatwo identyfikować instancje problemu, dla których istnieje rozwiązanie z powtarzającymi się elementami. Jak to zrobić?
Będziemy także używać następującego bliźniaczego problemu , który jest równoważny z problemem (tj. ):
Problem. Dane są trzy zbiory liczb całkowitych zawierające łącznie elementów. Czy istnieją liczby i takie że
Zadanie 3. Udowodnij, że , tzn. pokaż, jak wykonać obie redukcje. Przykłady różnych redukcji znajdziesz w dalszej części artykułu.
Problemy, które będziemy rozważać w dalszej części tekstu, mają charakter geometryczny. Jako pierwszy rozpatrzymy problem nazywany – podstawowy problem -trudny w geometrii, służący jako narzędzie do dowodzenia -trudności innych problemów. Jest on określony następująco:
Problem. Danych jest punktów kratowych położonych na prostych i Czy istnieje prosta inna niż pozioma przechodząca przez jakieś trzy spośród tych punktów?
Po chwili namysłu nietrudno dostrzec tu podobieństwo do problemu . Nie jest to przypadek; zachodzi bowiem . Przeprowadzimy tylko redukcję , redukcja w drugą stronę jest właściwie taka sama. Wystarczy mianowicie dla każdej liczby wybrać punkt na prostej dla każdej liczby – punkt a dla każdej liczby – punkt patrz rysunek 1. Punkty i są współliniowe, gdy
czyli dokładnie gdy Stąd odpowiedź dla otrzymanej instancji problemu jest pozytywna wtedy i tylko wtedy, gdy pozytywna jest odpowiedź dla odpowiadającej jej instancji problemu , a to jest dokładnie to, co chcieliśmy uzyskać.
Problem , jakkolwiek użyteczny, nie jest sam w sobie nadmiernie interesujący. Dużo ciekawszy jest podobny do niego następujący problem:
Problem (3PointsOnLine). Na płaszczyźnie danych jest punktów. Czy istnieje prosta przechodząca przez jakieś trzy spośród tych punktów?
Ten problem także jest -trudny; tym razem redukcję przeprowadzimy wprost z problemu . Niech będzie instancją problemu . Dla każdej liczby rysujemy na płaszczyźnie punkt Zbadajmy, kiedy trzy różne tak otrzymane punkty i są współliniowe:
Okazuje się zatem, że punkty i są współliniowe wtedy i tylko wtedy, gdy liczby stanowią rozwiązanie problemu . W ten sposób otrzymujemy żądaną redukcję problemu do problemu , pod warunkiem, że w tym pierwszym problemie interesują nas tylko trójki różnych liczb. To jednak możemy zapewnić (patrz zad. 2).
Wytrawny znawca geometrii natychmiast zauważy, że -trudność problemu implikuje bezpośrednio -trudność dualnego problemu:
Problem (dualny 3PointsOnLine). Na płaszczyźnie danych jest prostych. Czy któreś trzy proste przecinają się w jednym punkcie?
Zadanie 4. Określmy przekształcenie geometryczne które punktowi przyporządkowuje prostą a prostej przyporządkowuje punkt Udowodnij, że punkt leży na prostej wtedy i tylko wtedy, gdy prosta przechodzi przez punkt (Więcej na temat tej dualności Czytelnik znajdzie w numerze 8/2013 Delty.)
Wróćmy teraz do problemu . Skoro reklamowaliśmy go jako przydatne narzędzie w geometrii, to najwyższy czas, aby podać kilka jego zastosowań. Wykazaliśmy już, że jest to problem -trudny. Jeśli zatem pokażemy redukcję z tego problemu do jakiegoś innego problemu geometrycznego działającą w czasie to w ten sposób wykażemy, że ów drugi problem również jest -trudny. Pierwszym problemem z tej serii, który weźmiemy pod lupę, jest:
Problem (Separator). Na płaszczyźnie danych jest odcinków. Czy istnieje prosta nieprzecinająca żadnego z nich, dzieląca zbiór tych odcinków na dwa niepuste podzbiory? Jeśli chcemy, możemy założyć, że podane odcinki są parami rozłączne.
Sprowadzimy problem do problemu . Tym razem redukcja będzie działać w czasie gdyż wymagać będzie sortowania. Posortujemy punkty na każdej z prostych poziomych i połączymy pary kolejnych punktów odcinkami w taki sposób, żeby między każdymi dwoma kolejnymi odcinkami występował bardzo mały odstęp, o długości równej Widzimy już, że przy tej konstrukcji prosta rozdzielająca zbiór odcinków, przechodząca przez trzy odstępy, odpowiada trójce punktów współliniowych należących do różnych prostych poziomych. Należy jeszcze zadbać o wyeliminowanie poziomych prostych rozdzielających. Wystarczy w tym celu umieścić dwa pionowe odcinki po bokach konstrukcji i ustawić je „na zakładkę” z odcinkami poziomymi, tak aby z kolei wyeliminować trywialne proste rozdzielające pionowe (Rys. 2). W ten sposób wykazaliśmy, że .
Kolejny przykład. Okazuje się, że problem możemy zredukować do następującego, całkiem naturalnego i mającego liczne zastosowania praktyczne problemu:
Problem (PlanarMotionPlanning). Na płaszczyźnie danych jest odcinków-przeszkód i jeden odcinek reprezentujący robota. Czy robot może się przedostać z zadanej pozycji początkowej do zadanej pozycji końcowej, przemieszczając się jedynie za pomocą ciągłych przesunięć i obrotów bez dotykania żadnej z przeszkód? Znów, jeśli chcemy, możemy założyć, że odcinki-przeszkody są parami rozłączne.
Redukcja jest tutaj podobna jak poprzednio. Przeszkodami będą odcinki poziome z wcześniejszej redukcji. Robota umieścimy poniżej całej konstrukcji, a jego celem będzie przedostanie się powyżej konstrukcji. Sam robot będzie na tyle długi, żeby nie mógł przedostać się na drugą stronę inaczej niż tylko przez trzy odstępy naraz. Należy jeszcze zadbać, aby robot nie mógł ominąć całej konstrukcji bokiem. W tym celu trzeba poniżej i powyżej konstrukcji zbudować „klatki” uniemożliwiające ucieczkę robota do „nieskończoności”. W ten sposób otrzymujemy wniosek, że .
To, co przedstawiliśmy do tej pory, to tylko niewielka grupa znanych problemów -trudnych. Dla Niestrudzonych Czytelników mamy w zanadrzu jeszcze kilka innych takich problemów – tym razem już dowody pominiemy. Zacznijmy od jeszcze jednego pomocniczego problemu -trudnego:
Problem (SegmentsContainPoints). Na prostej danych jest punktów i parami rozłącznych przedziałów. Czy istnieje wektor, o który można przesunąć wszystkie zadane punkty, tak aby każdy z nich znalazł się w jakimś przedziale?
Problem ten można zredukować do każdego z następujących zagadnień typu :
Problem (PolygonContainment). Na płaszczyźnie dane są dwa wielokąty, odpowiednio o i bokach. Mamy do dyspozycji pewien zestaw izometrii płaszczyzny. Czy za pomocą tych izometrii możemy pierwszy z tych wielokątów umieścić wewnątrz drugiego, przy założeniu, że:
- (a)
- wielokąty są dowolne i dopuszczamy dowolne przesunięcia;
- (b)
- wielokąty są wypukłe i dopuszczamy dowolne obroty;
- (c)
- wielokąty są wypukłe i dopuszczamy dowolne obroty i przesunięcia?
O wersji tego problemu, w której wielokąty są wypukłe i dopuszczamy dowolne przesunięcia (ale nie obroty), można przeczytać w artykule Tomasza Idziaszka „Zawieramy wielokąty”.
Zadanie 7. Opisz redukcję problemu do problemu w wersji (a). Redukcja powinna działać w czasie Wskazówka: szukane wielokąty mają kształt grzebieni.
A już na sam koniec kilka problemów -trudnych typu :
- (a)
- Czy dany zbiór dwustronnie nieskończonych pasków (o różnych szerokościach i kierunkach) pokrywa zadany prostokąt?
- (b)
- Czy dany zbiór trójkątów pokrywa zadany trójkąt?
- (c)
- Czy pole sumy danych trójkątów jest mniejsze od ustalonej liczby?
- (d)
- Czy suma danych trójkątów zawiera jakąś dziurę?
- (e)
- Danych jest półpłaszczyzn. Czy istnieje punkt płaszczyzny pokryty przez co najmniej spośród tych półpłaszczyzn?