【发布时间】: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 倍,则可能需要这样做。