【发布时间】:2010-10-17 12:28:57
【问题描述】:
知道如何从数组中获取模式值吗?例如,如果我有一个数字不同的数组,我如何使用 Java 来搜索哪个数字出现的次数最多?
【问题讨论】:
标签: java
知道如何从数组中获取模式值吗?例如,如果我有一个数字不同的数组,我如何使用 Java 来搜索哪个数字出现的次数最多?
【问题讨论】:
标签: java
在 O(n) 中完成,而不是 O(n^2)。需要长度 > 0 的数组。
public static int getMode(int[] values) {
HashMap<Integer,Integer> freqs = new HashMap<Integer,Integer>();
for (int val : values) {
Integer freq = freqs.get(val);
freqs.put(val, (freq == null ? 1 : freq+1));
}
int mode = 0;
int maxFreq = 0;
for (Map.Entry<Integer,Integer> entry : freqs.entrySet()) {
int freq = entry.getValue();
if (freq > maxFreq) {
maxFreq = freq;
mode = entry.getKey();
}
}
return mode;
}
【讨论】:
这有点过时了,我不知道它的性能,但如果你愿意在你的 Java 中尝试一点 Groovy...
static int modal( ArrayList values ) {
use(Collections){
values.max{ values.frequency(it) }
}
}
【讨论】:
一个基本的,虽然效率低下的算法是这样的:
static int modal( int[] values ) {
int modal = 0;
int mfreq = 0;
for( int i : values ) {
// Is this value the most frequent we've found so far?
int freq = 0;
for( int j : values ) {
if( j == i ) {
freq++;
}
}
if( freq > mfreq ) {
modal = i;
mfreq = freq;
}
return modal;
}
您可以通过预先计算每个值的频率并将它们存储在地图或类似物中来做得更好,尽管这仍然需要遍历值,并且仍然需要另一个循环来确定哪个频率最高.
【讨论】: