Data structures 有没有一种有效的方法来存储使用随机整数键的查找结构?

Data structures 有没有一种有效的方法来存储使用随机整数键的查找结构?,data-structures,persistence,Data Structures,Persistence,我需要实现具有以下要求的查找结构: 密钥是随机的128位整数 值为64位 它将存储在磁盘上 它必须是可搜索的,而不需要整个结构驻留在内存中(我打算对文件进行内存映射) 它必须是可变的,但对磁盘的写入必须是增量的(不得要求覆盖整个结构) 有没有一种有效的方法来实现这一切 请不要回答“不要使用UUID”;更改需求会改变问题。因为您的键和值都是固定的字节数,所以可以将实现作为文件。前几个字节包含元素的当前数量和当前容量,然后每个条目占用16+8字节(如果0被禁止作为键),或者1+16+8字节(如果

我需要实现具有以下要求的查找结构:

  • 密钥是随机的128位整数
  • 值为64位
  • 它将存储在磁盘上
  • 它必须是可搜索的,而不需要整个结构驻留在内存中(我打算对文件进行内存映射)
  • 它必须是可变的,但对磁盘的写入必须是增量的(不得要求覆盖整个结构)
有没有一种有效的方法来实现这一切


请不要回答“不要使用UUID”;更改需求会改变问题。

因为您的键和值都是固定的字节数,所以可以将实现作为文件。前几个字节包含元素的当前数量和当前容量,然后每个条目占用16+8字节(如果0被禁止作为键),或者1+16+8字节(如果您需要一个标志来指示条目是否存在)

您可以散列密钥,然后使用算术查找文件中的正确位置,然后读取或写入所需的条目。要解决哈希冲突,最好避免查找次数。因为密钥是随机的,所以灾难性的冲突堆积不应该发生,而散列可以简单地获取密钥的最低k位,其中当前容量为2^k

这需要O(n)个空间,允许在O(1)个平均时间内查找,并在O(1)个摊销时间内写入。有时,您必须调整哈希表的大小以增加写操作的容量;在这些情况下,这需要O(n)时间


如果在最坏的情况下需要O(1)次写入,可以同时维护旧哈希表和新哈希表,在这两个哈希表中进行查找,然后在每次写入操作中,跨两个条目从旧哈希表复制到新哈希表。如果容量总是增加2倍,则除了分配大小为O(n)的空哈希表的成本外,这将提供非摊销的恒定时间写入。如果创建一个特定大小的空文件对于单个写入操作来说也太慢,那么您也可以将空文件创建分摊到多个写入操作中。

听起来像是在描述一个数据库管理系统。您是否考虑过像SQLite这样的轻量级DBMS软件?如果您不能或不想使用现成的软件,您可以在磁盘上实现B树:。我考虑过RDBMS,但有一些明显的缺点,所以我正在研究其他途径。我看过B树,但我了解到,使用非顺序(随机)时,它们的性能可能不太理想本文讨论在数据库中使用UUID,并声称“UUID会降低数据库性能”