【问题标题】:External searching algorithm外部搜索算法
【发布时间】:2016-09-01 00:12:43
【问题描述】:

如果我有一个非常大的排序列表存储在外部存储中。假设这个列表不能被带入内存,那么在这个列表中以伪代码查找键的搜索算法是什么?时间复杂度是多少?设计这个算法时应该考虑哪些主要因素?

【问题讨论】:

  • 您可以创建特定于关键的索引文件,然后创建一些特定于域的语言...让我们称之为 SQL 以结构化形式查询数据。然后你可以花时间写越来越多的额外内容。但是等等 - 这已经完成了。它被称为数据库。
  • 在许多数据库中,涉及到一个特定于密钥的文件,但它对于每 k 条记录只有一个密钥,其中 k 可能是 64(可能更少或更多),这将得到查找在 64 条记录中,然后将按顺序读取,只需一次初始随机访问。在大型机和内存有限的时代,使用嵌套索引,例如索引到记录的索引。

标签: sorting sortedlist external-sorting


【解决方案1】:

假设您的外部存储只是一个存储在文件中的常量大小记录的普通数组,并且您的编程语言允许memory map the file,您可以使用通常的binary search algorithm

说,在 C++ 中你

  1. mmap 文件采用 void* 指针指向文件的开头和结尾 mmap 文件,
  2. 将指针投射到您的记录类型
  3. 然后使用std::lower_bound() 搜索记录,这是标准的二分搜索实现之一。

请注意,内存映射文件并不意味着将整个文件加载到内部内存中,而是系统会自动将文件中的必要页面加载到已加载页面的缓存中,并具有将缓存页面大小保持在可用范围内的智能策略内存界限。

这是在已排序文件中搜索的标准做法,没有理由重新设计它(好吧,据我所知)。外部存储器中二进制搜索算法的复杂性取决于外部存储模型、缓冲/分页策略等,但对于您的硬盘驱动器,您仍然可以假设它通常为 O(log N)。我建议您搜索 out-of-core algorithms 和数据结构教程和库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多