0

巨大な隣接行列 AJM で表される、巨大な加重無向グラフを生成したいと考えています。したがって、i と j のループでは、

AJM[i][j] = AJM[j][i]

AJM[i][i] = 0

重みは、[0.01, 10.00] など、間隔内のランダムな倍精度数として生成されます。10k の頂点がある場合、行列は 10k x 10k の double タイプのエントリになり、これを保存するとメモリ内に巨大なチャンクになります。

ここで、必要な数のエッジにしきい値 E を設定し、しきい値 T より大きい重みを持つすべてのエッジを無視します (T は E によって決定され、E はユーザー定義です)。後で使用するためのベクトル内の T。これを効率的に達成する方法を教えてください。隣接行列全体のいかなる種類の保存も避け、ストリーミング構造を使用するのが最善です。それで、どのようにマトリックスを生成し、しきい値処理を行うべきか疑問に思っていますか?

ファイルの書き込みと読み取りが必要だと思いますよね?

1 つのアプローチは、ファイルを操作した後、しきい値 E を設定し、次のことを行うことです。

マトリックスから要素を 1 つずつ読み取り、マトリックス全体を読み取らないようにし (これを実現するための C++ コードの行をいくつか示してもらえますか?)、その重みを最小ヒープに挿入し、対応するエッジ インデックスを格納します。ベクトルで。ヒープのサイズが E に達したときに停止し、エッジ インデックスのベクトルが必要なものになります。

それを行う正しい方法だと思いますか?他の提案はありますか?Pls は、ここにある可能性のあるエラーを指摘します。どうもありがとう!

4

1 に答える 1

0

元のしきい値処理されたグラフを保持する必要がない場合、多くの作業を節約する簡単な方法があるように思えます。頂点の数 (V=10,000) が与えられ、エッジの数 (E) はユーザーが設定できます。必要な数のエッジが得られるまで、頂点のペアをランダムに選択します。これが同等ではない明らかな理由を見逃していますか?

于 2013-09-18T11:50:20.833 に答える