【问题标题】:Best way to store and hash <int, int> key (C++)存储和散列 <int, int> 键的最佳方式 (C++)
【发布时间】:2009-11-02 23:29:10
【问题描述】:

我的目标是创建一个有效的结构来存储矩阵中最相关的条目(在没有内存限制的世界中)大约为 10^5 x 10^5 并填充双精度数。该矩阵是对称的,因此它实际上只包含 (10^10)/2 个值。

我需要在模拟中多次访问条目,因此快速检索至关重要。

为了保持结构易于管理,我将删除不太可能使用的成员。如果索引是 (int_x1, int_x2),我经常想删除所有包含例如 x1 的对。

什么是这个任务的最佳结构或结构集?两个整数的好散列是什么?

为了便携性,我想避免使用 Boost。我目前在程序的其他地方使用 TR1 的 unordered_map。我正在考虑再次将 unordered_map 与密钥对一起使用,但我不确定如何以这种方式有效地删除条目,而且我不知道一个好的哈希函数会是什么样子。

我是一个初级程序员,所以请说清楚。

【问题讨论】:

  • 您是否还需要像删除所有 x1 成员一样频繁地删除所有 x2 成员?
  • 您是否考虑过使用标准的稀疏矩阵存储方案,例如 CSR?根据您需要对矩阵执行的操作,它可能工作正常。
  • 为了便携性,您想避免提升? Boost 非常便携,并且具有轻量级,可以满足您的要求。
  • @jmucchiello:我的表述可能不正确。我经常需要删除涉及某个元素 xi 的所有对(其中 i 来自 {1,2,...,n}。
  • @Patrick:公平......我是一名业余程序员,与许多其他业余程序员一起工作,也许我们都只需要采用 boost。 (这是为了科学研究,我们最终会分享代码。) boost 中是否有一个特殊的功能在这里会有所帮助?

标签: c++ hash tr1


【解决方案1】:

如果数据非常稀疏,您可以使用哈希表数组。

hash_map<int,double> matrix[] = new hash_map<int,double>[10000];
for (int i = 0; i < 10000; i++) matrix[i] = new hash_map<int,double>();

然后要查找一个值 (x,y),用 x 索引数组并在哈希表中查找 y。

需要注意的几点:

  • 删除可能会非常昂贵,因为您必须遍历很多哈希表。
  • 总存储空间会随着您删除/插入而增加,您应该不时修剪()您的 hash_maps。
  • 应该很容易利用对称性。

【讨论】:

  • 这是有道理的,尽管对我来说制作一个哈希表向量可能会更好,因为我事先并不知道数组的大小。有没有理由没有哈希表的哈希表?
  • 你能解释一下你所说的 trim() 是什么意思吗?这似乎不是 TR1 的 unordered_map 或我发现的任何其他哈希映射的成员函数。我目前有一个用于 x1 索引的哈希表,其中 x1 > x2。这些条目中的每一个都指向一个单独的哈希表,其中包含所有 x2
  • 哈希表的哈希表会很好,但有点矫枉过正,因为一维索引几乎肯定会很密集。是的,一个向量就可以了。对不起,修剪是一般概念,而不是特定功能。大多数实现会在插入时自动增长哈希表,但不会在删除时自动缩小 hash_map。您可能希望定期修剪​​ hash_maps 以节省一些内存(取决于您的插入/删除模式)。在c++中没有这个方法,但是如果size()远小于bucket_count(),只需将数据复制到一个新的hash_map并删除旧的。
猜你喜欢
  • 2022-01-09
  • 2015-12-21
  • 2020-10-22
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 2017-06-13
相关资源
最近更新 更多