次の操作を実行できる文字セット文字列セットを格納するデータ構造を探しています。文字列のセットSを格納するデータ構造としてD(S )を示します。
Add-Prefix-Set
上に:いくつかのセットの所定のT大き定数によって制限され、その文字列の長さが一定で、戻りによって囲まれている文字列(空)の、D({ T Sを| T ∈ T 、S ∈ S } )。これらの境界定数は両方ともグローバルです。これらはすべての入力Tで同じです。Get-Prefixes
上の:リターン{ | S ∈ S 、∈ Σ }。O (| Σ |)時間でその内容を列挙できる限り、このセットにどの構造が使用されるかはあまり気にしないことに注意してください。Remove-Prefixes
上の:リターンD({ S | A S ∈ S 、∈ Σ } )。Merge
:指定されたおよびD(T )、リターンD(S ∪ T )。
今、私は本当にこれらのすべての操作を時間で実行したいのですが、これらのすべての操作をo (n )時間で実行する構造で問題ありません。ここで、nはの最も長い文字列の長さです構造。マージの場合、私はたいO (N 1 + N 2)実行時、nは1であり、nは第ためのN 2 N第2の構造のために。
追加の要件は、構造が不変であること、または少なくとも上記の操作が「新しい」構造を返し、古い構造へのポインタが以前と同様に機能することです。
償却に関するメモ:それは問題ありませんが、永続性に注意する必要があります。古い構造を常に再利用するため、同じ構造に対して特定の操作セットで最悪のケースにぶつかると、問題が発生します(そのため、作成される新しい構造は無視されます)。
私が取り組んでいる解析アルゴリズムでこのような構造を使用したいと思います。上記の構造は、アルゴリズムに必要な先読みを保持します。
私はすでにトライの使用を検討していますが、主な問題は、試行を効率的にマージする方法がわからないことです。の文字列セットが1文字の文字列Add-Prefix-Set
のみで構成される場合、これらのセットをスタックに格納できます。これにより、最初の3つの操作の実行時間がます。ただし、このアプローチはマージにも機能しません。
最後に、私は要因に興味がないことに注意してください:これは私が気にすることすべてについて一定です。
Add-Prefix-Set
ことで)
Add-Prefix-Set
ますか、それとも文字列の任意のセットから始めますか?