2013-11-06 3 views
-3

У меня есть мульти двумерный массив, который выглядит следующим образом:Найти наиболее часто встречающееся значение в массиве

[ 
    [ 30, 40 ] 
    [ 40, 40 ] 
    [ 100, 100 ] 
    [ 100, 100 ] 
    [ 100, 100 ] 
    [ 200, 100 ] 
    [ 200, 200 ] 

] 

Как я могу получить пару значений, что является наиболее распространенным из него - [100, 100]?

+3

Что вы пробовали? – Vallentin

+0

Покажите нам свой код. Что вы пробовали? Вы ожидаете, что мы будем выполнять всю работу? – h2ooooooo

+0

нет .. только некоторые идеи. Я думал присоединиться к значениям массива в строке и поместить это как ключ в другой массив. затем увеличивайте счетчик на этом массиве каждый раз, когда я нахожу дубликат ключа. но это звучит сложно, должно быть несколько проще. – Elfy

ответ

2

Это было весело, я бы прошел через пары и хэш их с item.join("-"), а затем попытался проверить каждый элемент в парах вручную. Это также будет работать с парами длины арбитража. Затем просто сохраните объект в объекте как ключ, со значением, являющимся частотой появления. то вы можете просто грейферы максимальное и разделить хэш обратно item.split("-"), чтобы получить пару

http://jsfiddle.net/Y9cex/

UPDATE

здесь немного более оптимизированная версия с одной петлей. Он не будет обрабатывать случай, когда есть две разные пары одной и той же частоты, но либо последняя, ​​либо последняя. Он просто возвращает первый ответ

http://jsfiddle.net/Y9cex/8/

+0

это именно то, что я хотел сделать: si подумал, что есть более простой способ сделать это, например, какую-то встроенную функцию или что-то подобное bc выглядит слишком дорого :( – Elfy

+0

Я добавил менее дорогую версию с одним циклом, но да нет встроенный способ. Однако я не думаю, что любой из них очень эффективен, если массив не очень большой –

1

Это создает массив пар и соответствующее количество вхождений. Затем он находит пару с большинством вхождений. Вот fiddle.

var data = [ 
    [ 30, 40 ], 
    [ 40, 40 ], 
    [ 100, 100 ], 
    [ 100, 100 ], 
    [ 100, 100 ], 
    [ 200, 100 ], 
    [ 200, 200 ] 
]; 

var countData = new Array(); 

for (var i = 0; i < data.length; i++) { 
    // see if the pair exists, if not increment count 

    var exists = false 

    for (var j = 0; j < countData.length; j++) { 
     if (countData[j].pair[0] == data[i][0] && countData[j].pair[1] == data[i][1]) { 
      countData[j].count++; 
      exists = true; 
     } 
    } 

    if (!exists) { 
     var tmp = new Object(); 
     tmp.pair = data[i]; 
     tmp.count = 1; 
     countData.push(tmp); 
    } 
} 

var mostFrequentPair = { pair: null, count: 0 }; 

for (var i = 0; i < countData.length; i++) { 
    if (countData[i].count > mostFrequentPair.count) mostFrequentPair = countData[i]; 
} 

console.log('The most frequent pair is [' + mostFrequentPair.pair + '] which occurs ' + mostFrequentPair.count + ' times.'); 

Вы можете добавить еще один цикл, если вы хотите, чтобы найти пары, которые были связаны для максимального числа появлений.

Смежные вопросы