繰り返し値を持つ配列があります:
[0, 1, 6, 0, 1, 0]
特定の値が繰り返される最大量を返す効率的な方法は何ですか?
例の配列では、スクリプトが 3 を返すようにします。これは、数値 0 が最も頻繁に繰り返され、3 回繰り返されるためです。私はすでに jQuery と Underscore を使用しています。
繰り返し値を持つ配列があります:
[0, 1, 6, 0, 1, 0]
特定の値が繰り返される最大量を返す効率的な方法は何ですか?
例の配列では、スクリプトが 3 を返すようにします。これは、数値 0 が最も頻繁に繰り返され、3 回繰り返されるためです。私はすでに jQuery と Underscore を使用しています。
これは基本的なアプローチに似ていますが、アンダースコアreduce
とmax
関数を利用します。本当に非常に大きな配列がある場合は、縮小する前にこれをマップフェーズと並列化する方法が明確になっていることを願っています。
var arr = [1,0,2,3,4,0,3,0];
var counts = _.reduce(arr, function(counts, val) {
if (counts[val]) {
counts[val]++;
} else {
counts[val] = 1;
}
return counts;
}, {});
return _.max(counts);
ハックな方法は、それを並べ替え、値が変化するたびに分割し、各文字列の長さを調べることかもしれませんが、もっと合理的な方法を試してみましょう:
var nums = [0, 1, 6, 0, 1, 0]
var occurence = {}
$.each(nums, function(a, num_id) {
if (occurence[num_id] != null) {
occurence[num_id]++;
} else {
occurence[num_id] = 1;
}
});
次に、occurrence はすべての値の出現回数を nums で持ち、その数値自体がキーになります。
ええ、これはグーグルのインタビューの質問のようなものです笑。配列を 1 回ループし、カウンターをインクリメントしている間に各要素の連想配列を維持することをお勧めします。
例えば:
var a = [0, 0 , 2, 2, 3, 3, 3, 3];
var counts = {};
for(var i = 0, il = a.length; i < il; i++){
var num = a[i];
if(typeof counts[num] === 'undefined'){
counts[num] = 0;
}
counts[num]++;
}
var max = -1;
for(var c in counts){
if(counts[c] > max){
max = counts[c];
}
}
console.log(max);