【问题标题】:Searching and appending concatenated strings搜索和附加连接的字符串
【发布时间】: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,尽管无法知道它是否会与提供的信息。

标签: string algorithm search


【解决方案1】:

后缀数组和后缀树可能会导致内存问题。 (它们总是比文本大,即使您将它们切割到一定深度,因为您需要将所有 suffixID 存储在您的结构中)。

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

【讨论】:

    【解决方案2】:

    如果您的插入很小,那么您可以构建后缀树或后缀数组(使用惰性实现)。由于插入是

    编辑:如果您必须存储后缀 id (=整数),如果文本不适合,那么它将不适合内存

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

    子串在树中吗?

    是 -> 返回后缀(位于树的叶子中)。

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

    我愿意深入研究,但我必须先了解图案尺寸。

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

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

    【讨论】:

    • k 是最长插入的长度
    • 我目前认为后缀树可能仍然存在问题。您必须存储所有 ID,并且由于您的文本字符串不适合内存,所有这些 ID 也不会,所以恐怕我们必须考虑磁盘上的一些东西。
    【解决方案3】:

    也许这不适用,但this technology and algorithm 具有 O(log N) 搜索、快速插入,并且针对大型数据集的高效 IO 进行了大量优化。我可能是错的,但感觉就像插入和搜索之间的一个很好的平衡。你怎么看?

    【讨论】:

    • 帖子应该是独立的(不依赖于 YouTube 或任何其他网站)。请充分详细地解释该算法,以便在不观看视频的情况下理解该算法,或者将其作为对该问题的评论。如果您添加说明,请在说明之外随时留下链接。
    • 这是一次非常有价值的讲座。它比我在这里更详细地解释了算法。我试图根据这个问题来总结它。有时答案不够简单,无法仅用几行或几段来解释(我觉得这里就是这种情况)。
    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 2013-05-02
    • 2012-11-23
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多