基于哈希的数据容器,可以分段 - C ++

时间:2012-12-25 00:39:30

标签: c++ data-structures hash record

我想基于它们的散列来索引一系列奇异值或结构/类(意味着一次散列多于1个值)。

我已编码散列函数,因此为任何值或结构或类提供摘要没有问题,问题是:

  • 在C ++中真的支持基于哈希的数据结构吗?我的意思是,如果有一个更好的替代方案,例如使用std::map,以及为此设计的容器超过2个字段(我仍然没有决定多少个在我的数据结构中我真正需要的字段)。
  • 因为我打算轻松达到10 ^ 5条记录,管理碎片数据结构对我来说很重要,避免直接处理内存中的巨大数据结构并分配无用的部分结构。
  • 如果我想在磁盘上保存此结构,序列化是唯一的选择吗?

假设我的哈希函数是hash::digest()我将欣赏对实际代码的最小引用,并提供有关适当数据结构用法的示例。

感谢。

编辑:

我想避免无序的数据结构,因为:

  • 坏分支预测
  • 由于它们没有被订购,因此无法以有效的方式进行分割
  • 我的主要内容是关于这种结构的管理及其分裂。

2 个答案:

答案 0 :(得分:2)

我会写这个作为答案,因为我不认为评论真的让我们在任何地方:

首先,我认为你要么咆哮错误的树,要么你需要坐下来为我们绘制一个小图,所以我们理解你在问什么。

一般来说,我和其他许多人遵循“当std :: vector工作时使用std :: vector(索引是合理的类型/范围)”的原则,直到证明它不够好。如果index不适用于vector ,使用std :: map,除非证明这不是一个合适的解决方案“。但更重要的是,无论您使用什么存储,都应该隐藏在主代码中。你应该有访问器函数来获取数据,如果你使用vector,map,trie,B-tree,heap,stack,queue等就没关系。只要你的程序需要的功能可以由您的界面应该可以将数据存储在任何类型的容器类中。根据这个原则,您可以根据需要更改实际存储容器,而无需担心使用容器的代码是否会中断。

至于存储数据结构,任何不仅仅是POD的东西都需要序列化,无论你使用什么形式的容器。因此,如果您存储任何类,例如std :: string,然后你必须序列化数据,因为内部结构不能只存储在一个文件中。

答案 1 :(得分:1)

在您的描述中,您声明您想要使用“散列”功能(有时称为“摘要”),这似乎表明您想要使用某种散列容器。散列容器本质上是无序的,但您还声明您不希望使用标准库std::unordered_map<...>之类的无序容器。你的哈希函数你想要的是什么?

您还声明您希望您的容器“碎片化”,但我不清楚您对这种碎片的意思。从它的声音中你似乎暗示你的容器实际上部分地保存在磁盘上,并且由于它的大小而只被带入内存。但请注意,10 ^ 5不是巨大的大小,但实际上,它的尺寸相当小!

如果你的意思是你的“散列”函数实际上提供了一个顺序,即它在键上提供strict weak order,你的内容可以表示为一个字节序列(例如,使用适当的序列化和反序列化),您可能正在寻找b-tree:基于数据段的数据结构。虽然我确信这个数据结构有C ++实现,但标准C ++库中没有一个。我也没有可用的代码,创建b-tree并不是一件容易的事。