【问题标题】:Two-dimensional hash map: A matrix where row and column types are pointers二维哈希图:行和列类型为指针的矩阵
【发布时间】:2016-02-16 12:15:39
【问题描述】:

我正在寻找一个二维哈希映射,其中行和列索引是指针。即,我要求它们是指针,而不是无符号的连续整数作为行和列索引。

我不关心插入性能或其在内存中的大小,但我确实需要快速查找和迭代。

基本界面可能如下所示:

template<typename Key, typename Value>
class pointer_matrix
{
public:
    iterator insert(Key const& row, Key const& column, Value& value);
    Value& at(Key const& row, Key const& column);
    row_iterator row(Key const& row);
    column_iterator column(Key const& column);
};

这个界面将允许我进行两种类型的查找:

  • 给定两个键,我可以识别出对应的值对象:(Key, Key) =&gt; Value
  • 只需一个键,我就可以遍历多个值对象;此值对象向量表示行或列,具体取决于查找:Key =&gt; (Value, Value, ...)

它基本上是一个“表”,其中列和行标题都是指针,而不是从 0 开始的连续整数。

在 Google 中搜索“指针矩阵”或“哈希矩阵”会找到有关简单 my_type** 矩阵的信息,这绝对是我所需要的不是

这样的容器存在吗?如果不是:构建这样一个容器的合理工具是什么?

【问题讨论】:

  • std::map 怎么样?
  • 在您的示例界面中,您的意思是Key 必须是“任何可散列类型”吗? (而且您知道“无符号的连续整数”包含在“可散列”要求中)您能否编辑您的问题以包括如何使用 pointer_matrix 的示例?或者至少包括一个用例?
  • 无论如何,如果你想要任何可散列的东西作为键,为什么不使用std::unordered_map 作为底层容器呢?
  • 您似乎在寻找二维地图。通常你只需制作一张地图,std::unordered_map&lt;key, std::unordered_map&lt;key, value&gt;&gt;,等等,以获得地图的更多维度。然而它不是一个矩阵(例如它的行列式是什么?)所以搜索矩阵实现可能没有帮助。

标签: c++ pointers matrix


【解决方案1】:

您描述的是哈希表的哈希表。也就是说,每个桶都是一个小哈希表,具有(概念上)不同的哈希函数。如果您使用 % size,则不同的大小可能会用作不同的哈希函数。

我猜你正在尝试实现某种完美的散列,这是其中的一种方法。您可以在 wikipedia 中阅读它。

如果您对现实世界感兴趣(而不是学术),我会使用链表存储桶针对普通散列进行测试。 不保证完美哈希的查找性能会更好。

【讨论】:

    【解决方案2】:

    使用多图 (MM) >.

    添加值时,还必须插入 > 和 >。

    插入时,你必须搜索key1,如果找到你插入的map中插入返回一个值(MM_iter->second)。 否则,您创建一个地图并将其插入 MM。

    这样,如果你搜索一个唯一键,则返回 MM.find(key); 返回的 map 中的所有值; 如果您使用 2 个键进行搜索,则 MM.find(key1).find(key2)。

    【讨论】:

    • 如果您执行 MM.find(key1),根据您搜索行还是列,结果有何不同?一些代码示例可能会进一步说明
    • 我认为 key1 和 2 可以颠倒。问题是“给定一个键,我可以遍历多个值对象;这个值对象向量代表行或列,具体取决于查找:Key => (Value, Value, ...)”如果你想从列中分离行,你必须使用 2 MM 并且只在其中一个中插入/请求(关于这个,这个问题对我来说是模棱两可的......)
    • 地图是树,所以查找时间是对数的。在 const 时间内进行哈希查找。
    最近更新 更多