Otrzymujesz tablicę o długości . Każdy element tablicy należy do jednej z klas. Powinieneś zmienić układ tablicy za pomocą minimalnej liczby operacji wymiany, aby wszystkie elementy z tej samej klasy były zawsze pogrupowane razem, tj. Tworzą ciągłą pod-tablicę.
Na przykład:
Pozostały trzy inne ważne ustalenia.K.
Jak nazywa się ten problem w literaturze? Czy istnieje dla niego wydajny algorytm?
terminology
reference-request
sorting
arrays
Marko Bukal
źródło
źródło
Odpowiedzi:
Uwaga: jest to dowód na twardość i myślę, że istnieją praktyczne algorytmy, takie jak programowanie liczb całkowitych itp.
Biorąc pod uwagę instancję BIN_PACKING, w której chcesz spakować liczb n 1 , … , n K do L pojemników o rozmiarze m 1 , … , m L , i zapewnione jest, że ∑ n i = ∑ m jK n1,…,nK L m1,…,mL , to możemy zaprojektować przykład problemu w następujący sposób:∑ni=∑mj=N
Kluczową obserwacją jest to, że nie ma sensu utrzymywać co najmniej jednej klasy w gnieździe nieporuszonym i przesuwać inne (ponieważ nie zmieni to rozmiaru „kosza”). Tak oryginalne opakowanie bin jest dostępna tylko wtedy, gdy minimalna liczba swapów jest nie większy niż N . Ponieważ wiadomo, że BIN-PACKING jest silnie NP-zupełny , twój problem jest NP-trudny.(N+1)2 N
źródło
Podejrzewam też, że jest to trudne dla NP, ale przy braku pomysłu na dowód, oto kilka szybko obliczalnych dolnych granic, które mogą być przydatne do sprawdzania optymalności rozwiązania heurystycznego lub przycinania wyszukiwania według gałęzi i granic .
Niech klasę zawierać n : i elementy. W każdym prawidłowym rozwiązaniu klasa i musi zaczynać się w pewnej pozycji j . Możemy zatem obliczyć dolną granicę L i na koszt „ustalania” klasy i , wypróbowując wszystkie możliwe pozycje początkowe j , licząc liczbę elementów innych niż i w bloku n i rozpoczynając od pozycji j (każda z tych pozycji będzie wymagał zamiany) i biorąc minimum. To L i można obliczyć dla dowolnego i w O ( ni ni i j Li i j i ni j Li i O(n) czas z zastosowaniem przesuwanego okna, dla całkowitego czasu . Dwie ogólne dolne granice to:O(Kn)
W twoim przykładzie obie granice dają 1 (w drugim przypadku 0,5 można zaokrąglić w górę), co oczywiście jest luźne.
źródło