void UpdateCounts(pairID col, int location) { for (var i = 0; i < _counts.Count; i++) { for (var j = 0; j < _counts[i].Count; j++) { if ((i == col.AID) && (j == col.VID)) { //Khi remove thì count=-1 _counts[i][j] = -1; continue; } if (_pairs[location].data[i][j]) { _counts[i][j]--; } } } }
//Chọn ra thuộc tính còn nhiều nhát cắt nhất private pairID Select(pairID a,pairID b) { var counta = _counts[(int)a.AID].Count; var countb = _counts[(int)b.AID].Count; foreach (var c in _counts[(int)a.AID]) { if (c <= -1) counta--; } foreach (var c in _counts[(int)b.AID]) { if (c <= -1) countb--; } //<: chọn thuộc tính có nhiều nhát cắt nhất //>: chọn thuộc tính có ít nhát cắt nhất if (counta < countb) return b; return a; }
//Xóa các pair phân biệt được bởi các thuộc tính rời rạc void RemoveDiscretedItems() { for (int x = 0; x < ConditionList.Count; x++) { for (var j = 0; j < ConditionList[x].MappedTable.Count; j++) { if (ConditionList[x].IsDiscreted) { var col = new pairID(x, j); for (var i = 0; i < _pairs.Count; i++) { if (_pairs[i].data[(int)col.AID][(int)col.VID]) { UpdateCounts(col, i); _pairs.RemoveAt(i); i--; } } } } } }
void run() { _solution=new List<pairID>(); while (_pairs.Count != 0) { // Console.WriteLine("Pair: "+_pairs.Count); int AID=0, VID=0; FindColumn(ref AID, ref VID); var col = new pairID(AID, VID); for (var i = 0; i < _pairs.Count; i++) { if (_pairs[i].data[(int)col.AID][(int)col.VID]) { UpdateCounts(col, i); _pairs.RemoveAt(i); i--; } } _solution.Add(col); } }
public bool IsEqual(pairID p) { return (p.AID == AID) && (p.VID == VID); }