Получите элемент с самым высоким возникновением в массиве

Что Закон Деметры , рассматриваемый в контексте агрегации и композиции, является анти-паттерном.

70
задан Peter Mortensen 26 October 2011 в 04:51
поделиться

5 ответов

Это просто режим. Вот быстрое неоптимизированное решение . Это должно быть O (n).

function mode(array)
{
    if(array.length == 0)
        return null;
    var modeMap = {};
    var maxEl = array[0], maxCount = 1;
    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];
        if(modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;  
        if(modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;
}
75
ответ дан 24 November 2019 в 13:16
поделиться
a=['pear', 'apple', 'orange', 'apple'];
b={};
max='', maxi=0;
for(let k of a) {
  if(b[k]) b[k]++; else b[k]=1;
  if(maxi < b[k]) { max=k; maxi=b[k] }
}
12
ответ дан 24 November 2019 в 13:16
поделиться

В соответствии с просьбой Джорджа Джемпти , чтобы алгоритм учитывал связи, я предлагаю модифицированную версию алгоритма Мэтью Флашена .

function modeString(array)
{
    if (array.length == 0)
        return null;

    var modeMap = {},
        maxEl = array[0],
        maxCount = 1;

    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];

        if (modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;

        if (modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
        else if (modeMap[el] == maxCount)
        {
            maxEl += '&' + el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;
}

Теперь будет возвращена строка с элементами режима, разделенными символом '&' . Когда результат получен, его можно разделить на этот элемент '&' , и у вас будет свой режим (ы).

Другой вариант - вернуть массив элементов режима, например:

function modeArray(array)
{
    if (array.length == 0)
        return null;
    var modeMap = {},
        maxCount = 1, 
        modes = [];

    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];

        if (modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;

        if (modeMap[el] > maxCount)
        {
            modes = [el];
            maxCount = modeMap[el];
        }
        else if (modeMap[el] == maxCount)
        {
            modes.push(el);
            maxCount = modeMap[el];
        }
    }
    return modes;
}

В приведенном выше примере вы сможете обрабатывать результат функции как массив режимов.

32
ответ дан 24 November 2019 в 13:16
поделиться
var mode = 0;
var c = 0;
var num = new Array();
var value = 0;
var greatest = 0;
var ct = 0;

Примечание: ct - это длина массива.

function getMode()
{
    for (var i = 0; i < ct; i++)
    {
        value = num[i];
        if (i != ct)
        {
            while (value == num[i + 1])
            {
                c = c + 1;
                i = i + 1;
            }
        }
        if (c > greatest)
        {
            greatest = c;
            mode = value;
        }
        c = 0;
    }
}
1
ответ дан 24 November 2019 в 13:16
поделиться

Думаю, у вас есть два подхода. У обоих есть преимущества.

Отсортируйте, затем Подсчитайте или Прокрутите и используйте хеш-таблицу для подсчета за вас.

Хеш-таблица хороша тем, что после завершения обработки у вас также есть все отдельные элементы. Однако, если бы у вас были миллионы элементов, хеш-таблица могла бы использовать много памяти, если скорость дублирования низкая. Подход «сортировка, затем подсчет» будет иметь гораздо более контролируемый объем памяти.

0
ответ дан 24 November 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: