Example #1
0
        void swap(int index1, int index2)
        {
            ReaderAndNum temp = data[index1];

            data[index1] = data[index2];
            data[index2] = temp;
        }
Example #2
0
        public static void Merge(ref List <StreamReader> readers, ref StreamWriter writer, int nodeRamSizeMb)
        {
            int  sizeMb   = FindWriteSize(readers.Count, nodeRamSizeMb);
            int  countNos = Helper.CountNosFitInSizeMb(sizeMb);
            Heap heap     = new Heap(readers.Count * countNos);

            foreach (var reader in readers)
            {
                for (int i = 0; i < countNos; i++)
                {
                    AddCurrentToHeap(reader, heap);
                }
            }

            while (!heap.IsEmpty())
            {
                ReaderAndNum min       = null;
                int          minsCount = 0;
                string       mins      = "";
                while (heap.GetMin(out min) && minsCount < countNos)
                {
                    minsCount++;
                    mins += min.num + "\n";
                    AddCurrentToHeap(min.reader, heap);
                }

                writer.Write(mins);
            }
        }
        /// <summary>
        /// Most basic way to merge sorted files. Pick min from each file and take min from them.
        /// Output the min to output file and pick the next min from the stream that current min got picked.
        /// Complexity for n files of k size each: 0(n * n * k)
        /// </summary>
        /// <param name="readers"></param>
        /// <param name="writer"></param>
        public static void Merge(ref List <StreamReader> readers, ref StreamWriter writer)
        {
            List <ReaderAndNum> currentMins = new List <ReaderAndNum>();

            // Create list of initial mins from each stream.
            foreach (var reader in readers)
            {
                AddCurrentToArray(reader, currentMins);
            }

            //write min of all mins to file and get next min from that stream
            while (true)
            {
                ReaderAndNum min = currentMins.First();
                foreach (var pair in currentMins)
                {
                    if (pair.num < min.num)
                    {
                        min = pair;
                    }
                }

                writer.WriteLine(min.num);
                currentMins.Remove(min);

                AddCurrentToArray(min.reader, currentMins);

                if (!currentMins.Any())
                {
                    break;
                }
            }
        }
Example #4
0
 public bool Add(ReaderAndNum no)
 {
     if (currentIndex == Size)
     {
         return(false);
     }
     data[currentIndex] = no;
     HeapifyBottomUp(currentIndex);
     currentIndex++;
     return(true);
 }
Example #5
0
        public bool GetMin(out ReaderAndNum min)
        {
            min = null;
            if (currentIndex == 0)
            {
                return(false);
            }

            min = data[0];
            HeapifyRoot();

            currentIndex--;
            return(true);
        }
Example #6
0
        public static void Merge(ref List <StreamReader> readers, ref StreamWriter writer)
        {
            Heap heap = new Heap(readers.Count);

            foreach (var reader in readers)
            {
                AddCurrentToHeap(reader, heap);
            }

            while (!heap.IsEmpty())
            {
                ReaderAndNum min = null;
                if (heap.GetMin(out min))
                {
                    writer.WriteLine(min.num);
                    AddCurrentToHeap(min.reader, heap);
                }
            }
        }