Przez jakiś czas myślałem o następującym problemie i nie znalazłem rozwiązania wielomianowego. Tylko brutalne źródło. Próbowałem też zredukować problem NP-Complete bez powodzenia.
Oto problem :
Masz posortowany zestaw par dodatnich liczb całkowitych.
Poniższy operacja może być zastosowana do pary: Swap(pair)
. Zamienia elementy pary, więc stanie się
Kiedy para w zestawie zostanie zamieniona, zestaw zostanie automatycznie ponownie posortowany (zamieniona para jest nie na miejscu i zostanie przeniesiona na swoje miejsce w zestawie).
Problem polega na sprawdzeniu, czy istnieje sekwencja, która, zaczynając od jakiejś pary, zamienia cały zestaw, z następującym warunkiem:
Po zamianie pary następna para do zamiany musi być albo następcą, albo poprzednią parą w zestawie.
Byłoby wspaniale znaleźć rozwiązanie problemu wielomianowego w czasie lub zredukować do niego problem NP-Complete.
Uwaga:
to już problem decyzyjny. Nie chcę wiedzieć, która sekwencja jest: tylko jeśli sekwencja istnieje.
Przykład sortowania zestawu po zamianie pary
Jeśli zamienię pierwszą parę, staje się to: , a po posortowaniu zestawu (umieszczeniu posortowanej pary w nowej pozycji) mamy:
Następnie muszę zamienić parę (poprzednik) lub ( 7 , 8 ) (sukcesor) i powtarzać proces, aż wszystkie pary zostaną zamienione (jeśli to możliwe).
Ważne:
Nie możesz zamienić już zamienionej pary.
Jeśli istnieje sekwencja operacji „zamiany”, wówczas wszystkie pary należy zmienić na raz i tylko raz.
Przykład, w którym nie można zamienić wszystkich par
( 1 , 4 ) ( 3 , 2 ) ( 5 , 5 )
źródło
Odpowiedzi:
... Przeszukałem pewne wzorce, aby zbudować redukcję problemu NPC, ale nie znalazłem sposobu na przedstawienie „przepływu” za pomocą „rozwidlenia” ...
Tak więc (po pracy) jest to algorytm wielomianowy ...
ALGORYTM
Skrzynie:
Zastosuj ten sam rezonans przy każdym ruchu.
ZŁOŻONOŚĆ
Przepływy nad każdym otworem można wstępnie obliczyć w O (N) i użyć ponownie przy każdym skanie.
Pętle to:
KOD
Oto działająca implementacja algorytmu Java:
źródło
To nie jest rozwiązanie, ale przeformułowanie, które pozwala uniknąć wyraźnego wzmianki o operacjach wymiany i sortowania. Zacznij od posortowania całej połączonej listy nazw plików i ich zamienionych wersji, a następnie zidentyfikuj każdą nazwę pliku za pomocą indeksu na tej liście. Następnie dwa pliki są sąsiadami, jeśli wszystkie stare nazwy plików między nimi zostały już zniszczone i jeśli żadna z nowych nazw plików między nimi nie została jeszcze utworzona. Przeformułowany problem jest następujący:
źródło