在排序文本文件中实现二叉搜索?
Implementing binary search in a sorted text file?
有没有办法直接复制文件的数据,在其中实现搜索?
:是的,但它的效率很低。
我建议将数据放在SQLite数据库中,这样您仍然只有一个文件,但可以很好地查询/搜索条目。
tl;DR:是的,但这通常不值得
您忽略了文本文件的确切排序方式,以及是否有转义字符,引号,多八位字节字符等 - 这些都会影响答案。
但是,让我们做出以下假设:
- 纯可打印的 ASCII 文本,每个字符串中没有换行符。
- 换行符(即0xA字符(分隔字符串。
对于一组假设来说,这仍然不够,因为 - 也许某些字符串比其他字符串长得多?事实上,总体上n个字符串的不那么极端的情况,但其中一些占据了大部分字符呢?如果开始对文件中的字符进行采样,则需要来回,线性地,至少到单个字符串的两个边缘(或转发,直到两次按换行符(。
因此,让我们添加更多假设,尽管坦率地说 - 它们非常无效:
- 您知道最小最小和最大最大字符串长度。
- 最小长度与最大长度的比率R不是很高
这使得从文件中的某个任意点开始读取并查找完整的字符串至少在理论上是合理的。但是,文件通常位于磁盘上;磁盘由块访问。因此,要从文件中读取单个字符,您需要读取大小为 B 的整个块(将 B 视为 1 KiB 作为合理示例(。我们假设 Max <B,否则你就处于巨大的字符串案例中。>
需要注意的另一点是磁盘延迟很高。对于磁盘(或光盘(尤其如此,在磁盘中,您可以等待长达 10 毫秒的单次读取!如果您按顺序阅读,则无需"寻找"或查找您感兴趣的位置,您可以利用磁盘的全部带宽。这对于SSD来说不是一个问题,但它仍然不可忽略。
因此,如您所见,二进制搜索的开销相当大。相对于最小值、最大值、R 和 B,您的文件确实非常大,这可能仍然是值得的。所以在一个几千兆字节的文件中,我肯定会考虑它。否则 - 可能不值得打扰。
相关文章:
- std::unordered_map 搜索算法是如何实现的?
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 二叉搜索树 - 实现"search"函数
- 二叉搜索树的 C++ 实现中的EXC_BAD_ACCESS错误
- 在给定的项目列表上实现搜索?
- 使用openmp实现并行广度优先搜索
- 尝试实现二叉搜索算法,似乎无法使其工作
- C++二叉搜索树实现不会添加每个元素
- 在排序文本文件中实现二叉搜索?
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- C 中的快速范围搜索实现
- 双向链表插入方法实现 - 正在搜索哪个节点
- C++二叉搜索树实现,动态数组或结构/类
- 如何在C++中实现函数上的二叉搜索?
- 使用深度第一次搜索的无向图中的图形调查无法实现的节点
- 二进制搜索树的数组实现
- 二叉搜索树实现C++运行时错误
- 深度使用两个链接列表的邻接列表的首次搜索C 实现
- 深度优先搜索和C++中的breafth优先搜索实现
- 递归二叉搜索实现崩溃.为什么