【发布时间】:2013-07-18 08:51:29
【问题描述】:
我有一个包含串联字符串的文件。
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。
【问题讨论】:
-
suffix tree 怎么样?如果它已经是现有后缀的前缀或者你有多少字符扩展了文件,你可以在 O(RequestStringLength) 中找到它。树的创建需要 O(filelength) 但在其中搜索会非常快:O(RequestStringLength)。
-
@MrSmith42 如果文件不适合 RAM,我认为后缀树也不会。
-
... 除了这个文件会有很多重复,在这种情况下,后缀树可能会使用更少的内存,因此适合 RAM,尽管无法知道它是否会与提供的信息。