0

Lを、配列key、prev、nextに格納されている長さmの二重リンクリストとします。これらはすべて長さnです。これらの配列が、二重にリンクされたフリーリストFを保持するALLOCATE_OBJECTおよびFREE_OBJECTプロシージャによって管理されているとします。さらに、n個のアイテム[3つの配列で記述でき、正確にmがリストLにあり、他のnmが上にあるとします。フリーリストF.配列の位置1、2、...、mを占めるようにLの項目を移動し、Lがリストされるようにすべての配列のインデックス値を調整するプロシージャCOMPACTIFY_LIST(L、F)を記述します。は同じ順序のままで、Fリストには以前と同じ数の要素が含まれ、配列内の位置m + 1、m + 1、..、nを占めます。

私は2つのポインターを保持するO(n)プログラムしか考えられません。配列キーの先頭にある両方のポインターから始めます。Pointer1は最初に使用可能な空のスペースを探し、次にpointer2はリンクリストの要素を含むこの位置の後の配列の最初のインデックスを探します。次に、この要素をpointer1が指している位置に移動し、pointer1は次の空のスペースを探して続行します。しかし、私が間違っていなければ、この手順にはO(n)時間がかかります。O(m)アルゴリズムは考えられません。

PSはい、これは宿題です。しかし、私は立ち往生しており、いくつかの助けは本当にありがたいです。

4

1 に答える 1

2

Lの各要素[i]を基本配列Aの位置[i]に配置するだけで十分です。Lを読み通し、見つかった各要素を、A内の割り当てられた位置をすでに占めている要素と交換します。これには明らかにO(m)があります。複雑。

于 2013-03-11T21:31:46.863 に答える