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 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); }