配列の初期化を保存する


19

私は最近、初期化する必要のない配列を持つことができる、つまり、各メンバーをデフォルト値に設定しようとする時間を費やすことなく使用できることを読みました。つまり、初期化せずにデフォルト値で初期化されたかのように配列の使用を開始できます。(申し訳ありませんが、これをどこで読んだか覚えていません)。

たとえば、なぜそれが驚くべきことなのかについて:

範囲の整数の最悪のケースハッシュテーブル(各挿入/削除/検索用)をモデル化しようとしているとします 。O(1)[1,n2]

サイズビットの配列を割り当て、個々のビットを使用してハッシュテーブル内の整数の存在を表すことができます。注:メモリの割り当てはO1 時間と見なされます。n2O(1)

これで、この配列をまったく初期化する必要がなかった場合、このハッシュテーブルでの操作のシーケンスは、最悪の場合On )になります。nO(n)

したがって、実際には、「完全な」ハッシュ実装があります。これは、操作に対して Θ n 2スペースを使用しますが、On 時間で実行されます。nΘ(n2)O(n)

通常、ランタイムは少なくともスペース使用量と同じくらい悪いことが予想されます!

注:上記の例は、スパースセットまたはスパースマトリックスの実装に使用される可能性があるため、理論的に興味深いだけではありません。

質問は次のとおりです。

初期化ステップをスキップできるデータ構造のような配列を持つことはどのように可能ですか?


@Aryabhataあなたが言及したリファレンスは何ですか?
ウリ

1
「メモリの使用」は「割り当てられたがアクセスされたことのないメモリ」と同じではないため、動機付けの「パラドックス」はまったく存在しないと思います。
ラファエル

1
最初の段落はかなり明確だと思います。実際に配列をデフォルト値で埋めるのに時間をかけずに、デフォルト値を設定してください。答えは、ケースには他の誰かが、私は前にそれを書く時間があり、ここではscholar.google.co.uk/...私のブログには非常に簡単な説明もありますrgrig.blogspot.co.uk/2008/12/arrayは、 -puzzle-solution.html
rgrig

@uli:これは種まきの質問です。実際、私はこれを長い間読んでいます。
アリヤバタ

@Raphael:そのようなことを初めて聞いたとき、それはまだ驚くべきことです。ほとんどのパラドックスはそうではありません:
アルヤバタ

回答:


15

これは非常に一般的なトリックであり、ハッシュ以外の目的にも使用できます。以下に、実装を(擬似コードで)示します。

それぞれサイズnの 3つの初期化されていないベクトルP、およびV考えます。これらを使用して、データ構造で要求された操作を実行します。変数p o sも維持します。操作は次のように実装されます。APVnpos

init:
  pos <- 0

set(i,x):
if not(V[i] < pos and P[V[i]] = i) 
  V[i] <- pos, P[pos] <- i, pos <- pos + 1
A[i] <- x

get(i):
if (V[i] < pos and P[V[i]] = i) 
  return A[i] 
else 
  return empty 

配列は、s e tプロシージャを介して渡される値を単に格納します。配列VPは、Aの特定の位置が初期化されているかどうかを確認できる証明書として機能します。AsetVPA

0からp o s 1 範囲のの要素は常に初期化されることに注意してください。したがって、これらの値をAの初期化された値の証明書として安全に使用できます。初期化されるAのすべての位置iに対して、値がiと等しいベクトルPに対応する要素があります。これはV [ i ]によって示されます。したがって、対応する要素P [ V [ i ] ]を見ると、その値はiですP0pos1AiAPiV[i]P[V[i]]iが初期化されていることがわかります(Pが存在することはないため、考慮しているすべての要素が初期化されているため)。同様に、A [ i ]が初期化されていない場合、V [ i ]は初期化されていないことが確実な場合、0 .. p o s 1 範囲外のPの位置を指すか、またはその範囲内の位置。しかし、この特定のP [ j ]Aの異なる位置に対応するため、A[i]PA[i]V[i]P0..pos1P[j]AP[j]iA[i]

O(n)O(1)posO(n)


P[V[i]]iA[i]

ですが、posはV [i]よりも小さくなります。そうでなければ、偶然ではないでしょう。posをV [i]よりも高くすることにより、インデックスV [i]のPの値を、選択した特定の値、つまりiに明確に設定したことを意味します。
wolfdawn 14年

これは、(ポータブル)Cで実行できないことの古典的な例です
TLW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.