我有一个存储值关系的数组,这使得几个树类似于:
因此,在这种情况下,我的数组将是(root,链接到)
(8,3) (8,10) (3,1) (3,6) (6,4) (6,7) (10,14) (14,13)
我想将数组中的所有根值设置为树中的主根(在所有树中):
(8,3) (8,1) (8,6) (8,4) (8,7) (8,10) (8,14) (8,13)
我应该调查哪种算法?
答案 0 :(得分:6)
1)列出元组中所有唯一的第一个元素。
2)删除任何也作为元组的第二个元素出现的内容。
3)你将留下根(这里8)。用这个值替换所有元组的第一个元素。
编辑:
可以使用多个树的更复杂的方法如下。
首先,转换为父查找表:
1 -> 3
3 -> 8
4 -> 6
6 -> 3
7 -> 6
10 -> 8
13 -> 14
14 -> 10
接下来,在每个元素上运行“find parent with path compression”:
1)
1 -> 3 -> 8
给出
1 -> 8
3 -> 8
4 -> 6
...
3)
3 -> 8
4)
4 -> 6 -> 3 -> 8
给出
1 -> 8
3 -> 8
4 -> 8
6 -> 8
7 -> 6
...
6)
6 -> 8 (already done)
7)
7 -> 6 -> 8
等
结果:
1 -> 8
3 -> 8
4 -> 8
6 -> 8
7 -> 8
...
然后将其转换回元组列表:
(8,1)(8,3)(8,4)...
具有路径压缩算法的查找父级为find_set
,用于不相交的集合林,例如。
int find_set(int x) const
{
Element& element = get_element(x);
int& parent = element.m_parent;
if(parent != x)
{
parent = find_set(parent);
}
return parent;
}
关键是路径压缩可以帮助您避免大量工作。在上文中,例如,当您对4
进行查找时,存储6 -> 8
,这会使以后的查找更快地引用6
。
答案 1 :(得分:0)
假设你有一个代表点的元组列表:
def find_root(ls):
child, parent, root = [], [], []
for node in ls:
parent.append(node[0])
child.append(node[1])
for dis in parent:
if (!child.count(dis)):
root.append(dis)
if len(root) > 1 : return -1 # failure, the tree is not formed well
for nodeIndex in xrange(len(ls)):
ls[nodeIndex] = (root[0], ls[nodeIndex][1])
return ls