Advertisement
mafupb

Priority Queue Comparison

Mar 28th, 2013
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.41 KB | None | 0 0
  1.  
  2.     public class PriorityQueue<TK, TV>
  3.     {
  4.         private readonly SortedDictionary<TK, Queue<TV>> _D = new SortedDictionary<TK, Queue<TV>> ();
  5.  
  6.         public void Enqueue (TK key, TV value)
  7.         {
  8.             Queue<TV> list;
  9.             if (!_D.TryGetValue (key, out list)) {
  10.                 list = new Queue<TV> ();
  11.                 _D.Add (key, list);
  12.             }
  13.             list.Enqueue (value);
  14.             Count++;
  15.         }
  16.  
  17.         public int Count
  18.         {
  19.             get;
  20.             private set;
  21.         }
  22.  
  23.         public TV Dequeue ()
  24.         {
  25.             var first = _D.First ();
  26.             var item = first.Value.Dequeue ();
  27.             if (!first.Value.Any ()) {
  28.                 _D.Remove (first.Key);
  29.             }
  30.             return item;
  31.         }
  32.  
  33.         public IEnumerable<TV> Values
  34.         {
  35.             get
  36.             {
  37.                 var keys = _D.Keys.ToArray ();
  38.                 foreach (var key in keys) {
  39.                     var items = _D[key];
  40.                     foreach (var item in items) {
  41.                         yield return item;
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.     }
  47.  
  48.  
  49.  
  50.  
  51.     public class PriorityQueueD<TK, TV>
  52.     {
  53.         private readonly Dictionary<TK, Queue<TV>> _D = new Dictionary<TK, Queue<TV>> ();
  54.  
  55.         public void Enqueue (TK key, TV value)
  56.         {
  57.             Queue<TV> list;
  58.             if (!_D.TryGetValue (key, out list)) {
  59.                 list = new Queue<TV> ();
  60.                 _D.Add (key, list);
  61.             }
  62.             list.Enqueue (value);
  63.             Count++;
  64.         }
  65.  
  66.         public int Count
  67.         {
  68.             get;
  69.             private set;
  70.         }
  71.  
  72.         private bool HasMin = false;
  73.         private TK Min = default (TK);
  74.  
  75.         public TV Dequeue ()
  76.         {
  77.             if (!HasMin) {
  78.                 Min = _D.Keys.Min ();
  79.                 HasMin = true;
  80.             }
  81.             var items = _D[Min];
  82.             var item = items.Dequeue ();
  83.             if (!items.Any ()) {
  84.                 _D.Remove (Min);
  85.                 HasMin = false;
  86.             }
  87.             return item;
  88.         }
  89.  
  90.         public IEnumerable<TV> Values
  91.         {
  92.             get
  93.             {
  94.                 var keys = _D.Keys.ToArray ();
  95.                 Array.Sort (keys);
  96.                 foreach (var key in keys) {
  97.                     var items = _D[key];
  98.                     foreach (var item in items) {
  99.                         yield return item;
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.     }
  105.  
  106.  
  107.  
  108.  
  109.  
  110.     internal class PriorityQueueTest
  111.     {
  112.         private class Point
  113.         {
  114.             public readonly int ImplId;
  115.             public readonly int Items;
  116.             public readonly int Buckets;
  117.             public readonly double? TimeAdd;
  118.             public readonly double? TimeDeq;
  119.             public readonly double? TimeEnu;
  120.  
  121.             public Point (int implId, int items, int buckets)
  122.             {
  123.                 ImplId = implId;
  124.                 Items = items;
  125.                 Buckets = buckets;
  126.  
  127.                 Stopwatch sw;
  128.  
  129.                 if (implId == 0) {
  130.                     try {
  131.                         var dic = new OrderedMultiDictionary<int, int> (true);
  132.  
  133.                         sw = Stopwatch.StartNew ();
  134.                         for (int i = 0; i < Items; i++) {
  135.                             dic.Add (i * i % Buckets, i);
  136.                         }
  137.                         sw.Stop ();
  138.                         TimeAdd = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  139.  
  140.                         sw = Stopwatch.StartNew ();
  141.                         foreach (var v in dic.Values) {
  142.                             var dummy = v;
  143.                         }
  144.                         sw.Stop ();
  145.                         TimeEnu = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  146.  
  147.                         // TODO: TimeDeq
  148.  
  149.                         TimeDeq = null;
  150.                     }
  151.                     catch (OutOfMemoryException) {
  152.                         TimeAdd = TimeDeq = TimeEnu = null;
  153.                     }
  154.                 }
  155.                 else if (implId == 1) {
  156.                     try {
  157.                         var pq = new PriorityQueue<int, int> ();
  158.  
  159.                         sw = Stopwatch.StartNew ();
  160.                         for (int i = 0; i < Items; i++) {
  161.                             pq.Enqueue (i * i % Buckets, i);
  162.                         }
  163.                         sw.Stop ();
  164.                         TimeAdd = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  165.  
  166.                         sw = Stopwatch.StartNew ();
  167.                         foreach (var v in pq.Values) {
  168.                             var dummy = v;
  169.                         }
  170.                         sw.Stop ();
  171.                         TimeEnu = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  172.  
  173.                         sw = Stopwatch.StartNew ();
  174.                         for (int i = 0; i < Items; i++) {
  175.                             int dummy = pq.Dequeue ();
  176.                         }
  177.                         sw.Stop ();
  178.                         TimeDeq = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  179.                     }
  180.                     catch (OutOfMemoryException) {
  181.                         TimeAdd = TimeDeq = TimeEnu = null;
  182.                     }
  183.                 }
  184.                 else {
  185.                     try {
  186.                         var pq = new PriorityQueueD<int, int> ();
  187.  
  188.                         sw = Stopwatch.StartNew ();
  189.                         for (int i = 0; i < Items; i++) {
  190.                             pq.Enqueue (i * i % Buckets, i);
  191.                         }
  192.                         sw.Stop ();
  193.                         TimeAdd = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  194.  
  195.                         sw = Stopwatch.StartNew ();
  196.                         foreach (var v in pq.Values) {
  197.                             var dummy = v;
  198.                         }
  199.                         sw.Stop ();
  200.                         TimeEnu = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  201.  
  202.                         if (Items > 1000 * 1000) {
  203.                             TimeDeq = null;
  204.                         }
  205.                         else {
  206.                             sw = Stopwatch.StartNew ();
  207.                             for (int i = 0; i < Items; i++) {
  208.                                 int dummy = pq.Dequeue ();
  209.                             }
  210.                             sw.Stop ();
  211.                             TimeDeq = Math.Log (sw.Elapsed.TotalMilliseconds, 2);
  212.                         }
  213.                     }
  214.                     catch (OutOfMemoryException) {
  215.                         TimeAdd = TimeDeq = TimeEnu = null;
  216.                     }
  217.                 }
  218.             }
  219.  
  220.             public override string ToString ()
  221.             {
  222.                 var s = "";
  223.                 if (TimeAdd == null) {
  224.                     s += " n/a";
  225.                 }
  226.                 else {
  227.                     s += TimeAdd.Value.ToString ("0.0").PadLeft (4);
  228.                 }
  229.                 s += " / ";
  230.                 if (TimeEnu == null) {
  231.                     s += " n/a";
  232.                 }
  233.                 else {
  234.                     s += TimeEnu.Value.ToString ("0.0").PadLeft (4);
  235.                 }
  236.                 s += " / ";
  237.                 if (TimeDeq == null) {
  238.                     s += " n/a";
  239.                 }
  240.                 else {
  241.                     s += TimeDeq.Value.ToString ("0.0").PadLeft (4);
  242.                 }
  243.                 return s;
  244.             }
  245.         }
  246.  
  247.         private static List<Point> pts = new List<Point> ();
  248.  
  249.         public static void Test ()
  250.         {
  251.             for (int i = 1; i <= 1000 * 1000 * 100; i *= 2) {
  252.                 for (int buckets = 0; buckets <= 4; buckets++) {
  253.                     for (int id = 0; id <= 2; id++) {
  254.                         pts.Add (new Point (id, i, (int) Math.Pow (32, buckets)));
  255.                         Draw ();
  256.                     }
  257.                 }
  258.             }
  259.         }
  260.  
  261.         private static void Draw ()
  262.         {
  263.             GC.Collect (2);
  264.             Console.Clear ();
  265.  
  266.             var xs = pts.Select (p => p.Buckets).Distinct ();
  267.             var ys = pts.Select (p => p.Items).Distinct ();
  268.  
  269.             Console.Write ("".PadLeft (10));
  270.             Console.Write ("| ");
  271.             foreach (var x in xs) {
  272.                 Console.Write (x.ToString ().PadLeft (11));
  273.                 Console.Write ("        | ");
  274.             }
  275.             Console.WriteLine ();
  276.             Console.WriteLine ();
  277.  
  278.             foreach (var y in ys.Where (v => v > 100)) {
  279.                 Console.Write (y.ToString ().PadLeft (10));
  280.                 Console.WriteLine ();
  281.  
  282.                 for (int id = 0; id <= 2; id++) {
  283.                     Console.Write ("".PadLeft (10));
  284.                     Console.Write ("| ");
  285.  
  286.                     foreach (var x in xs) {
  287.                         var select = pts
  288.                             .Where (p => p.ImplId == id)
  289.                             .Where (p => p.Buckets == x && p.Items == y)
  290.                             .FirstOrDefault ();
  291.                         if (select == null) {
  292.                             Console.Write ("  ?  /   ?  /   ? ");
  293.                         }
  294.                         else {
  295.                             Console.Write (select);
  296.                         }
  297.                         Console.Write (" | ");
  298.                     }
  299.                     Console.WriteLine ();
  300.                 }
  301.  
  302.                 Console.WriteLine ();
  303.                 Console.WriteLine ();
  304.             }
  305.         }
  306.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement