【问题标题】:Which data structure and/or algorithm is suitable for this problem?哪种数据结构和/或算法适合这个问题?
【发布时间】:2019-11-21 09:25:25
【问题描述】:

我有一个 30MB 的 .txt 文件,其中包含如下随机字符串:

416
abcd23
cd542
banana
bambam

每行1个单词,单词之间换行

我需要在文件中搜索我选择的子字符串并返回文件中每个匹配的字符串。为了更清楚:

Input: cd
Output: abcd23, cd542

通用后缀树、后缀树或后缀数组是否适合这类问题,或者有更快的方法吗? (时间复杂度很重要)

附言我的编程技能有点粗略,所以任何类型的例子都将不胜感激

【问题讨论】:

  • 你有没有尝试过?
  • @RaviSaroch 遍历文件中的每个字符串... ^^
  • @gelonida 每行 1 个字,以新行分隔
  • 是否附加了文件?还是文件不会改变?
  • 有一个叫做 grep 的程序。 . .

标签: python algorithm data-structures


【解决方案1】:

假设您在文件中找到包含一个字符串的字符串,那么最快的方法是简单地遍历文件并检查每一行的字符串函数“in”或“find”,如下所示。

def find_matches(filename, txt):
     with open(filename, 'r') as f:
         return [line for line in f if txt in line] # using 'in'

示例用法:

matches = find_matches('myfile.txt', 'cd')

简单地读取文件避免了构造其他方法(例如 Pandas)的字段的开销 -- Pandas one of the slower methods 读取文件。另外:What is the fastest way to search a CSV file.

使用 in 或 find 的字符串方法基本上依赖于在 C 中实现的优化 fastsearch,其每个字符串搜索的效率是:

看起来实现在最坏的情况下是 O(N*M) (与 一种天真的方法),但在某些情况下可以做到 O(N/M)(其中 N 和 M 是 分别是字符串和子字符串的长度),并且 O(N) 在 常见案例

【讨论】:

  • 我修复了上面的解决方案(我希望)另外请注意,上面的解决方案只有在每行只有一个单词的情况下才有效。请说明您是否每行包含多个单词。
猜你喜欢
  • 2021-03-17
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多