有没有一种有效的方法来对具有父子关系的对象数组进行排序?

时间:2019-03-03 08:38:23

标签: c++ algorithm sorting parent-child

我正在尝试找出一种有效的方式来对数组进行排序,其中每个对象都可以指向同一数组中“父”对象的索引。
每个对象都可以没有父对象(索引为-1),也可以没有一个父对象,因此只有一对多的关系。
您可以将任意数量的对象链接在一起,从而创建深层次。
但是,它们全部位于一个连续的数组中,并以任意顺序添加。

以下是一个对象外观的示例:

struct Object
{
    void* data;

    int ParentIndex; //Will either be '-1' or will be an index in 'objects' where the parent of this object is.
};

std::vector<Object> objects;

看来,一对多关系的唯一方法是对每个父级使用深度递归。
但是,它的性能非常差。
是否存在可以解决此类问题的算法?

1 个答案:

答案 0 :(得分:1)

您必须考虑一些问题:

    从理论上讲,它可能包含一个递归链。彼此是两个或更多对象。
  • 排序时,当您移动父对象时,它必须更新其所有子对象。

因此,我认为唯一有效的方法是使用指针而不是索引将其转换为图(多子树)。

struct Object2
{
    void* data;
    Object2* FirstChild; // Will point to first child (if there is), or null.
    Object2* NextSibling;// Will point to next sibling (if there is), or null.
};

实际上,您可以使用任何XML库对其进行排序:

  • 只需将任何孩子添加到父元素。
  • 完成后,您将从XML中读取元素并使用新索引重新排序。