public int CompareTo(ValueIndexPair other) { if (Val < other.Val) return -1; if (Val > other.Val) return 1; return 0; }
public BinaryHeap(int defCap) { _defaultCapacity = defCap; _theArray = new ValueIndexPair[_defaultCapacity + 1]; // _theArray[0] serves as dummy Parent for root (who is at 1) // "largest" is guaranteed to be larger than all keys in_ heap _theArray[0] = new ValueIndexPair(double.PositiveInfinity, -1, -1); _currentSize = 0; }
public void Add(ValueIndexPair e) { // bubble up: int where = _currentSize + 1; // new last place while (e.CompareTo(_theArray[Parent(where)]) > 0) { _theArray[where] = _theArray[Parent(where)]; where = Parent(where); } _theArray[where] = e; _currentSize++; }
// returns pairs of indeces and -1,-1 if < K pairs public int[,] GetKBestPairs(ParseForestItem[] items1, ParseForestItem[] items2) { // in_ this case K = items1.Length var beenPushed = new bool[K,K]; var result = new int[K,2]; for (int i = 0; i < K; i++) { result[i, 0] = -1; result[i, 1] = -1; } if (items1 == null || items2 == null || items1[0] == null || items2[0] == null) return result; var heap = new BinaryHeap(K + 1); int n = 0; var vip = new ValueIndexPair(items1[0].Prob + items2[0].Prob, 0, 0); heap.Add(vip); beenPushed[0, 0] = true; while (n < K) { vip = heap.RemoveMax(); if (vip.Val == double.NegativeInfinity) break; result[n, 0] = vip.I1; result[n, 1] = vip.I2; n++; if (n >= K) break; if (!beenPushed[vip.I1 + 1, vip.I2]) { heap.Add(new ValueIndexPair(items1[vip.I1 + 1].Prob + items2[vip.I2].Prob, vip.I1 + 1, vip.I2)); beenPushed[vip.I1 + 1, vip.I2] = true; } if (!beenPushed[vip.I1, vip.I2 + 1]) { heap.Add(new ValueIndexPair(items1[vip.I1].Prob + items2[vip.I2 + 1].Prob, vip.I1, vip.I2 + 1)); beenPushed[vip.I1, vip.I2 + 1] = true; } } return result; }