【问题标题】:Extending a graph struct in c在 c 中扩展图形结构
【发布时间】:2014-01-18 13:39:09
【问题描述】:

我的问题:我有一个由node struct 组成的图表

struct node {
   node *n1;
   node *n2;
}

我想添加一些成员来创建一个新结构newNode

struct newNode {
   newNode *n1;
   newNode *n2;
   newNode *n3; // new member
   int      a;  // new member
}

我想在图中保留原来的“节点连接”,这样我就可以做到了

newNode *n;
n->n1->n2...

就像

node *n;
n->n1->n2...

其中两个结构的n1(或n2)代表图中的同一个节点,而我也可以这样做

newNode *n;
n->n1->a...
n->n1->n3...

修改 node 结构体很棘手,因为它是在大型库中定义的。

我的想法是在newNode struct 中再添加一个成员

struct newNode {
   node    *n; // added member
   newNode *n1;
   newNode *n2;
   newNode *n3;
   int      a;
}

首先,我为每个node n 创建一个newNode n_new。然后我遍历每一对n_news,比如n_new1和n_new2,看看n_new1->nn_new2->n之间是否有联系,即是n_new1->n->n1 == n_new2->n,还是n_new1->n->n2 == n_new2->n,反之亦然。如果是这样,我制作n_new1->n1 = n_new2,或n_new1->n2 = n_new2,反之亦然。

但是时间复杂度是O(#node^2)。效率低下。

还有其他想法吗?

P.S.该图是一个降序二元决策图。

【问题讨论】:

  • 你想要一个包含 new_node 和 node 的图吗?
  • @user3125280 我想保留原始节点(和连接),但还要添加一些新节点。这两个结构首先应该代表同一个图。
  • 啊,我现在明白了——你想基本上复制一个图形结构。您所描述的确实是一种非常缓慢的方式。我建议你谷歌复制一个图形数据结构或类似的。基本上要复制一个节点,创建一个 n_new,然后用旧节点的 n1 和 n2 的副本填充其 n1 和 n2。您将需要一种机制来确定您已经复制了哪个节点(可能您需要一个 bst 或哈希,除非您可以更改节点的源)。

标签: c algorithm data-structures struct


【解决方案1】:

您必须递归复制,每次遇到新节点时都会创建一个新的 new_node(请仔细阅读)。这将是原始图的完整副本,结构相同但使用不同的内存。

为了确定我们是否已经复制了一个节点,我们在将 node* 映射到 new_node* 的 BST 中保留了我们已复制的节点(及其副本)的列表。

您可以在那里找到许多 BST 实现。 stl c++ 库中有一个,例如,我认为是 glibc,等等。

代码将如下所示:

struct node {
   node *n1;
   node *n2;
}

struct new_node {
   node *n1;
   node *n2;
   newNode *n3; // new member
   int      a;  // new member
}

new_node* GraphCopy (node* start)
{
    new_node* n_new;

    if(!start) return NULL;

    n_new = malloc(sizeof(new_node));

    //Add start.n1 and start.n2 to a bst here
    //with keys of node* and vals of new_node*

    TreeInsert(start, n_new)

    if(IsInTree(start->n1))
        n_new->n1 = TreeFind(start->n1);
    else
        n_new->n1 = GraphCopy(start->n1);

    //repeat for n2

 }

如果没有树,复杂性将是线性的,所以它仍然很快。 (例如,使用哈希表会更线性。)

(树会将 node* 映射到它们的副本。)

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2014-08-22
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2023-03-30
    相关资源
    最近更新 更多