【问题标题】:in C++, how can I find all elements of an array linked directly or indirectly to a specific element of the array?在 C++ 中,如何找到直接或间接链接到数组特定元素的数组的所有元素?
【发布时间】:2016-06-13 01:55:14
【问题描述】:

我有一个对象数组,每个对象都有一个权重值,一些对象附加到另一个成为其父对象的对象。我需要将所有子对象的权重添加到父对象,并且附加到子对象的对象的权重等等必须添加到父对象。

这是迄今为止我最好的方法,但不知何故它最终根本没有改变父母的原始体重:

void showMasterClass::mass_manager(int parent)
{
    for (int n = 0; n < total_objects; n++)
    {
        object[n].setMass(object[n].getEmptyMass());
    }

    for (int n = 0; n < total_objects; n++)
    {
        if (object[n].getDockedTo() == parent)
        {
            object[parent].setMass(object[parent].getMass() + object[n].getMass());
            mass_manager_subroutine(n, parent);
    }
    }
}

void showMasterClass::mass_manager_subroutine(int objeto, int parent)
{
    for (int n = 0; n < total_objects; n++)
    {
        if (object[n].getDockedTo() == objeto)
        {
            object[parent].setMass(object[parent].getMass() + object[n].getMass());
            mass_manager_subroutine(n, parent);
        }
    }
}

【问题讨论】:

  • 无论如何都要发布您的代码,因为这将帮助我们更好地了解您的尝试以及我们如何提供帮助。
  • 不要对你的代码感到尴尬。如果没有证据表明你已经努力解决问题,人们会比你的尝试有点混乱(尽管格式正确)更让人恼火。你能举个小例子吗,我很难理解你的描述。谢谢。
  • 所以你的目标是以一个结构结束,其中每个数组元素都有一个权重、一个父级(可能为 null)和一个总权重(它自己的权重加上其子树中所有内容的权重) )?
  • 你是如何实现父子关系的?每个子项是否包含指向其父项的索引或指针?程序是否必须识别和处理循环依赖?
  • 添加了我的代码,感谢您的回复。 @Frank Puffer是的,每个孩子都有一个指向其父母的元素。 @S McCrohan 是的,这正是我们的目标。

标签: c++ arrays loops


【解决方案1】:

您尝试实现的是后序、深度优先的树遍历。您只是碰巧以具有子到父引用的数组的形式获取树。

缺少父子引用会降低该过程的效率,但它仍然是可行的。

纯粹将其视为结构问题(暂时避免代码,以避免对您的假设做出假设),您正在查看一个递归调用,给定数组和“根”的索引:

  1. 查找以您的根为父节点的所有节点。
  2. 以每个节点作为您的新根进行递归。
  3. 返回根的权重加上每个子节点的返回值(如果有)。

如果您的起始数组不能保证没有循环依赖,那么您还需要传递当前访问节点的“链”,以便在您第二次访问节点时返回在血统的同一分支中。

要查找子节点,您可以每次遍历整个数组。这会给你一个 N^2 的整体效率,这很痛苦,但它也是最容易理解的方法,所以它是一个很好的起点。一旦您了解了它的工作原理,您就可以改进性能(例如在开始时进行一次遍历以映射父子关系,这将使遍历本身更快)。

【讨论】:

    【解决方案2】:

    假设你不必处理循环依赖:

    1. 遍历数组并标记所有的父对象。
    2. 其余对象没有子对象。遍历这些对象并递归地将它们的权重添加到它们的父对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多