There is an easy way to solve the parallelization problem, separate data. Read the original data structure and write to a new one. This way you can run it in parallel without even blocking it.
, , , . , ( 0..result.Count-1). List<int> . List.Contains . HashSet . , , BitArray. , Dictionary<int, List<int>> BitArray[].
. , . BitArray[] List<int>[] , .
int sizeOfGraph = 1000;
BitArray[] inputGraph = new BitArray[sizeOfGraph];
for (int i = 0; i < inputGraph.Length; ++i)
{
inputGraph[i] = new BitArray(i);
}
Random rand = new Random(10);
for (int i = 1; i < inputGraph.Length; ++i)
{
BitArray vertex_i = inputGraph[i];
for(int j = 0; j < vertex_i.Count; ++j)
{
if(rand.Next(0, 100) < 50)
{
vertex_i[j] = true;
}
}
}
for (int i = 0; i < sizeOfGraph; ++i)
{
BitArray vertex_i = inputGraph[i];
for (int j = 0; j < i; ++j)
{
if (vertex_i[j]) { continue; }
for (int r = j + 1; r < i; ++r)
{
if (vertex_i[r] && inputGraph[r][j])
{
vertex_i[j] = true;
break;
}
}
}
}
List<int>[] reducedGraph = new List<int>[sizeOfGraph];
Parallel.ForEach(inputGraph, (vertex_i, state, ii) =>
{
{
int i = (int)ii;
List<int> reducedVertex = reducedGraph[i] = new List<int>();
for (int j = i - 1; j >= 0; --j)
{
if (vertex_i[j])
{
bool ok = true;
for (int x = 0; x < reducedVertex.Count; ++x)
{
if (inputGraph[reducedVertex[x]][j])
{
ok = false;
break;
}
}
if (ok)
{
reducedVertex.Add(j);
}
}
}
}
});
MessageBox.Show("Finished, reduced graph has "
+ reducedGraph.Sum(s => s.Count()) + " edges.");
:
. , i , , , . . ,
1->0
2->1, 2->0
3->2, 3->1, 3->0
2 1,
1->0
2->1
3->2, 3->1, 3->0
3 2
1->0
2->1
3->2, 3->0
, 3->0, - 2->0. , . ,
3 1
1->0
2->1
3->2, 3->1
2
1->0
2->1
3->2
. .