【问题标题】:Multi key map searching/filtering with partial key使用部分键进行多键映射搜索/过滤
【发布时间】:2014-07-14 13:08:58
【问题描述】:

我的问题类似于Data structure for partial multi-keys mapping?

我有键值对,其中键由三个组件(字符串)组成。

我正在寻找一种可以有效地对键执行搜索查询的数据结构,其中查询可以是完整或部分指定键(省略一个或多个组件)。例如:

(x, y, z)
(x, *, *)
(*, y, *)
etc.

键的未指定部分可以在键的前面、中间或末尾。

我当前的实现(将所有可能的部分键映射到与该部分键匹配的一组值的哈希映射)在插入、删除和更新值时非常慢。

【问题讨论】:

  • 使用部分键时会想到 Trie...
  • 特里似乎仅限于前缀。这样,总是需要指定第一个“组件”。我还考虑了一个后缀树,它似乎解除了这个限制,但似乎这与我当前的解决方案相同,但使用二叉树(而不是使用哈希)。这个结论错了吗?
  • 既然键的数量有限,为什么不使用三个单独的映射 - 每个键一个?这将需要更多空间,但不会显着影响时间性能。
  • @blgt: 3 是不够的。
  • 我更多地考虑有向图的线,如果三元组是(a,b,c),那么边是(a,b), (b,c)。这最终与在维度上而不是在每个数字上的尝试非常相似。这样(50,20,30)(50,20,50) 基本上就变成了`data[50][20] = {30,50}。你当然可以只使用三个(这是草率不够的地方),但是你必须处理导致查询不是 O(k) 的集合交集,其中 k 是返回的三元组的数量。如果目标只是将速度提高 5-10 倍,则可能需要这样做。

标签: algorithm data-structures


【解决方案1】:

我当前的实现(映射所有可能的部分的哈希映射 list 的值与此部分键匹配的键)非常慢 插入、删除和更新值时。

如果您实际使用的是列表,那么几乎可以肯定这就是问题所在,因为它们删除/更新/插入速度很慢也可能是一个问题,具体取决于您的操作方式。最好使用集合(无序)或平衡二叉搜索树(有序)。

【讨论】:

  • 有 2^3 = 8 个带有 (x, y, z), (x, y, ), (x, *, z), (x, *, *) 的地图, (, y, z), (, y, *), (, , z), (, *, *) 比一张图更有效每个键有 8 个条目(就像我现在一样)?
  • 我必须看一个例子,但现在我想可能不是。似乎我错过的实际问题可能是您用于存储三元组的数据结构。列表在做这些事情方面确实相当慢,所以我改变了我的答案,因为这更有可能是问题所在。您可能还想包含一个语言标签。
  • 我确实在用一套。提到一个列表是一个错误。这个过程在绝对意义上是缓慢的,但你是对的,因为 8 个 O(1) 插入仍然是 O(1)。也许这是最快的速度......因此我将您的答案标记为已接受。
  • @WernerdeGroot:如果您已经在使用集合,那么这可能是XY-Problem 的情况,您可以对您的问题进行一些补充。如果大量的三元组让你放慢了速度,那么你从哪里得到三元组?可能有一种方法可以有效地索引三元组,而无需实际迭代每个三元组,具体取决于三元组列表的生成方式。另外,您有多少个三元组,将它们添加到数据结构需要多长时间?
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 2016-02-11
  • 2013-01-25
  • 2011-11-04
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多