Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }