Java 数组中最常见的值
如何查找数组中最常见的三个元素?我正在使用长度为10000的数组,其中元素=0-100之间的随机整数Java 数组中最常见的值,java,arrays,elements,Java,Arrays,Elements,如何查找数组中最常见的三个元素?我正在使用长度为10000的数组,其中元素=0-100之间的随机整数 我在考虑使用两个数组,一个长度为100,然后使用if语句递增。但是,我想知道是否有一种方法可以只使用一个for/if循环(语句)来查找这些值。您可以在一个循环中完成,但我认为您仍然需要第二个数组 也就是说,在输入数组上循环,每次看到一个值时,在“计数器”数组中增加相应的索引。但是,还要保留3个“顶级”索引(已排序)。每次递增时,将新值与前3个索引中的值进行对比,说明您可能只需要重新排列“顶级”值
我在考虑使用两个数组,一个长度为100,然后使用if语句递增。但是,我想知道是否有一种方法可以只使用一个for/if循环(语句)来查找这些值。您可以在一个循环中完成,但我认为您仍然需要第二个数组
也就是说,在输入数组上循环,每次看到一个值时,在“计数器”数组中增加相应的索引。但是,还要保留3个“顶级”索引(已排序)。每次递增时,将新值与前3个索引中的值进行对比,说明您可能只需要重新排列“顶级”值列表。如果要在列表中以恒定的传递次数执行此操作,则需要第二个数据结构 如果该集合中的值有上下限,且值相对密集,则计数器数组是一个很好的解决方案 否则,最好使用
映射
,其中键是集合的元素,值是计数器
分析
如果在开始之前集合上没有上下限,那么您就不知道要分配的计数器的大数组。所以你必须对数组做一个初步的遍历来找到边界。。。现在你有了一个二次解
如果确实有上下限,但集合是稀疏的,则初始化计数数组的成本+查找三个最大计数的成本将主导集合元素计数的成本。如果差异足够大(即输入很大且非常稀疏),HashMap将更快,占用更少的内存
或者
如果允许您更改数组,您可以将其按升序排序,然后在排序的数组上一次性查找三个最常见的元素。可能有更好的方法,但这是一种方法。我刚刚打印了模式数组,但您可以对其进行排序,以查看实际发生的次数最多。这很简单,因为我们知道我们正在处理的数字的上下限,但是如果你不知道这些上限,那么你需要接受Stephen C给出的建议
public class Main {
public static void main(String[] args) {
int i;
int value;
//one greater than max value because Math.random always returns a value less than 1.0
//this number also works good for our mode array size
int maxValue = 101;
int[] originalArray = new int[10000];
int[] modeArray = new int[maxValue];
for(i = 0; i < originalArray.length; i++){
value = (int) (Math.random() * maxValue);
originalArray[i] = value;
}
for(i = 0; i < originalArray.length; i++){
modeArray[originalArray[i]] += 1;
}
for(i = 0; i < modeArray.length; i++){
System.out.println("Number " + i + " occurred " + modeArray[i] + " times");
}
}
}
公共类主{
公共静态void main(字符串[]args){
int i;
int值;
//一个大于最大值,因为Math.random始终返回小于1.0的值
//这个数字也适用于我们的模式数组大小
int maxValue=101;
int[]originalArray=新int[10000];
int[]modeArray=新的int[maxValue];
对于(i=0;i
//查找数组中的大多数值-O(n log n)->wrost case O(n)
void find多数(){
//分类
排序(开始(sarray),结束(sarray));
//sarray[0]是我们已经统计的第一个数字
int cont=1;
int leader=sarray[0];
//临时变量,以了解何时更改为不同的数字
int-tempLeader=0;
int-tempCont=0;
//循环遍历sarray.size()
对于(unsigned int i=1;icont){//它的出现率不比我们上一个数字高吗?跳过,否则我们会有一个新的前导
领导者=模板领导者;
cont=tempCont;
TempleReader=0;
tempCont=0;
}
}
}
if(if loop){me.gougeOutEyes();}相关的(可能不是重复的,因为它涉及文字,这涉及数字——有些方法不同)为什么要用一个公认的答案来解决一个4岁的问题,然后称之为“垃圾:你自己”?
//find majority of a value in a array — O(n log n) -> wrost case O(n)
void findMajority(){
//sort
sort(begin(sarray),end(sarray));
//sarray[0] is our first number already counted
int cont=1;
int leader = sarray[0];
//temp variables to know when we changed to a different number
int tempLeader=0;
int tempCont=0;
//loop through sarray.size()
for(unsigned int i=1; i<size; i++){
if(tempLeader!=sarray[i]) //if we changed number tempCont is 0
tempCont=0;
if(sarray[i]==leader){ //if the current number in the array is our leader then keep counting
cont++;
}
else{ //if not, then our new number will be tempLeader and we count that one
tempLeader=sarray[i];
tempCont++;
if(tempCont>cont){ //its not higher occurences than our last number? skip, else we got a new leader
leader=tempLeader;
cont=tempCont;
tempLeader=0;
tempCont=0;
}
}
}
cout << "leader is" << leader << endl;
}