查询命名空间的最佳算法和时空复杂度

Best algorithm and Timespace complexity for querying namespace

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

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

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

的命名空间

命名空间不是动态添加的。

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

我能想到的就是带DFS的标准树?有更好的方法吗?摊销后的 time/space 复杂度是多少?

谢谢

在没有进一步假设的情况下,查询一棵树相当于 O(n),因为包含列表等退化情况。

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

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

在您勾画的用例中,可能会应用一些优化:

  • 通配符解析和缓存:
    根据树结构更改的频率和有效不同的通配符查询的数量,如果它支持基于根路径的缓存,则将通配符查询解析为一组匹配的根路径并缓存它们可能是有益的。

  • 工作列表处理模型 给定每个时间单位的节点和查询比率,将代码拆分为:

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

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

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

如果不对分布和可能的查询顺序建模,则无法确定摊销的复杂性。如果一个地方 属性 可以被证明用于查询,即。如果在小时间间隔内到达的查询倾向于 select 相同的子树/共享根路径的大部分,则在回答它们之前收集查询可能会显着减少摊销时间。

大视角

概述的要求是数据库的典型要求,这是大量研究产生复杂算法的领域。因此,一个明显的解决方案是利用 dbms 并依靠 db 优化器来有效地处理查询负载。