連結された文字列を含むファイルがあります。
find_or_add(string)
また:
- ファイル内の文字列のオカレンスのオフセットを返します (最初である必要はありません)
- ファイルに文字列が含まれるのに必要なだけ、文字列の末尾をファイルに追加します (そして、ファイル内の文字列のオフセットを返します)。
疑似コード:
file.init() // file == ""
file.find_or_add("cat") // file == "cat", returns 0
file.find_or_add("able") // file == "catable", returns 3
file.find_or_add("table") // file == "catable", returns 2
file.find_or_add("tables") // file == "catables", returns 2
file.find_or_add("spigot") // file == "catablespigot", returns 7
file.find_or_add("pig") // file == "catablespigot", returns 8
このファイルをメモリ内で「要約」し、必要な操作を最大 O(log N) で許可するには、どのアルゴリズム/構造を調べる必要がありますか?
ファイルが RAM よりも大きいと仮定します。
言語は重要ではありませんが、疑似コード、C、Java、Python、Javascript、Haskell を読むことができます。