- Timestamp:
- 03/19/17 18:47:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/TSNE/HeuristicLab.Algorithms.DataAnalysis/3.4/TSNE/PriorityQueue.cs
r14414 r14767 29 29 // implementation based on C++ version from Peter Sanders 30 30 // http://www.mpi-inf.mpg.de/~sanders/programs/spq/ 31 public sealed class PriorityQueue<TK, TV> : IHeap<TK, TV>where TK : IComparable {31 public sealed class PriorityQueue<TK, TV> where TK : IComparable { 32 32 private class KNElement { 33 33 public TK Key { get; set; } … … 35 35 } 36 36 37 private int capacity;37 private readonly int capacity; 38 38 private int size; // index of last used element 39 39 private int finalLayerSize; // size of first layer with free space 40 40 private int finalLayerDist; // distance to end of layer 41 41 //private KNElement[] rawData; 42 private KNElement[] data; // alligned version of rawData42 private readonly KNElement[] data; // aligned version of rawData 43 43 44 44 public PriorityQueue(TK supremum, TK infimum, int cap) { … … 53 53 } 54 54 55 public int Size 56 { 55 public int Size { 57 56 get { return size; } 58 57 } 59 58 60 public TK Supremum 61 { 59 public TK Supremum { 62 60 get { return data[capacity + 1].Key; } 63 61 } 64 62 65 63 public KeyValuePair<TK, TV> PeekMin() { 66 if 64 if(size == 0) { 67 65 throw new InvalidOperationException("Heap is empty"); 68 66 } … … 87 85 size = sz - 1; 88 86 finalLayerDist++; 89 if 87 if(finalLayerDist == finalLayerSize) { 90 88 finalLayerSize >>= 2; 91 89 finalLayerDist = 0; 92 90 } 93 91 94 while 92 while(succ < sz) { 95 93 var minKey = data[succ].Key; 96 94 var delta = 0; 97 95 98 96 var otherKey = data[succ + 1].Key; 99 if 97 if(otherKey.CompareTo(minKey) < 0) { 100 98 minKey = otherKey; 101 99 delta = 1; 102 100 } 103 101 otherKey = data[succ + 2].Key; 104 if 102 if(otherKey.CompareTo(minKey) < 0) { 105 103 minKey = otherKey; 106 104 delta = 2; 107 105 } 108 106 otherKey = data[succ + 3].Key; 109 if 107 if(otherKey.CompareTo(minKey) < 0) { 110 108 minKey = otherKey; 111 109 delta = 3; … … 137 135 pred = pred - layerDist; // finally preds index 138 136 139 while 137 while(data[pred].Key.CompareTo(bubble) > 0) { // must terminate since inf at root 140 138 data[hole].Key = data[pred].Key; 141 139 data[hole].Value = data[pred].Value; … … 159 157 finalLayerDist--; 160 158 161 if 162 159 if(finalLayerDist == -1) { // layer full 160 // start next layer 163 161 finalLayerSize <<= 2; 164 162 finalLayerDist = finalLayerSize - 1; … … 173 171 pred = pred - layerDist; // finally preds index 174 172 var predKey = data[pred].Key; 175 while 173 while(predKey.CompareTo(key) > 0) { 176 174 data[hole].Key = predKey; 177 175 data[hole].Value = data[pred].Value; … … 196 194 var sup = Supremum; 197 195 var cap = capacity; 198 for 196 for(var i = 1; i <= cap; i++) { 199 197 data[i].Key = sup; 200 198 }
Note: See TracChangeset
for help on using the changeset viewer.