Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在排序文本文件中实现二进制搜索?_C++_File_Search - Fatal编程技术网

C++ 在排序文本文件中实现二进制搜索?

C++ 在排序文本文件中实现二进制搜索?,c++,file,search,C++,File,Search,有没有一种方法可以代替直接复制文件中的数据在其中实现搜索?理论上:是的,但效率很低 我建议将数据放在sqlite数据库中,这样您仍然有一个文件,但可以很好地查询/搜索条目;医生:是的,但通常不值得 您忽略了提及文本文件的排序方式,以及是否有转义字符、引号、多个八位字符等-这些都会影响答案 但让我们做以下假设: 纯打印ASCII文本,每个字符串中没有换行符 换行符(即0xA字符)分隔字符串 对于一组假设来说,这仍然是不够的,因为-也许有些字符串比其他字符串长得多?事实上,如果不是n个字符串的极

有没有一种方法可以代替直接复制文件中的数据在其中实现搜索?

理论上:是的,但效率很低


我建议将数据放在sqlite数据库中,这样您仍然有一个文件,但可以很好地查询/搜索条目;医生:是的,但通常不值得

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

但让我们做以下假设:

  • 纯打印ASCII文本,每个字符串中没有换行符
  • 换行符(即0xA字符)分隔字符串
对于一组假设来说,这仍然是不够的,因为-也许有些字符串比其他字符串长得多?事实上,如果不是n个字符串的极端情况,而是其中的一些字符串占用了大部分字符,那该怎么办呢?如果开始对文件中的字符进行采样,则需要线性地来回移动,至少移动到单个字符串的两个边缘(或向前移动,直到两次碰到换行符)

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

  • 您知道最小和最大字符串长度
  • 最小长度与最大长度的比值R不是很高
这使得从文件中的任意点开始读取并查找完整字符串至少在理论上是合理的。然而,文件通常在磁盘上;磁盘是通过块访问的。因此,即使要从文件中读取一个字符,也需要读取大小为B的整个块(例如,将B视为1kib是一个合理的示例)。我们假设Max 需要指出的另一点是,磁盘延迟很高。这对于磁盘(或光盘)尤其如此,在磁盘上,一次读取最多可以等待10毫秒!如果按顺序读取,则无需“查找”或查找您感兴趣的位置,并且可以利用磁盘的全部带宽。SSD的问题不那么严重,但仍然不容忽视


因此,正如您所看到的,二进制搜索有相当大的开销。它可能还是值得的。你的文件相对于Min、马克斯、R和B确实非常大,所以在一个几千兆字节的文件中,我当然会考虑它。否则-可能不值得麻烦。

简短回答-是的,不是真的-二进制搜索需要随机访问,并且您无法有效地对文本文件(即由可变长度行组成的文件)执行随机访问。@NeilButterworth您可以扫描最近的回车,或者文件可能包含固定长度的记录。@NeilButterworth您可以对文件的数据执行随机访问。随机访问是否有意义取决于文件格式。@Francois,这就是我说“有效”的原因。