【问题标题】:C++ multimap like container to perform search on a part of a key类似容器的 C++ multimap 对键的一部分执行搜索
【发布时间】:2013-04-20 15:59:36
【问题描述】:

我想将数据存储在某种键(一些位数组)->值(整数)映射容器中。 Bitarray 最大可以达到 32 字节(并且可能是固定大小)。

当然可以是标准的 std::multimap。

std::multimap my_map;

但我还必须搜索密钥的一部分(几个位置上的 1 或 0 位),而不关心其余部分。例如:

插入地图:

  • 键b“1010001”下的值1,
  • 键b“1010001”下的值2,
  • 键 b“1000001”下的值 3
  • 键 b"0000001" 下的值 4

那么我应该收到值:

  • 如果我寻找 b"0000001",则为 1、2、3 和 4,
  • 如果我寻找 b“1000000”,则为 1、2 和 3,
  • 1 和 2 如果我寻找 b"1010001"

如果能够精确匹配键值对也很好。

如何在 boost 支持的 C++ 中以最简单(但仍然有效)的方式实现它?我关心性能(可能有数百万个键)。

【问题讨论】:

  • 看起来你只关心键中的所有 1 匹配而不是 0??
  • “以最简单的方式”-vector<pair<key,value>> 和蛮力搜索....位数是已知的并且很小(例如您的示例中的 7)或可能很大。
  • 这只是一个例子。但是,如果我能得到所有值就足够了,这些值从(searched_key & key)返回超过 0。 Tony D 好的,我会澄清的。

标签: c++ containers multimap


【解决方案1】:

您最好使用prefix tree。您可以轻松地修改实现以满足您只关心密钥的某些部分的需要。此外,搜索时间非常快。

对于您的示例,树的高度为 8,如果键中的当前位为 0,您将探索左子树,如果它是 1,则探索右子树。您可以将实现修改为不关心零并通过在您尝试匹配搜索键中的 0 的每个点进行分支(探索左右子树)返回所有结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2014-01-04
    • 2019-02-08
    • 2013-02-14
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多