2012-03-03 15 views
0

次の奥行き検索の再帰的実装があります。最後に、配列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; 
+1

なぜ、私たちから最も重要なコード、すなわち 'Graph'と' Edge'の定義が隠れているのですか?これは推測ゲームですか?その答えはおそらく「あなたはあなたのデータ構造を間違って使用していますが、正確にあなたが*投稿していない情報です。 –

+0

「n」と「m」は何を表していますか? – Zoozy

+0

sry、私はそれを更新しました。 n =ノード、m =エッジ – ItsameMario

答えて

2

の定義を見ることなく伝えるのは難しいであることを期待したいですあなたはスタックを使い果たしています。グラフが疎でなければ、再帰は非常に深くなり、小さな値で動作する理由も説明されます。

1

これは、あなたが、リンクされたリストになりそうだものに、配列のインデックスを使用している奇数

t = G->adj[w] 

として私を打ちます。

私はワンセグ障害にもちろん1

以外の任意の値のために、それが原因あなたが再帰になる可能性があるG.

+0

グラフの定義を追加しましたか、それとも何を意味していますか?私はファイルからGを読んでも問題はありません。 t = G-> adj [w]はノードとエッジの数が少ない場合に効果的です。 – ItsameMario

+0

エラー...本当ですか?あなたがG-> adjのためのスペースを割り当てるとき、どうしますか? – Hogan

関連する問題