一个人如何在一组给定的数据中存储和查找祖先?

Posted

技术标签:

【中文标题】一个人如何在一组给定的数据中存储和查找祖先?【英文标题】:How does one store and find ancestry in a given set of data? 【发布时间】:2013-05-01 02:25:31 【问题描述】:

我的意思:

假设你输入了成对的字符/字符串:

x y
a b
b x

每个左手对象映射到右手对象作为祖先。 所以,假设我然后输入一组新的数据对。这一次,我想查找输入的第一个对象是否是输入的第二个对象的祖先(根据我使用第一组输入构建的地图)。

例如,假设我输入:

a y

程序应该告诉我 a 实际上是 y 的祖先。它不必显示路线,只需简单的是或否。 a 是祖先,因为它映射到 b,b 映射到 x,x 映射到 y。

a - b - x - y

有人能解释一下这样的东西是如何存储和构造的吗?我玩过 BFS,但无法弄清楚如何正确映射第一个输入数据。特别是,我如何确保正确映射后代?就像,我应该以某种方式认识到键'b'也是'a'的后代。这是在读取输入时完成的吗?在 BFS 期间?请帮忙。我真的需要理解这一点,因为这是我一直在努力解决的问题。我会欣赏 Java 中数据结构的实际示例,而不仅仅是指向 BFS 算法的链接。相信我,我都读过了。也许我对 BFS 的想法是错误的。

我正在使用 ArrayLists 的 HashMap 来存储第一个输入数据。因此,即使 LHS 相等,我也正确地将右侧字符串映射到左侧字符串。我只是不知道如何添加没有显式添加但隐含的后代。

【问题讨论】:

一个对象可以有多个孩子和父母吗? 是的,肯定有多个孩子,我假设有多个父母。 【参考方案1】:

我认为您最好的选择是链接列表。您可以在列表中搜索 a。然后从 a 到 b、b 到 x 和 x 到 y 遍历父链接。如果你用尽了这个列表并没有找到 y ,那么你就知道没有祖先关系。

这里有很多链表的例子(创建你自己的以及使用java.util.LinkedList

或者也许只是让您的对象实现一个接口,该接口定义了一个类似 getParent() 的方法,该方法返回一个公共类型或接口,如果不存在父级,则返回 null。然后将对象放入列表中。搜索 a 然后跟随父对象引用,直到您命中 null。如果在此之前没有找到有问题的祖先,那么答案是否定的。

【讨论】:

【参考方案2】:

我认为可以将您的孩子地图与父母名单相比较。您只需要一个递归函数来查找父母是否已经是祖先。看下面的代码。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AncestorTracker 

    private final Map<String, List<String>> childToParentMappings = new HashMap<String, List<String>>();

    public void addChildParentMapping(String child, String parent) 
        List<String> existingParents = childToParentMappings.get(child);
        if (existingParents == null) 
            existingParents = new ArrayList<String>();
            childToParentMappings.put(child, existingParents);
        
        if (!existingParents.contains(parent)) 
            existingParents.add(parent);
        
    

    public boolean isAncestor(String child, String ancestor) 
        boolean result = false;

        if (childToParentMappings.containsKey(child)) 
            List<String> immedidateParents = childToParentMappings.get(child);
            if (immedidateParents.contains(ancestor)) 
                result = true;
             else 
                for (String immediateParent : immedidateParents) 
                    if (isAncestor(child, immediateParent)) 
                        result = true;
                        break;
                    
                
            
        

        return result;
    

    public static void main(String[] args) 
        AncestorTracker ancestorTracker = new AncestorTracker();
        String[][] pairs =  "x", "y", "a", "b", "b", "x", "a", "y" ;

        for (String[] aPair : pairs) 
            String child = aPair[1];
            String parent = aPair[0];

            if (ancestorTracker.isAncestor(child, parent)) 
                System.out.println(child + " is already a decendent of " + parent); 
             else 
                ancestorTracker.addChildParentMapping(child, parent);
            
        
    

【讨论】:

以上是关于一个人如何在一组给定的数据中存储和查找祖先?的主要内容,如果未能解决你的问题,请参考以下文章

查找具有给定祖先的提交

如何在一组对象中查找特定值?

如何找到具有某个标签的后代叶节点的最低祖先?

如何找到树上一组节点之间的最大距离?

如何在 UWP 中进行相对源模式查找祖先(或等价物)

在给定二叉树中的两个值的情况下找到最不共同的祖先[关闭]