【问题标题】:Quickest way to find substrings in text files在文本文件中查找子字符串的最快方法
【发布时间】:2010-11-17 14:17:18
【问题描述】:

在文本文件中查找字符串的最快方法是什么?案例场景:在列出大约 50000 个文件路径的文本文件中查找特定路径(每个路径都有自己的行)。

【问题讨论】:

    标签: c++ algorithm text find path


    【解决方案1】:

    该大小的文件应该很容易放入内存中,您可以将其放入 std::set(或者更好的 hashset,如果您手头有一个库),并将路径作为其项目。检查是否有确切的路径将会非常快。

    如果您还需要查找子路径,排序的 std::vector (如果您只查找前缀)可能是唯一有用的方法 - 或者如果您正在寻找完全通用的子字符串路径,那么您无论如何都需要扫描所有向量,但除非您必须这样做无数次,否则即使这样也不会太糟糕。

    【讨论】:

    • 我怀疑这是最快的方法——它是最简单的。如果搜索特定路径,最快的方法是读取每一行,将其与搜索到的路径进行比较,并在找到匹配项后立即中止。其他一切都是开销。除此之外,std::hash_set 通常比 std::set 快得多。
    • 是的,如果你手头有一个库,我确实推荐了一个哈希集——记住它不在 C++ 标准中(但),尽管某些库使用了违反标准的 std: 前缀。一口气读取几个 100 KB 在经验上比您建议的混合 I/O 和 CPU 工作更快(至少在具有良好 FS、磁盘缓存、预读等的多任务系统上)——今天磁盘 I/O 的成本查找比线性读取(100KB
    • 我花时间写了一个基准样本。你错了:在一台好机器上读取一个包含 80000 行的 5MB 文件大约需要 0.60 秒,包括每行读取的 strcmp。如果我省略 strcmp 而是构建一个 std::set 运行时间增加到 0.75s。
    【解决方案2】:

    你必须在文件中找到一个字符串,在多个文件中重复查找相同的字符串,在同一个文件中查找多个字符串吗?

    根据场景,您有几个可能的答案。

    • 如果您必须在同一个文件中查找多个字符串,则构建数据结构(如 Alex 提出的集合)非常有用

    • 如果您必须搜索一个字符串,使用像 Boyer-Moore 这样的算法是有效的

    • 如果您必须搜索多个字符串,使用正则表达式引擎可能会更好。

    【讨论】:

      【解决方案3】:

      这是正则表达式的领域;你应该看看 grep 和 awk。

      【讨论】:

        【解决方案4】:

        我不确定您希望在多大程度上使用搜索,但 FSM 是不错的选择。

        这里是讨论:Short example of regular expression converted to a state machine?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-02-09
          • 1970-01-01
          • 1970-01-01
          • 2016-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多