我正在尝试编写一个执行以下操作的函数:
给定一个文本文件,我想找到该文件中某个字符串的所有出现;然后,对于每次出现,应将发现它的行添加到列表中。我们假设每行最多只包含一个出现。文本文件可能变得非常大,这意味着一个简单的for循环遍历每一行文件将太慢。
例如,假设我们有一个包含内容的文件:
如果我要搜索“A”,该函数会在第1行和第3行找到它,从而将1和3添加到列表中(然后返回列表)。
我正在考虑进行二元搜索,但似乎要求对列表进行排序,并且元素要区分 - 我正在寻找相同的值。
那么,是否有其他搜索算法可以基于我的函数,其性能与二进制搜索大致相同?
谢谢!
答案 0 :(得分:1)
如果线条不经常更改,您可以对它们进行索引,并且您将对它们执行许多搜索。索引它们的一种方法是创建一个直方图,其中哪些字符存在于哪些行中(或许可能有多少次)。然后你可以反过来说,例如,字母A出现在第5,10和20行。如果你正在搜索“ABF”,你可以使用反转的直方图来确定哪些行是候选的(即包含字母'A','B'和'F')然后只看这些线。
这是否是一种有效的策略取决于搜索的选择性和搜索字符串的长度等。只有测试才能揭示算法是否具有您特定使用模式的优点。