Tree 如何在MPI中创建包含自引用字段的结构?

Tree 如何在MPI中创建包含自引用字段的结构?,tree,mpi,self-reference,Tree,Mpi,Self Reference,我想创建一个二叉树,对于它,我需要能够从内部引用结构 这棵树的形状是一样的 struct tree { int val; struct tree *lchild, *rchild; }; 如何在MPI中执行此操作?MPI中没有指针类型-这没有任何意义。MPI进程有完全独立的地址空间,因此指针在转移到另一个列组时是无用的 您应该从根本上重新考虑与分布式计算相关的数据结构。如果没有关于这个问题的更多细节,我无法给出一个一般性的建议。MPI中没有指针类型

我想创建一个二叉树,对于它,我需要能够从内部引用结构

这棵树的形状是一样的

    struct tree
    {
     int val; 
     struct tree *lchild, *rchild;
    };

如何在MPI中执行此操作?

MPI中没有指针类型-这没有任何意义。MPI进程有完全独立的地址空间,因此指针在转移到另一个列组时是无用的


您应该从根本上重新考虑与分布式计算相关的数据结构。如果没有关于这个问题的更多细节,我无法给出一个一般性的建议。

MPI中没有指针类型-这没有任何意义。MPI进程有完全独立的地址空间,因此指针在转移到另一个列组时是无用的


您应该从根本上重新考虑与分布式计算相关的数据结构。如果没有关于这个问题的更多细节,我无法给出一个一般性的建议。

这类问题出现在这里,以至于我们可能应该尝试写一个规范性的问题

正如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
三个子树保持连续,这有利于发送它们;预排序对于很多应用程序来说都很好,因为它可以很容易地找到子树,但是您使用的排序应该与您使用/搜索数据的顺序相匹配


但各种选择的最佳决策-完整与稀疏表示,计算线性顺序的方法,是否使用数组表示作为计算的本机表示,还是仅仅序列化为该表示以进行通信,这一切都取决于您将如何使用结构。

这里出现了此类问题,我们可能应该尝试编写一个规范问题

正如Zulan所指出的,指针在分配内存的进程之外没有意义,因此通常不能这样做。暂时忘掉MPI,想象一下将数据写入磁盘——指针值本身对重建树结构没有任何帮助

但是树和图结构非常有用,甚至在分布式内存计算中也被广泛使用,因此您需要一种表示数据的方式,这种方式可以序列化(通过网络到另一个进程或磁盘),对于您的用例来说相对有效

如果您的结构是非常动态的(包括高度(或度,对于图形)更改),那么将数据保存在链接树类型表示的内存中,并在需要时序列化需要发送到数组中的块可能是有意义的。另一方面,如果树的结构保持相对稳定,则将数据保留在数组表示中可能是有意义的,即使对于计算也是如此

无论哪种方式,您都需要能够以某种有意义的方式序列化数据。坚持二叉树,考虑如下:

            A
           / \
          /   \
         B     E
        / \   / \
       C   . .   F
      / \       / \
     D   .     .   .
    / \
   .   .
有很多方法可以用线性阵列来表示这一点;哪一个最好取决于你需要什么

首先,您必须决定是表示完整的二叉树(所有2^(高度+1)-1个节点)还是仅表示存在的那些节点,在树的末尾有显式的空节点表示子树的端点;如果您的树将接近完整和平衡,则第一种方法速度更快,空间效率更高,并且具有能够显式计算给定节点索引的子级或父级的索引的优势,而第二种方法则更节省空间,但您失去了显式可计算性优势。(比如说,密集矩阵表示法和稀疏矩阵表示法的利弊相同;这是一组常见的权衡)。下面我假设你不是代表