private SimilarNodeInfo CreateSimilarNodeInfo(SimilarNodeInfo[] colSimilarNodeInfo, int nodeId)
        {
            colSimilarNodeInfo[nodeId] = new SimilarNodeInfo
            {
                NodeId = nodeId,
                SimilarNeighborsCount = 0,
                SimilarNodeId         = -1
            };

            return(colSimilarNodeInfo[nodeId]);
        }
        private bool UpdateSimilarNodeInfo(SimilarNodeInfo similarNodeInfo, int nearNeighborId, int sameNodesCount)
        {
            if (similarNodeInfo.SimilarNeighborsCount < sameNodesCount)
            {
                similarNodeInfo.SimilarNeighborsCount = sameNodesCount;
                similarNodeInfo.SimilarNodeId         = nearNeighborId;

                return(true);
            }

            return(false);
        }
        private IEnumerable <SimilarNodeInfo> GetSimilarNodeInfo(IGraph graph)
        {
            var graphSize          = graph.Size;
            var colSimilarNodeInfo = new SimilarNodeInfo[graphSize];

            var degreeDispersion = 100;

            Parallel.For(0, graphSize, nodeId =>
            {
                var similarNodeInfo = CreateSimilarNodeInfo(colSimilarNodeInfo, nodeId);
                var node            = graph.GetNode(nodeId);

                if (node.Degree <= 2)
                {
                    return;
                }

                foreach (var nearNeighborId in graph.GetNeighbors(nodeId, 2))
                {
                    var nearNode = graph.GetNode(nearNeighborId);

                    if (nodeId == nearNeighborId)
                    {
                        continue;
                    }

                    var isNearNodeDegreeInsideDispersion = nearNode.Degree <= node.Degree ? node.Degree - nearNode.Degree <= degreeDispersion :
                                                           nearNode.Degree - node.Degree <= degreeDispersion;
                    if (!isNearNodeDegreeInsideDispersion) //TODO: Otestovat vhodnou hodnotu 100
                    {
                        continue;
                    }

                    var sameNodesCount = GetNumberOfSameNeighbors(node, nearNode);
                    UpdateSimilarNodeInfo(similarNodeInfo, nearNeighborId, sameNodesCount);

                    if (sameNodesCount == node.Degree)
                    {
                        return;
                    }
                }
            });

            return(colSimilarNodeInfo);
        }