用于在嵌套范围内查找的最佳数据结构

时间:2014-03-24 13:09:38

标签: c# dictionary compiler-construction tree lookup

说,有一个树数据结构,每个叶子定义了一组用于查找的键:

*
|- A = 1, B = 2
|- *
   |- C = 4
   |- *
      |- D = 5
      |- D = 6, E = 7

我需要一种在深度优先遍历树时查找任何给定叶子的键值的方法。

我想到了两种方法:

  1. 如果在当前叶子中找不到该值,请检查其父级的字典,依此类推,返回树的根目录。

  2. 有一个全局字典,每个叶子在遍历时插入/删除它的键。在此全局字典中执行查找。

  3. 最有可能的是,每个都会有很多带有几个键的叶子,每个键大约有3-4个查找。

    哪种方法更有效?或者,也许,还有另一种做法比两者都好?

1 个答案:

答案 0 :(得分:1)

您正在实施的编程语言肯定会定义名称解析的确切规则。我认为这不会导致深度优先搜索。很明显,名称解析规则看起来像这样:

  1. 搜索当前范围,经常只考虑源代码中当前位置声明的“up”;
  2. 当满足某些特定规则时,例如有某种形式的using / import或其他任何链接到其他范围的构造,在其他范围内执行搜索(所有这些范围,按顺序),并在其中递归:
    1. 搜索给定的范围,
    2. 递归任何相关的嵌套作用域;
  3. 转到紧邻的范围;
  4. 重复(1),其中'当前'范围是在(3)中确定的。
  5. 换句话说,你逐渐进入封闭范围的树,并决定是否搜索任何外国人的'引用范围。诸如using / import之类的语句会导致范围之间的引用,这反过来会导致被视为范围树的实际上是有向图。

    关于查找表构造,我从一个简单的哈希表开始。 Prefix trees (tries)也适用于这些场景。

    最后但并非最不重要的是,除非在编译数十行甚至数十万行代码时遇到真正的性能问题,否则我不会关心查找性能。