【问题标题】:Compression of Keys in std::map or similar data structure压缩 std::map 或类似数据结构中的键
【发布时间】:2019-12-12 23:53:28
【问题描述】:

假设我想在 C++ 中存储一个键值。让我们进一步假设我有 1,000,000 个唯一键,它们仅映射到 100 个值,但每个键都有这 100 个值之一。

在 C++ 中是否有一种有效的方法来利用多次存在的许多值来压缩此查找表?

在我的脑海中,它归结为布尔逻辑最小化......但看看是否存在 C++ 的任何库或数据结构会很有趣。

【问题讨论】:

  • 如果所有键在数字上都是连续的,或者它们是否无处不在,答​​案将大不相同。
  • 你会如何压缩它(通常,某些特殊情况可能存在)。您仍然需要存储所有键以及描述哪些值与键关联的内容,此外,您需要存储与map 相关的所有膨胀。如果值类型非常大,您可以实现的唯一压缩是用索引替换值。这样可以避免不必要的值类型副本。
  • 这里的目标是什么?您要执行哪些操作?插入很多东西然后遍历所有值?查找很多值?混合插入和查找?在一般情况下,@Qubit 所说的不多 - 你可以存储例如指向您在地图中的值的指针,但std::map 仍然有大量开销 - 但如果您只需要执行非常具体的操作,也许有一个很好的解决方案。

标签: c++ compression key-value stdmap


【解决方案1】:

如果值的大小大于指针的大小,那么您可以保留指针/引用而不是值。

关于压缩查找表,我看到的唯一可行的解​​决方案是只填充一次映射,然后只执行读取操作(可以更改值,但不能添加)。如果是这种情况,那么您可以使用标准散列和修剪键值,以便将每个桶键保持在区分它们所需的最小长度。这当然是假设您可以比较不完整的键,即strings 或类似对象。

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多