我有一棵树,其中节点包含对两个父节点的引用;由于工作方式的原因,他们可以在某个时刻指向相同的节点。
Example:
Parent1: Node234234 -> Node233645 -> Node2323429 -> Node2939230
Parent2: Node112938 -> Node2323429 -> Node2939230
如果我只是尝试解析每个节点一次,而不是一次,无论它出现多少次,你会怎么做?
我已经考虑过使用List.Contains,然后停止它是否属实,但它看起来有点混乱;我已经考虑过使用HashTable(我只是添加节点),但我认为在较大的树上可能效率很低。您认为什么是高效,快速的解决方案?
答案 0 :(得分:0)
**编辑:** 再次阅读你的问题后,我有充分的理由相信我误解了它。在我看来,你实际上正在解析文本输入并从中创建一个树。如果是,请忽略选项号。 2。
我现在可以想到两种方法可以解决它:
1。使用 bloom过滤器。如果你的树很大,它在空间方面绝对值得,如果节点不经常重复,它可能适合你的需要,如果你可以容忍一些节点根本没有被解析。某些节点可能无法解析,因为此结构可能会返回属于运算符的误报(在这种意义上它是概率数据结构)。请查看wikipedia上的详细信息页面。
2。创建包装当前节点类的类的树,并添加一个在访问节点后设置为true的布尔值。例如:
class NodeAndVisitationInfo {
public bool Visited;
public NodeType Node;
public NodeAndVisitationInfo() {
Visited = false;
}
}
如果您需要多次执行此操作,则第二个解决方案可能并不理想,因为在这种情况下,您应该在运行访问算法之前为两个树中的所有节点设置Visited
到false
再次。另请注意,此算法完全非线程安全。
最重要的是,不要为每个新解析的节点进行简单的List.Contains
调用,对于最坏的情况,这将是O(n ^ 2)。如果要将节点存储在搜索结构中,请选择其分摊的插入和搜索复杂度都更好的节点。对于这个问题,有序列表甚至哈希集可能更好。