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