Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用部分关键点的多关键点地图搜索/过滤_Algorithm_Data Structures - Fatal编程技术网

Algorithm 使用部分关键点的多关键点地图搜索/过滤

Algorithm 使用部分关键点的多关键点地图搜索/过滤,algorithm,data-structures,Algorithm,Data Structures,我的问题类似于 我有键值对,其中键由三个组件(字符串)组成 我正在寻找一个数据结构,可以有效地执行对键的搜索查询,其中的查询可以是完整的或部分的键(一个或多个组件省略)。例如: (x, y, z) (x, *, *) (*, y, *) etc. 钥匙的未指定部分可以在钥匙的前部、中部或末端 我当前的实现(将所有可能的部分键映射到与此部分键匹配的一组值的哈希映射)在插入、删除和更新值时速度非常慢 我当前的实现(一个哈希映射,映射所有可能的部分 与此部分键匹配的值的列表的键速度非常慢 插入、删除

我的问题类似于

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

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

(x, y, z)
(x, *, *)
(*, y, *)
etc.
钥匙的未指定部分可以在钥匙的前部、中部或末端

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

我当前的实现(一个哈希映射,映射所有可能的部分 与此部分键匹配的值的列表的键速度非常慢 插入、删除和更新值时


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

使用部分键时会想到Trie…Trie似乎仅限于前缀。这样,始终需要指定第一个“组件”。我还考虑了后缀树,它似乎解除了这一限制,但这似乎与我当前的解决方案相同,但(不是使用散列)使用了二叉树。这个结论是错误的吗?既然你的钥匙数量有限,为什么不使用三个单独的地图-每个钥匙一个?这将需要稍多的空间,但不会显著影响时间性能。@blgt:3还不够。我在有向图中考虑的更多,如果三元组是
(a,b,c)
,则边是
(a,b),(b,c)
。这最终相当类似于尺寸上的trie,而不是每个数字上的trie。所以
(50,20,30)
(50,20,50)
基本上变成了`数据[50][20]={30,50}。当然,您可以只使用三个(这是仓促不够的原因),但是您必须处理集合交叉点,这会导致查询不是O(k),其中k是返回的三元组数。如果目标是只提高速度5-10x,那么这可能是必需的。2^3=8个映射,每个映射有(x,y,z),(x,y,*,z),(x,*,*),(,y,z),(,y,*),(,z),(,*,*,*)比一个映射每个键有8个条目(就像我现在这样)更有效吗?我必须看一个例子,但现在想起来可能不会。看起来我遗漏的实际问题可能是您用于存储三元组的数据结构。列表在做这些事情时确实相当慢,所以我更改了我的答案,因为这更可能是问题所在。您可能还希望包含一个语言标记。我确实在使用一个集合。提到清单是一个错误。从绝对值来看,这个过程是缓慢的,但从8o(1)个插入仍然是O(1)的意义上来说,您是对的。也许这是最快的。。。因此,我将您的答案标记为已接受。@WernerdeGroot:如果您已经在使用集合,那么这可能是的情况,您可以对您的问题进行一些补充。如果三倍体的数量太多让你慢下来,那么三倍体是从哪里来的呢?根据三元组列表的生成方式,可能有一种方法可以有效地索引三元组,而无需实际迭代每个三元组。还有,您有多少个三元组,将它们添加到数据结构需要多长时间?