我想创建一个二叉树,我需要能够从内部引用结构。
树的形式为
struct tree
{
int val;
struct tree *lchild, *rchild;
};
我如何在MPI中执行此操作?
答案 0 :(得分:2)
MPI中没有指针类型 - 它没有任何意义。 MPI进程具有完全独立的地址空间,因此当转移到另一个等级时,指针将毫无用处。
您应该从根本上重新考虑分布式计算方面的数据结构。如果没有关于这个问题的更多细节,我无法给出一般性建议。
答案 1 :(得分:1)
这里出现了a lot这类问题,我们应该尝试写一个规范问题。
正如Zulan所指出的那样,指针在分配内存的过程之外并没有意义,因此一般情况下都无法做到这一点。暂时忘记MPI并简单地想象一下将数据写入磁盘 - 单独的指针值对于重构树结构没有任何帮助。
但树和图形结构非常有用,甚至在分布式内存计算中也被广泛使用,因此您需要一种方法来表示可以序列化的数据(通过网络到另一个进程或磁盘),这是相对有效的 您的 用例。
如果您的结构非常动态 - 包括高度(或度数,图表)更改 - 将数据保存在内存中的链接树类型表示可能是有意义的,只需序列化需要发送到阵列在需要时出现。另一方面,如果树的结构保持相对稳定,即使对于计算,将数据保持在数组表示中也是有意义的。
无论哪种方式,您都需要能够以某种有意义的方式序列化数据。坚持使用二叉树,请考虑以下内容:
A
/ \
/ \
B E
/ \ / \
C . . F
/ \ / \
D . . .
/ \
. .
您可以通过多种方式在线性阵列中表示这一点;哪一个最好取决于你需要什么。
首先,您必须决定是表示完整的二叉树(所有2 ^(高度+ 1)-1个节点)还是仅表示存在的那些节点,在表示结尾的树的末尾使用显式空节点子树;第一个是更快,更节省空间如果你的树将接近完全和平衡,并且给出了能够显式计算给定节点索引的子节点或父节点的索引的优点,其中如果没有,第二个是更节省空间,但你失去了明确的可计算性优势。 (这些优点和缺点是相同的,例如,密集与稀疏矩阵表示;它是一组常见的权衡)。在下面我假设您没有代表完整的二叉树。
然后你必须决定如何将树中的位置转换为数组线性顺序的位置;规范表示是预先订购的:
A B C D . . . . E . F . .
或按顺序
. D . C . B . A . E . F .
或后期订单
. . D . C . B . . . F E A
这三个子树保持连续,这对于发送它们来说是很好的;预订很适合很多应用程序,因为它可以很容易地找到子树,但是你使用的顺序应该与你使用/搜索数据的顺序相匹配。
但是各种选择的最佳决策 - 完全与稀疏表示,计算线性排序的方法,以及是否使用数组表示作为计算的本机表示与仅序列化为通信表示 - 都归结为你将如何使用这些结构。