将不平衡树转换为生成树

时间:2011-05-15 22:07:52

标签: algorithm data-structures tree parallel-processing spanning-tree

如何将不平衡树转换为(平衡)生成树?假设我有一棵树(在不同的节点上有不同的(不一定是不同的)子节点数)。我想以这样一种方式操纵树,使它成为一个k-ary生成树。

允许在树上进行各种迭代。限制是我们不能只收集一个地方的所有节点,然后从中生成一个生成树(这将是一个简单的方法)。而是必须从给定树创建生成树。也就是说,孩子们可以与父母(以及祖父母,如果需要)交换信息(例如,它拥有的子节点的数量和子节点的ID),并且父母决定在其子节点之间移动节点(按顺序)平衡树。)

您可能已经理解我正在尝试在并行计算环境中执行此操作。其中,所有节点都知道其父节点的id,其子节点以及每个子树中以子节点为根的节点数。

(当我们尝试平衡树时,父母和孩子会改变)。有关如何处理此问题的任何提示?


回复评论,为什么这个问题很重要/值得考虑 - 毕竟琐碎的应用程序是可扩展的:

  1. 从理论上讲,开发一种使用小于O(N)空间(用于简单方法)构建生成树的算法具有挑战性。

  2. 有意识地考虑大规模的替代解决方案。

  3. 就数字而言:N = 100,000(这在今天的超级计算机中很常见,在即将到来的BG / Q中N将是1000,000)。在微不足道的方法中,所讨论的步骤是a)全部减少b)O(N)构建生成树和c)最后是一对多广播。

  4. 另一种分布式方法可能没有太大的改进,但出于好奇,可能值得尝试。

2 个答案:

答案 0 :(得分:2)

恭敬地,我认为你严重低估了你的“琐碎案例”在典型的并行计算环境中扩展的程度。小心发布一些实际数字?

答案 1 :(得分:1)

对一些合适的算法进行随机思考:

  1. 任意选择一个“根”,可能是参与者中最低的索引元素,或者可能是现有结构的根。
  2. 将“阶段”视为一个并行缩减,它计算树的最深部分的深度和身份以及尚未饱和的树的最浅部分。
  3. 在每个阶段之后,根指示正确数量的节点从最深部分到浅部分的移动以平衡深度。
  4. 重复直至完全平衡
  5. 这也可能以完全分布的方式运作,其中每个邻域根据AVL标准之类的东西进行平衡,并最终传播大的结构变化。