Java 数组中最常见的值

Java 数组中最常见的值,java,arrays,elements,Java,Arrays,Elements,如何查找数组中最常见的三个元素?我正在使用长度为10000的数组,其中元素=0-100之间的随机整数 我在考虑使用两个数组,一个长度为100,然后使用if语句递增。但是,我想知道是否有一种方法可以只使用一个for/if循环(语句)来查找这些值。您可以在一个循环中完成,但我认为您仍然需要第二个数组 也就是说,在输入数组上循环,每次看到一个值时,在“计数器”数组中增加相应的索引。但是,还要保留3个“顶级”索引(已排序)。每次递增时,将新值与前3个索引中的值进行对比,说明您可能只需要重新排列“顶级”值

如何查找数组中最常见的三个元素?我正在使用长度为10000的数组,其中元素=0-100之间的随机整数


我在考虑使用两个数组,一个长度为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;
}