2017-01-20 10 views
0

add()を呼び出すことによって、配列がランダムな空の位置に塗りつぶされているデータ構造を構築しようとしています。ある位置が満たされると、別のadd()によって上書きされることはありません。 remove(i)を呼び出すと、A [i]の位置が解放されます。 add()とremove()の呼び出しを混在させることができます。ランダムに配列を塗りつぶす

私の最初の考えは、add()が呼び出されるたびに0からn-1の間の数字をランダムに生成することでした。それが空であれば、それを記入してください。一杯になったら、空のものが見つかるまで順次検索してください。しかし、これには2つの問題があります。1)配列がほとんどいっぱいの場合、O(n)時間に近​​づきます。2)ランダム選択は一様ではありません。

2番目の考えは、1からn-1までのシャッフルを使用してこの順番で追加することでしたが、これはremove()をサポートしていません。

これは、add()とremove()に対して一定のパフォーマンスを保証する方法を実装していますか?

答えて

-1

空の配列位置と空の配列位置をリンクリストで区切っておくことができます。ここで、0から(考慮されているリンクリストの長さ、つまり塗りつぶしているか空であるか)をランダムに生成し、これを使用してリストからランダムな位置を選択します。 ここで、塗りつぶしリストから任意の要素を選択し、対応する項目を削除して空のリストに追加します。 リンクリストのトラバーサルにはO(リンクリストの長さ)の時間がかかりますが、add()の実行中は塗りつぶし位置を選択し、remove()を実行すると空の位置を選択する問題は解決します。

0

配列を塗りつぶして、work_array[]としましょう。 filled_positions[]empty_positions[]の2つの補助配列を使用し、work_array[]のカウンターと、num_fillednum_emptyという2つのカウンターを使用して、要素数をfilled_positions[]empty_positions[]とします。アレイが0からインデックスされていると仮定すると、最初はnum_filledは0であり、empty_positions[]は0,1,2、...からn-1,num_emptynです。

  • ランダムな位置に要素を追加する乱数R 0num_empty - 1、包括生成

    1. インデックスを選択empty_positions[r]からです。
    2. num_empty-1未満の場合は、empty_positions[r]empty_positions[num_empty-1]と設定します。
    3. デクリメントnum_empty
    4. セットfilled_positions[num_filled]~i
    5. 増分num_filled
    6. work_array[i]に要素を入力します。ランダムな位置から要素を削除する
    1. 乱数R 0num_filled - 1、包括的に生成します。
    2. インデックスを選択ifilled_positions[r]
    3. num_filled - 1未満の場合は、filled_positions[r]filled_positions[num_filled-1]と設定します。
    4. デクリメントnum_filled
    5. セットempty_positions[num_empty]~i
    6. 増分num_empty

あなたはwork_array_map[i]が別途work_array[i]が満たされた場合に1と0であると、ビット、work_array_map[]の配列を維持することができます。 work_array_map[]を使用すると、一定時間内に要素iが満たされているかどうかを確認できます。

関連する問題