我有一个包含连接字符串的文件.
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.
语言并不重要,但我可以阅读Pseudocode,C,Java,Python,Javascript和Haskell.
最佳答案 后缀数组和后缀树可能会引发内存问题. (它们总是比文本大,即使你在某个深度切割它们,因为你需要在你的结构中存储所有后缀ID).
您可以创建一组表示某些前缀ID的文件.假设我们将所有长度为2的前缀存储在不同的文件中并保持排序.该文件平均包含后缀ID的1/26 ^ 2.所以我们有一个文件aa.txt,ab.txt等堡垒.我们保持排序的文件中的条目(后缀数组).每次要进行查找时,都要使用加载这个已经排序和检查的小文件.复杂性将是O(N)(您必须加载文件,该文件是文本的恒定可控部分),但您可以调整前因子以获得最佳性能.在一个5 Gb文件中,例如,如果你使用长度为2的前缀,那么你将有一组8 Mb大小的文件,对于prefixLength 3你将是大约320 kb所以堡垒..