我有几个数组要处理。我需要从每个数组中提取最多的重复值。
从[3, 7, 7, 7]
开始,我需要找到值7
。每个数组大小为4.现在,我不必考虑最重复的值何时多于一个,例如[3, 7, 7, 7]
。所有值都是数字。
我环顾网络。我发现了几种使数组成为uniq()
的方法。但我还没有找到获得重复值的方法。我正在使用jQuery,但原始JavaScript可以完成这项任务。
答案 0 :(得分:7)
在效率方面并不完美,但是做到了:
var nums = [3, 7, 7, 7];
var freqs = {};
var max_index;
var max_value = -1/0; // Negative infinity.
$.each(nums, function(i, v) {
if (freqs[v] != undefined) {
freqs[v]++;
} else {
freqs[v] = 1;
}
});
$.each(freqs, function(num, freq) {
if (freq > max_value) {
max_value = freq;
max_index = num;
}
});
if (max_index != undefined) {
alert("Most common element is " + max_index + " with " + max_value + " repetition(s).");
}
答案 1 :(得分:3)
以下是使用javascript的简单示例:
function mostFrequent(arr) {
var uniqs = {};
for(var i = 0; i < arr.length; i++) {
uniqs[arr[i]] = (uniqs[arr[i]] || 0) + 1;
}
var max = { val: arr[0], count: 1 };
for(var u in uniqs) {
if(max.count < uniqs[u]) { max = { val: u, count: uniqs[u] }; }
}
return max.val;
}
关于算法复杂性的快速说明 - 因为你必须至少查看一次数组中的每个值,你不能做得比O(n)好。这假设您不了解数组的内容。如果做具有先验知识(例如,数组已排序且仅包含1和0),那么您可以设计一个算法,其运行时间是n的一小部分;虽然从技术上讲,它的复杂性仍然是O(n)。
答案 2 :(得分:3)
这是一个只使用JavaScript的更简单,更快的版本:
var arr = [3, 7, 7, 7, 10, 10, 8, 5, 5, 5, 5, 20, 20, 1];
var counts = {}, max = 0, res;
for (var v in arr) {
counts[arr[v]] = (counts[arr[v]] || 0) + 1;
if (counts[arr[v]] > max) {
max = counts[arr[v]];
res = arr[v];
}
}
alert(res + " occurs " + counts[res] + " times");
请注意,由于您对数据进行了一次循环,所以效率要高得多,如果您要对非常大的数组进行排序,这将开始变得重要。
答案 3 :(得分:1)
Array.prototype.mostFreq=function(){
var what, a= this.concat(), ax, freq,
count, max=0, limit= a.length/2;
while(a.length){
what= a.shift();
count=1;
while((ax= a.indexOf(what))!= -1){
a.splice(ax,1); // remove counted items
++count;
}
// if any item has more than half the array, quit counting
if(count> limit) return what;
if(count> max){
freq= what;
max= count;
}
}
return freq;
}
var a=[1,1,2,5,4,2,7,7,1,1,1,3,7,7,3,4,3,7,3,5,6,2,3,1,1,7,7,2,4,3,6,7,6,6]
alert(a.mostFreq())
答案 4 :(得分:0)
另一个解决方案可以基于Array.reduce():
var arr = [1,1,2,5,4,2,10,10,1,1,1,3,10,10,3,4,3,10,3,5,6,2,3,1,1,10,10,2,4,3,6,10,6,6];
var result = arr.reduce(function(acc, e) {
acc[e] = (acc[e] || 0) + 1;
if (acc[e] > acc.mostFreq.freq) {
acc.mostFreq.value = e;
acc.mostFreq.freq = acc[e];
}
return acc;
}, {"mostFreq": {"value": 0, "freq": 0}}).mostFreq;
console.log('The most duplicated elements is: ' + JSON.stringify(result));