c++ - 搜索巨大的排序数据 block

标签 c++ algorithm search binary-search

我在磁盘中有大量数据记录,这些数据记录是根据某些键按排序顺序排列的。 一次将数据一个 block (数千条记录)读入内存。 我必须搜索并显示与某个键匹配的所有记录。 我在考虑一些基于二进制搜索的算法,但我在这里有一些限制。

  1. 只能从 block 的开头在 block 内按顺序查找记录。
  2. 具有相同键的记录可以跨越多个 block (如图所示 - 8 个跨度)。在二进制搜索中,如果我正在加载中间 block 并且如果第一条记录匹配,那么我必须 扫描匹配 block 之前的 block 。

谁能帮我设计一个可以在 C++ 中运行的有效策略。使用线性搜索方法是否有效。

+---+
| 1 | Block1
| 3 |
| 3 |
| 4 |
+---+
| 4 | Block2
| 6 |
| 7 |
| 8 |
+---+
| 8 | Block3
| 8 |
| 8 |
| 8 |
+---+
| 8 | Block4
| 14|
| 15|
| 16|
+---+

最佳答案

您可以构建一个由每个 block 中的第一个条目组成的辅助数组,然后对该数组运行二进制搜索。数组的索引应直接与 block 索引对应,使其成为 O(1) 查找以获取相应的 block 。

它将最坏的情况从 O(n) 减少到 O(logn),并且仍然相对简单。

关于c++ - 搜索巨大的排序数据 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5226241/

相关文章:

javascript - 优化 Javascript 中首字母的搜索

java - 如何实现贪心搜索算法

c++ - 为什么我可以在私有(private)类型上使用 auto ?

java - 将数组分成两个子数组,使数组的总和之间的差异最小?

c++ - 对耦合的两个链表运行归并排序

algorithm - 货车上路及加油站问题的动态规划算法

algorithm - 将搜索的时间复杂度降低到小于 n^2

c++ - 我如何重新排列它以便输入 Ctrl-z(文件结束信号)中断循环,同时仍在 C++ 中测试有效输入

c++ - 在 C++ 和 C 中共享一个结构?

javascript - 从 JavaScript 访问 Linux 诊断信息