String 搜索和追加连接的字符串

String 搜索和追加连接的字符串,string,algorithm,search,String,Algorithm,Search,我有一个包含连接字符串的文件 查找或添加(字符串) 返回文件中字符串出现的偏移量(不一定是第一个) 在文件中添加尽可能多的字符串尾部以使文件包含字符串(然后返回文件中字符串的偏移量) 伪代码: file.init() // file == "" file.find_or_add("cat") // file == "cat", returns 0 file.find_or_add("able") // file == "catable", return

我有一个包含连接字符串的文件

查找或添加(字符串)

  • 返回文件中字符串出现的偏移量(不一定是第一个)
  • 在文件中添加尽可能多的字符串尾部以使文件包含字符串(然后返回文件中字符串的偏移量)
伪代码:

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(logn)中执行所需的操作

假设文件比RAM大


语言并不重要,但我可以阅读伪代码、C、Java、Python、Javascript和Haskell。

这可能不适用,但具有O(log N)搜索、快速插入功能,并且经过了大量优化,可用于大数据集的高效IO。我可能错了,但这感觉像是插入和搜索之间的一个很好的平衡。你觉得怎么样?

如果插入很小,那么可以构建后缀树或后缀数组(使用惰性实现)。由于插入 编辑:如果必须存储后缀ID(=整数),如果文本不符合要求,它将无法存储在内存中

后缀树(或更紧凑的后缀数组)表示文本的所有子字符串,然后您可以执行简单的查找:

子字符串在树中吗

是->返回后缀(在树的叶子中)

否->添加它并将文本附加到源文件中

我愿意更深入地了解这一点,但我必须首先了解图案尺寸

编辑:请注意,插入只需要O(k)时间

EDIT2:如果模式的长度没有限制,那么您可能必须构建完整的树,在空间和时间上都是O(N),问题是您通常有一个大于10bytes/char的因子。
注意,irW

后缀数组和后缀树可能会导致记忆问题。(因为需要在结构中存储所有后缀,所以即使在一定深度剪切它们,它们也总是比文本大)


您可以创建一组表示特定前缀ID的文件。假设我们将所有长度为2的前缀存储在不同的文件中,并保持其排序。此文件将平均包含1/26^2个后缀ID。所以我们有一个文件aa.txt,ab.txt等等。我们对文件中的条目进行排序(后缀数组)。每次要进行查找时,都要使用“加载”这个小文件,该文件已排序并进行检查。复杂度是O(N)(您必须加载文本中恒定可控部分的文件),但您可以调整预因子以获得最佳性能。例如,在5 Gb的文件中,如果使用长度为2的前缀,则会有一组8 Mb大小的文件,对于前缀长度为3的文件,则大约为320 kb,因此……

那么a呢?您可以在O(RequestStringLength)中找到它是否已经是现有后缀的前缀,或者文件扩展了多少个字符。树的Createinon需要O(filelength),但在其中搜索会非常快:O(RequestStringLength)。@MrSmith42如果文件不适合RAM,我想后缀树也不会。。。。除了这个文件会有相当多的重复,在这种情况下,后缀树可能会使用更少的内存,因此适合RAM,虽然无法知道它是否会与提供的信息。帖子应该是自包含的(不依赖于YouTube或任何其他网站)。请在不看视频的情况下对算法进行足够详细的解释,以便理解,或者将此作为对问题的评论。如果你添加了一个解释,请在解释的基础上留下链接。这是一个非常有价值的讲座。它比我在这里解释的更详细。我试着根据这个问题来总结一下。有时答案不够简单,无法用几行或几段来解释(我觉得这里就是这种情况)。k是最长插入的长度。我目前认为后缀树可能仍然有问题。您必须存储所有ID,而且由于您的文本字符串无法放入内存,所有这些ID也无法存储,因此我们必须考虑磁盘上的某些内容。