【问题标题】:Attempting to efficiently find common parent control from list of child controls试图从子控件列表中有效地找到公共父控件
【发布时间】:2011-10-04 19:33:21
【问题描述】:

我有一个控件,它可能包含相同类型的子控件。这些控件已经链接在一起,形成了一个树形结构。

现在,给定此树中存在的 X 控件列表,我想在列表中的所有控件中找到最接近的公共父控件。我不知道我的子控件在树中的位置。

非常愿意对这个问题做一些思考,但我只能假设它已经得到了最佳解决。有谁知道我在哪里可以找到这个算法?如果没有,建议的方法或阅读?

【问题讨论】:

  • 这听起来像一个面板里面一个面板里面一个面板,然后它旁边的一个列表框显示每个面板的名称。类似的东西?
  • 是的,差不多。 :) 我已将 IMG 上传到最初的帖子,以可视化我的问题。
  • 希望我能 +10。这是一个很棒的小谜题。好像以前有人问过:) stackoverflow.com/questions/1484473/…
  • 嘿,谢谢!我没有看到它已经发布了。我应该将此标记为重复

标签: c# algorithm


【解决方案1】:

维基百科有几篇关于这个问题的文章:

通论:Lowest common ancestor

一些实现:Tarjan's off-line least common ancestors algorithm

【讨论】:

    【解决方案2】:

    由于 Tarjan 的离线最少共同祖先是离线的,您可能希望通过其他途径解决问题。使用广度优先或深度优先搜索,在搜索列表中找到每个项目的路径。然后,您可以使用这些路径来确定最低的共同祖先。

    伪代码类似于:

    1. 遍历树中的所有节点
    2. 如果节点在搜索列表中,记录路径(从节点ID)
    3. 搜索完所有节点后,从每个搜索列表节点的第一个路径id开始
    4. 如果所有节点的第一个 id 相同,则移动到下一个 id
    5. 重复第 4 步,直到至少有一个 id 不同。前一个 id 是最不常见的祖先。

    例如,对于您的搜索列表示例,您将构建以下路径索引

    H -> ABDH 我 -> 阿贝 J -> ABEJ E -> 安倍

    现在,您可以看到所有节点在位置 1 有一个 A。在位置 2 有一个 B。但是,在位置 3,H 有一个 D,它与其他节点不匹配。因此节点 B 是最小共同祖先。

    显然有一些极端情况。如果搜索列表只有一项,则它是最不共同的祖先。同样,如果您正在比较路径并到达节点本身,它就是共同祖先。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多