次の2つの操作の対象となる一連のアイテムを維持できるデータ構造について、何が知られていますか?
- Push(x):シーケンスの最後にxを追加し、シーケンス内の位置の識別子を返します
- Extract(S):順序付けられていない識別子のセットを指定し、それらの位置のアイテムをシーケンスから削除し、削除されたアイテムのリストをシーケンス順に返します
必要に応じて、これを2つのスタックに分割する分割操作を備えたスタックまたはキューと考えることができます。抽出操作を使用してポップまたはデキュー操作を実装でき、抽出されたアイテムのシーケンスも配置できます別のスタックまたはキューに再び戻ります。
既に知っていること:シーケンスを二重リンクリストとして維持できます。各識別子はリンクリストノードへのポインタであり、各ノードには2つの無関係な要素の位置をすばやく比較できる位置番号も格納されます。シーケンス内。データ構造が進行するにつれて位置番号を更新することは難しくありません。すべて最大値正の整数になります。ここで、nはリスト内の現在のアイテム数です。このデータ構造では、抽出操作の唯一の難しい部分は、抽出されたアイテムを位置番号でソートすることです。抽出k個のアイテムがかかりO (kは√たとえば、FOCS 2002のHanとThorupの整数ソートアルゴリズムを使用してランダム化された時間を予想し、プッシュ操作には一定の時間がかかります。
私が知らないこと:時間で抽出を処理し、一定時間でプッシュすることは可能ですか?この問題に関する文献はありますか?整数ソートと同じくらい難しいですか?
動機:これは、グラフ描画にも応用できるCoffman-Grahamスケジューリングアルゴリズムでアイテムを注文するために必要な基本ステップです。Coffman-Grahamの難しい部分は、辞書式トポロジカル順序です。これは、異なる次数ごとに、残りの頂点によって誘導されたサブグラフ内のその次数を持つ頂点のシーケンスを維持することによって実行できます。次に、ゼロ次の頂点のシーケンスから最初の頂点繰り返し削除し、トポロジカル順序に追加します。以前に属していた次数からvの近傍を抽出し、次に小さい次数のシーケンスにプッシュします。したがって、O (k ) このデータ構造の抽出操作の時間は、Coffman-Grahamアルゴリズムの線形時間実装につながります。
もともとこれを尋ねて以来、1976年にSethiがCoffman–Grahamアルゴリズムを線形時間で実装できる論文を見つけ、それをWikipediaのCoffman–Grahamアルゴリズムに関する記事に含めました。しかし、答えが何であるかはまだ知りたいです。