Exemple #1
0
        public async Task Merge(List <string> sortedChunks)
        {
            await Task.Yield();

            var readers = new List <StreamReader>();

            try
            {
                readers.AddRange(sortedChunks.Select(partition => new StreamReader(partition)));
                foreach (var reader in readers)
                {
                    var record = RecordSerializer.Deserialize(reader.ReadLine());
                    _queue.Enqueue(new FileRecord(reader, record));
                }

                while (_queue.Any())
                {
                    var smallest = _queue.Dequeue();
                    await _sortedRecords.SendAsync(smallest.Record);

                    var newRecord = smallest.File.ReadLine();
                    if (newRecord == null)
                    {
                        continue;
                    }

                    var next = RecordSerializer.Deserialize(newRecord);
                    _queue.Enqueue(new FileRecord(smallest.File, next));
                }
            }
            finally
            {
                foreach (var reader in readers)
                {
                    reader.Dispose();
                }

                _sortedRecords.Complete();
            }
        }
Exemple #2
0
        private static long Distance(List <List <int> > adj, List <List <int> > cost, int s, int t)
        {
            var distances     = Enumerable.Range(0, adj.Count).Select(_ => long.MaxValue).ToList();
            var parents       = Enumerable.Range(0, adj.Count).Select(_ => - 1).ToList();
            var priorityQueue = new MinHeap <Tuple <int, long> >(new VertexDistanceComparer());

            var startVertex = s;

            distances[startVertex] = 0;
            priorityQueue.Add(new Tuple <int, long>(startVertex, distances[startVertex]));

            while (priorityQueue.Any())
            {
                var currentTuple          = priorityQueue.ExtractDominating();
                var currentVertex         = currentTuple.Item1;
                var currentVertexDistance = distances[currentVertex];
                var adjVertices           = adj[currentVertex];
                var adjVerticesCosts      = cost[currentVertex];

                for (var i = 0; i < adjVertices.Count; i++)
                {
                    var adjVertex       = adjVertices[i];
                    var adjVertexWeight = adjVerticesCosts[i];
                    var distance        = currentVertexDistance + adjVertexWeight;

                    if (distance < distances[adjVertex])
                    {
                        distances[adjVertex] = distance;
                        parents[adjVertex]   = currentVertex;
                        priorityQueue.Add(new Tuple <int, long>(adjVertex, distance));
                    }
                }
            }

            return(distances[t] < int.MaxValue ? distances[t] : -1);
        }