Это просто режим. Вот быстрое неоптимизированное решение . Это должно быть 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;
}
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] }
}
В соответствии с просьбой Джорджа Джемпти
, чтобы алгоритм учитывал связи, я предлагаю модифицированную версию алгоритма Мэтью Флашена
.
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;
}
В приведенном выше примере вы сможете обрабатывать результат функции как массив режимов.
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;
}
}
Думаю, у вас есть два подхода. У обоих есть преимущества.
Отсортируйте, затем Подсчитайте или Прокрутите и используйте хеш-таблицу для подсчета за вас.
Хеш-таблица хороша тем, что после завершения обработки у вас также есть все отдельные элементы. Однако, если бы у вас были миллионы элементов, хеш-таблица могла бы использовать много памяти, если скорость дублирования низкая. Подход «сортировка, затем подсчет» будет иметь гораздо более контролируемый объем памяти.