public double CalculatePercentile(SortedMultiSet <double> set) { double result = default; if (set.TotalCount > 0) { double currentFloorRankPlusOne = 0; double floorRank = this.percentile * (set.TotalCount - 1); double dividend = floorRank % 1; floorRank = Math.Floor(floorRank); var enumerator = set.GetEnumerable().GetEnumerator(); for (int index = 0; index <= floorRank; index++) { enumerator.MoveNext(); } var currentFloorRank = enumerator.Current; if (dividend != 0) { enumerator.MoveNext(); currentFloorRankPlusOne = enumerator.Current; } result = currentFloorRank + dividend * (currentFloorRankPlusOne - currentFloorRank); } return(result); }
private List <RankedEvent <T> > GetTopK(SortedMultiSet <T> set) { int count = (int)Math.Min(this.k, set.TotalCount); var result = new List <RankedEvent <T> >(count); int nextRank = 1; int outputRank = 1; bool first = true; T rankValue = default; foreach (var value in set.GetEnumerable()) { if (first || this.compiledRankComparer(rankValue, value) != 0) { if (result.Count >= count) { break; } outputRank = nextRank; rankValue = value; first = false; } // Ranking has gaps on it, this is expected // Rank value follows the same as Sql Rank and not Dense_Rank result.Add(new RankedEvent <T>(outputRank, value)); nextRank++; } return(result); }
public SlidingMinAggregate(IComparerExpression <T> comparer, QueryContainer container) { Contract.Requires(comparer != null); this.comparer = comparer.GetCompareExpr().Compile(); var generator = comparer.CreateSortedDictionaryGenerator <T, long>(container); Expression <Func <Func <SortedDictionary <T, long> >, MinMaxState <T> > > template = (g) => new MinMaxState <T> { savedValues = new SortedMultiSet <T>(g), currentValue = default, currentTimestamp = InvalidSyncTime
private static HuffmanNode BuildHuffmanTree(int[] frequences) { var sortedMultiSet = new SortedMultiSet <HuffmanNode>(GetNodes(frequences)); while (sortedMultiSet.Count() > 1) { var firstMin = sortedMultiSet.PopMinOrDefault(); var secondMin = sortedMultiSet.PopMinOrDefault(); //var a = new HuffmanNode(secondMin, firstMin, firstMin.Frequency + secondMin.Frequency, null); sortedMultiSet.Add(new HuffmanNode(secondMin, firstMin, firstMin.Frequency + secondMin.Frequency, null)); } return(sortedMultiSet.Peek()); }
public double CalculatePercentile(SortedMultiSet <double> set) { double result = default; if (set.TotalCount > 0) { int rank = (int)Math.Ceiling(this.percentile * set.TotalCount) - 1; var enumerator = set.GetEnumerable().GetEnumerator(); for (int index = 0; index <= rank; index++) { enumerator.MoveNext(); } result = enumerator.Current; } return(result); }
public static void BasicTest(SortedMultiSet dict) { PrintTestHeader(dict); dict.Print(); TestOperation(dict.Insert, 5, true); TestOperation(dict.Insert, 8, true); TestOperation(dict.Insert, 2, true); TestOperation(dict.Insert, 9, true); TestOperation(dict.Insert, 0, true); TestOperation(dict.Insert, 5, true); dict.Print(); TestOperation(dict.Search, 5, true); TestOperation(dict.Search, -4, false); TestOperation(dict.Search, 10, false); TestOperation(dict.Search, 4, false); dict.Print(); // TODO check if dict is sorted TestOperation(dict.Delete, 2, true); TestOperation(dict.Delete, 5, true); TestOperation(dict.Delete, 0, true); TestOperation(dict.Delete, 6, false); TestOperation(dict.Delete, 8, true); TestOperation(dict.Delete, 9, true); TestOperation(dict.Delete, 5, true); TestOperation(dict.Delete, 5, false); dict.Print(); Console.WriteLine(); }
public Expression <Func <MinMaxState <T> > > InitialState() { Expression <Func <Func <SortedDictionary <T, long> >, MinMaxState <T> > > template = (g) => new MinMaxState <T> { savedValues = new SortedMultiSet <T>(g), currentValue = default, currentTimestamp = InvalidSyncTime