From 0038cb537a0e916ce8d3ca88e707f4a05e1b191f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Tue, 11 Sep 2018 09:56:06 +0200 Subject: [PATCH] [statistics] For median and quartiles, compare absolute frequencies Instead of relative frequencies --- apps/statistics/store.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/statistics/store.cpp b/apps/statistics/store.cpp index 086d6af08..7224eca88 100644 --- a/apps/statistics/store.cpp +++ b/apps/statistics/store.cpp @@ -245,16 +245,18 @@ double Store::sortedElementAtCumulatedFrequency(int series, double k, bool creat // TODO: use an other algorithm (ex quickselect) to avoid quadratic complexity assert(k >= 0.0 && k <= 1.0); double totalNumberOfElements = sumOfOccurrences(series); + double numberOfElementsAtFrequencyK = totalNumberOfElements * k; + double bufferValues[numberOfPairsOfSeries(series)]; memcpy(bufferValues, m_data[series][0], numberOfPairsOfSeries(series)*sizeof(double)); int sortedElementIndex = 0; - double cumulatedFrequency = 0.0; - while (cumulatedFrequency < k-DBL_EPSILON) { + double cumulatedNumberOfElements = 0.0; + while (cumulatedNumberOfElements < numberOfElementsAtFrequencyK-DBL_EPSILON) { sortedElementIndex = minIndex(bufferValues, numberOfPairsOfSeries(series)); bufferValues[sortedElementIndex] = DBL_MAX; - cumulatedFrequency += m_data[series][1][sortedElementIndex] / totalNumberOfElements; + cumulatedNumberOfElements += m_data[series][1][sortedElementIndex]; } - if (createMiddleElement && std::fabs(cumulatedFrequency - k) < DBL_EPSILON) { + if (createMiddleElement && std::fabs(cumulatedNumberOfElements - numberOfElementsAtFrequencyK) < DBL_EPSILON) { int nextElementIndex = minIndex(bufferValues, numberOfPairsOfSeries(series)); if (bufferValues[nextElementIndex] != DBL_MAX) { return (m_data[series][0][sortedElementIndex] + m_data[series][0][nextElementIndex]) / 2.0;