Skip to main content
Module

x/statistics/src/mode_sorted.ts

Deno basic statistics module.
Latest
File
/** * The [mode](http://bit.ly/W5K4Yt) is the number that appears in a list the highest number of times. * There can be multiple modes in a list: in the event of a tie, this * algorithm will return the most recently seen mode. * * This is a [measure of central tendency](https://en.wikipedia.org/wiki/Central_tendency): * a method of finding a typical or central value of a set of numbers. * * This runs in `O(n)` because the input is sorted. * * @param {number[]} sorted a sample of one or more data points * @returns {number} mode * @throws {Error} if sorted is empty * @example * modeSorted([0, 0, 1]); // => 0 */export function modeSorted(sorted: number[]): number { // Handle edge cases: // The mode of an empty list is undefined if (sorted.length === 0) { throw new Error("mode requires at least one data point"); } else if (sorted.length === 1) { return sorted[0]; }
// This assumes it is dealing with an array of size > 1, since size // 0 and 1 are handled immediately. Hence it starts at index 1 in the // array. let last = sorted[0], // store the mode as we find new modes value = NaN, // store how many times we've seen the mode maxSeen = 0, // how many times the current candidate for the mode // has been seen seenThis = 1;
// end at sorted.length + 1 to fix the case in which the mode is // the highest number that occurs in the sequence. the last iteration // compares sorted[i], which is undefined, to the highest number // in the series for (let i = 1; i < sorted.length + 1; i++) { // we're seeing a new number pass by if (sorted[i] !== last) { // the last number is the new mode since we saw it more // often than the old one if (seenThis > maxSeen) { maxSeen = seenThis; value = last; } seenThis = 1; last = sorted[i]; // if this isn't a new number, it's one more occurrence of // the potential mode } else { seenThis++; } } return value;}