在排序文本文件中实现二叉搜索?

Implementing binary search in a sorted text file?

本文关键字:搜索 实现 排序 文本 文件      更新时间:2023-10-16

有没有办法直接复制文件的数据,在其中实现搜索?

理论上

:是的,但它的效率很低。

我建议将数据放在SQLite数据库中,这样您仍然只有一个文件,但可以很好地查询/搜索条目。

tl;DR:是的,但这通常不值得

您忽略了文本文件的确切排序方式,以及是否有转义字符,引号,多八位字节字符等 - 这些都会影响答案。

但是,让我们做出以下假设:

  • 纯可打印的 ASCII 文本,每个字符串中没有换行符。
  • 换行符(即0xA字符(分隔字符串。

对于一组假设来说,这仍然不够,因为 - 也许某些字符串比其他字符串长得多?事实上,总体上n个字符串的不那么极端的情况,但其中一些占据了大部分字符呢?如果开始对文件中的字符进行采样,则需要来回,线性地,至少到单个字符串的两个边缘(或转发,直到两次按换行符(。

因此,让我们添加更多假设,尽管坦率地说 - 它们非常无效:

  • 您知道最小最小和最大最大字符串长度。
  • 最小长度与最大长度的比率R不是很高

这使得从文件中的某个任意点开始读取并查找完整的字符串至少在理论上是合理的。但是,文件通常位于磁盘上;磁盘由块访问。因此,要从文件中读取单个字符,您需要读取大小为 B 的整个块(将 B 视为 1 KiB 作为合理示例(。我们假设 Max <B,否则你就处于巨大的字符串案例中。>

需要注意的另一点是磁盘延迟很高。对于磁盘(或光盘(尤其如此,在磁盘中,您可以等待长达 10 毫秒的单次读取!如果您按顺序阅读,则无需"寻找"或查找您感兴趣的位置,您可以利用磁盘的全部带宽。这对于SSD来说不是一个问题,但它仍然不可忽略。

因此,如您所见,二进制搜索的开销相当大。相对于最小值、最大值、R 和 B,您的文件确实非常大,这可能仍然是值得的。所以在一个几千兆字节的文件中,我肯定会考虑它。否则 - 可能不值得打扰。