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(); } }
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); }