用于查询名称空间的最佳算法和时空复杂度

问题描述 投票:0回答:1

假设我有一个具有7个级别的名称空间,其格式为A / B / C / D / E / F / G = 50

此名称空间当前在字典中用于管理系统中特定变量的值。自然,这代表一棵树。这棵树有超过20,000个叶节点,并且正在增长,并且需要每秒更新1,000次。

我们需要支持通配符(+),以允许我们查询此命名空间。例如:返回所有适合通配符A / + / C / D / E + / G的名称空间。或获取A / B / C / + / + / G = 100的名称空间。

不会动态添加名称空间。

使用正则表达式,我可以将'+'替换为'(*。)',但是它是O(n)。我知道如果是+ / + / + / + / + / + / + / +,情况就是这样。

我能想到的是带有DFS的标准树?有更好的方法吗?分摊的时间/空间复杂度是多少?

谢谢

algorithm sorting search graph-algorithm
1个回答
0
投票

在没有进一步假设的情况下,查询树等于O(n),因为包括了退化的情况,例如列表。

平衡的二叉搜索树保证O(log n)-任何2个根路​​径的深度最多相差1,这意味着树的高度由O(log n)限制。

散列的根路径导致O(1)具有关于散列函数的常见警告。

在您草绘的用例中,可能需要进行一些优化:

  • 通配符分辨率和缓存:如果树结构支持基于rootpath的缓存,则取决于树结构变化的频率和有效不同通配符查询的数量,将通配符查询解析为匹配的根路径并对其进行缓存可能是有益的。

  • 工作清单处理模型给定每个时间单位的节点数和查询数之比,将代码分成:

    1. 遍历线程它们以预定的方式遍历树。他们可以访问包含当前活动查询的作业列表。当线程到达与活动查询匹配的节点时,它将数据发送到输出线程。

    2. 调度程序线程接收查询,可能将它们捆绑在一起,并将其分派到一个/几个遍历线程

    3. 输出线程收集查询结果并将其输出。

  • 如果不对分布和查询顺序建模,就无法确定摊余的复杂度。是否可以证明查询的位置属性,即如果在较短时间间隔内到达的查询倾向于选择相同的子树/共享根路径的大部分,那么在回答查询之前收集查询可能会显着减少摊销时间。

© www.soinside.com 2019 - 2024. All rights reserved.