在C语言中运行二进制搜索的最快方法?

Vla*_*ala 3 c binary-search

例如,假设我想在文件中找到特定的单词或数字.内容按排序顺序(显然).由于我想在文件上运行二进制搜索,将整个文件复制到一个数组然后运行二进制搜索似乎真的浪费时间...我已经有效地将它变成了线性时间算法,因为我'在我运行搜索之前,我必须花费O(n)时间复制该darn文件.

有更快的方法吗?是否有类似lseek的东西可以使用行而不是字节?

如果没有,我最好只做一次线性搜索(假设我只在整个程序期间运行一次搜索)?

Zan*_*ynx 6

你不能直线寻求.一旦你想到这一点就很明显了.

但是你可以对文本文件进行一种二进制搜索.

你做的是:

  • 统计文件以获取长度或寻找到最后并获得位置.
  • 内存映射文件.
    (我认为这是最好的,但如果必须的话,你可以使用lseek并阅读.)
  • 寻找文件的中间部分,减去平均线长.猜猜看.
  • 向前扫描换行,除非你在0号位置.
  • 阅读你的专栏并进行比较.
  • 重复1/4或3/4,1/8,1/16等.

  • "减去平均线长"位并不是必需的.关注fencepost错误. (4认同)

mjv*_*mjv 5

基于磁盘的二进制搜索至少在开始时需要具有“ 块感知 ”能力,即,意识到以下事实:无论您读取一整串的单个字节,I / O成本都是相同的。另一个认为需要注意的是,与顺序读取操作相比,搜寻操作的成本相对较高

它可以使用这种有关磁盘I / O特性的认识的几种方法:

  • 在搜索快要结束时,最好选择线性搜索(扫描),而不要查找。
  • 在开始检查块中的第一个和最后一个元素时,这可能有助于推断下一个拆分的更好猜测
  • 缓存文件中各个位置找到的某些项目的树(甚至简短的平面列表)(有点像正式btree结构中的中间节点)
  • 声明并使用适当的缓冲区大小