Co wiadomo na temat struktur danych, które mogą utrzymywać sekwencję elementów podlegających następującym dwóm operacjom?
- Naciśnij (x): dodaj x na końcu sekwencji i zwróć identyfikator jej pozycji w sekwencji
- Wyodrębnij (S): biorąc pod uwagę nieuporządkowany zestaw identyfikatorów, usuń elementy z tych pozycji z sekwencji i zwróć listę usuniętych elementów w kolejności sekwencji
Jeśli chcesz, możesz myśleć o tym jak o stosie lub kolejce z operacją podziału, która dzieli ją na dwa stosy: operacja wyodrębniania może być wykorzystana do wykonania operacji pop lub dequeue, a wyodrębniona sekwencja elementów może być również umieszczona z powrotem do innego stosu lub kolejki.
Co już wiem: można zachować sekwencję jako podwójnie połączoną listę, gdzie każdy identyfikator jest tylko wskaźnikiem do węzła listy połączonych, a każdy węzeł przechowuje również numer pozycji, który umożliwia szybkie porównanie między pozycjami dwóch niepowiązanych elementów w sekwencji. Aktualizacja numerów pozycji nie jest trudna w miarę postępu struktury danych, dzięki czemu wszystkie są dodatnimi liczbami całkowitymi o maksymalnej wartości , gdzie n jest bieżącą liczbą pozycji na liście. Przy tej strukturze danych jedyną trudną częścią operacji wyodrębniania jest sortowanie wyodrębnionych elementów według ich numerów pozycji. Wyodrębnienie k elementów zajmuje O ( k √oczekiwany losowy czas przy użyciu algorytmu sortowania liczb całkowitych Hana i Thorupa z FOCS 2002, na przykład, a operacja wypychania zajmuje stały czas.
Czego nie wiem: czy można poradzić sobie z ekstraktem w czasie i wcisnąć w czasie stałym? Czy jest literatura na ten temat? Czy to jest tak trudne jak sortowanie liczb całkowitych?
Motywacja: jest to podstawowy krok potrzebny do zamówienia elementów w algorytmie szeregowania Coffmana-Grahama, który ma również zastosowania w rysowaniu wykresów. Trudną częścią Coffmana-Grahama jest uporządkowanie leksykograficzne topologiczne. Można tego dokonać utrzymując dla każdego innego stopnia sekwencję wierzchołków z tym stopniem w podgrodzie indukowanym przez pozostałe wierzchołki. Następnie kilkakrotnie usuń pierwszy wierzchołek z sekwencji wierzchołków zerowo niezależnych i dodaj go do porządku topologicznego; wyodrębnij sąsiadów v ze stopni, do których wcześniej należeli, i wypchnij ich na sekwencję o kolejny mniejszy stopień. Więc O ( k ) czas na operacje wyodrębniania w tej strukturze danych prowadziłby do liniowej implementacji algorytmu Coffmana-Grahama.
Ponieważ pierwotnie pytałem o to, znalazłem artykuł Sethiego z 1976 r. , Który pozwala na implementację algorytmu Coffmana-Grahama w czasie liniowym, i umieściłem go w moim artykule w Wikipedii na temat algorytmu Coffmana-Grahama , więc oryginalna motywacja jest mniej znacząca. Nadal jestem ciekawa, jaka jest odpowiedź.