Algorithm 如何从中间搜索尝试 我一直在这种情况下,我有一个TIE分支,我想在它的中间向下匹配。举个例子,我可能有这个trie分支之类的东西 foo { bar { baz { hello { world { 123 { 456 { abc { xyz } } } } } } } }

Algorithm 如何从中间搜索尝试 我一直在这种情况下,我有一个TIE分支,我想在它的中间向下匹配。举个例子,我可能有这个trie分支之类的东西 foo { bar { baz { hello { world { 123 { 456 { abc { xyz } } } } } } } },algorithm,search,data-structures,trie,Algorithm,Search,Data Structures,Trie,这是一个大大缩短的版本。实际上,它可能是一个具有100个级别的二进制trie,例如10101011010100110000101……,如: 1 { 0 { 1 { 0 { 1 { ... } } } } } 但在使用字符串键的简化示例中,完整路径如下所示: foo/bar/baz/hello/world/123/456/abc/xyz /world/123/456/ 这是常见的尝试,基本上从

这是一个大大缩短的版本。实际上,它可能是一个具有100个级别的二进制trie,例如
10101011010100110000101……
,如:

1 {
  0 {
    1 {
      0 {
        1 {
          ...
        }
      }
    }
  }
}
但在使用字符串键的简化示例中,完整路径如下所示:

foo/bar/baz/hello/world/123/456/abc/xyz
/world/123/456/
这是常见的尝试,基本上从顶部的的黎波里和移动部分或所有的方式下降。因此,您可能会在这里找到匹配项,在部分路径上

或者你也可以在这里找到:

foo/bar/baz/
这很容易尝试,你只需要从顶部开始,然后一路向下。所有这些都有一个共同点,那就是它们从分支的顶部开始

但我想知道的是不同的。我想知道如何从的黎波里的某个地方开始。例如,我想这样匹配:

foo/bar/baz/hello/world/123/456/abc/xyz
/world/123/456/

基本上像正则表达式<代码> */Works/123/456 /*<代码>,在中间匹配。

问题是,如果trie是稠密的,那么理论上可能有数千个甚至一百万个节点散布在trie中。因此,在
/world/123/456/
中匹配5个层可能意味着在找到匹配之前扫描1000个上层trie节点


我想知道在这种情况下你会怎么做,可能的解决办法是什么。目前我所能想到的就是在某种程度上使分支的中间部分成为它自己的顶级trie,在内存中的另一个地方复制trie的嵌套部分。但这看起来效率很低,浪费了空间和内存,这就是为什么我想知道如何解决这个问题。

从技术上讲,trie中的每个节点仍然是一个trie。可以将其视为该子树的根

您可以通过保留一个将每个节点的值映射到trie中相应节点的哈希表来利用此漏洞。如果节点可以有重复的值,则将每个值映射到节点列表

如果你需要在TIE中间搜索一个值,你可以使用哈希表立即跳到TIE中从你的起始值开始的节点。然后,对于这些节点中的每一个,您可以搜索您的值,就像该节点是某个顶级trie的根一样