5

私の問題は、サイズNのオブジェクトの配列があることです。毎回(t + 1)後に、配列の値の一部が変更される場合と変更されない場合があります。つまり、t + 1インデックス15が変更されても、他のすべては同じままであるとします。

もちろん、配列の配列を持っているだけでなく、このようなものを(メモリに)格納するための最も効率的な方法は何ですか?配列のすべての値をいつでも取得できるようにしたい、たとえばgetValues(long time)を可能な限り最も効率的な方法で取得できるようにしたい。

4つのアレイについて言う

時間1nullnull null xyz

時間2nullnull abc xyz

(ここではabcのみが変更されていることに注意してください)が、時間1からの最後のインデックスの値を保持します。

4

1 に答える 1

4

あなたが求めているものは、アカデミックCSの分野では「部分的に永続的な配列」として知られています。永続性の詳細については、Kaplanの調査を参照してください。

簡単な解決策の1つは、配列の代わりに検索ツリーを使用することです。純粋に機能的なバランスの取れた探索木を使用して、各読み取りまたは書き込みにO(1)時間ではなく、最悪の場合のO(lg n)時間(nは配列のサイズ)がかかることを保証できます。(タイムスタンプ付きのバージョンを拡張可能な配列に保持する場合、新しいバージョンの追加はO(1)で償却され、古いバージョンへのアクセスはO(1)の最悪の場合です。)

純粋関数型検索ツリーに精通していない場合は、Clojureの永続配列の概要をお読みください。これらは、固定幅の整数(トライの形式)でインデックス付けされた純粋関数型ツリーであるため、深さが固定されています。これは、最悪の場合と現実の両方で、問題に対する最速の解決策になる可能性があります。

私が知っている他の部分的に永続的な配列は、最悪の場合、もっと時間がかかる可能性があります。アレイにさまざまな制限された方法でアクセスした場合、償却の複雑さが改善されるものもあれば、予想される複雑さが改善されるものもあります。

于 2010-10-03T14:43:30.250 に答える