【问题标题】:Segmentation fault in depth-first search for big graphs in cc语言中深度优先搜索大图的分割错误
【发布时间】:2012-03-03 11:49:22
【问题描述】:

我有以下深度优先搜索的递归实现。最后,数组 pre 显示访问几个顶点的顺序。我想为非常大的图表运行它。在本例中:n = 2097152,m = 6291408。G 表示为邻接表。

static int cnt, pre[2097152];
static link t;

void dfsRAdjazenz(Graph G, Edge e)
{ 
    int w = e.w 
    pre[w] = cnt++; 

    for (t = G->adj[w]; t != NULL; t = t->next) {
        if (pre[t->v] == -1) {            
            Edge e = {w, t->v};
            dfsRAdjazenz(G, e); 
        }
    }
}

int main (int argc, const char * argv[])
{   
    cnt=0;
    int v;
    for (v = 0; v < 2097152; v++) {
        pre[v] = -1;
    }

    Edge e = {1,1};
    dfsRAdjazenz(G, e);
    return 0;
}

问题是我总是用完内存-> 分段错误,尽管确实有足够的可用内存。它仅适用于大约 100 万个节点。

编辑:数据结构:

typedef struct node *link;  

struct node { 
    int v; 
    link next; 
};

struct graph { 
    int V; 
    int E; 
    link *adj; 
};

typedef struct { 
    int v; 
    int w; 
} Edge;

typedef struct graph *Graph;

【问题讨论】:

  • 你为什么要对我们隐藏最重要的代码,即GraphEdge类型的定义?这是猜谜游戏吗?答案可能是“您使用错误的数据结构”,但这正是您没有发布的信息。
  • nm 代表什么?
  • 抱歉,我更新了它。 n = 节点,m = 边
  • 你确定你的内存用完了 - 是消息还是你只是得到一个分段错误。

标签: c memory segmentation-fault


【解决方案1】:

这可能是由于您正在使用递归,您正在耗尽堆栈。如果图不是稀疏的,那么递归可能会很深,这也解释了为什么它适用于小值。

【讨论】:

    【解决方案2】:

    这让我觉得很奇怪

    t = G->adj[w]
    

    您正在使用数组索引来查找看起来是链表的内容。

    我希望这会为除 1 以外的任何值分段错误。

    当然,不看G的定义就很难说。

    【讨论】:

    • 我添加了graph的定义还是什么意思?我从文件中读取 G 并不会导致问题。 t = G->adj[w] 适用于较少的节点和边。
    • 错误...真的吗?好的..当你为 G->adj 分配空间时,你是怎么做的?
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多