Найти режим (наиболее часто встречающееся значение в массиве), используя простой цикл for? - PullRequest
0 голосов
/ 22 августа 2011

Как найти режим (наиболее частое значение в массиве), используя простой цикл for?

Код компилируется с неправильным выводом.

Вот что у меня есть:

public static void mode(double [] arr)
{
    double mode=arr[0];

    for(int i = 1; i<arr.length; i++)
    {   
        if(mode==arr[i])
        {
            mode++;
        }

     }


    return mode;
}

Ответы [ 4 ]

4 голосов
/ 02 ноября 2012

Сначала я сортирую массив по порядку, а затем подсчитываю вхождения одного числа.Нет хеш-таблиц только для операторов цикла и if.

Мой код:

static int Mode(int[] n){
    int t = 0;
    for(int i=0; i<n.length; i++){
        for(int j=1; j<n.length-i; j++){
            if(n[j-1] > n[j]){
                t = n[j-1];
                n[j-1] = n[j];
                n[j] = t;
            }
        }
    }

    int mode = n[0];
    int temp = 1;
    int temp2 = 1;
    for(int i=1;i<n.length;i++){
        if(n[i-1] == n[i]){
            temp++;
        }
        else {
            temp = 1;
        }
        if(temp >= temp2){
            mode = n[i];
            temp2 = temp;
        }
    }
    return mode;
}
3 голосов
/ 22 августа 2011

-Просто используйте HashMap, который содержит значения индекса массива в качестве ключей и номера их появления в качестве значений.

-Обновите HashMap при прохождении цикла for, проверив, существует ли текущий индекс в HashMap.ЕСЛИ ЭТО ДЕЛАЕТСЯ, найдите этот двойник в хэш-карте и посмотрите, сколько раз оно уже произошло, и поместите его обратно в HashMap с еще одним вхождением.

-Я сделал это на Java, потому что похоже, что вы используете.Что также хорошо, так это то, что временная сложность равна O (n), и это лучшее, что вы могли бы получить для этого типа сценария, потому что вы должны посетить каждый элемент хотя бы один раз.

-Так если у вас есть такой массив, как double: {1,2,3,1,1,1,5,5,5,7,7,7,7,7,7,7, 7,7} Тогда хеш-карта в конце будет выглядеть примерно так: {1-> 4, 2-> 1, 3-> 1, 5-> 3, 7-> 9} То есть «1 произошло 4»2 раза произошло 1 раз .... 7 произошло 9 раз "и т. д.

    public static double mode(double [] arr)
    {
        HashMap arrayVals = new HashMap();
        int maxOccurences = 1;
        double mode = arr[0];

        for(int i = 0; i<arr.length; i++)
        {   
            double currentIndexVal = arr[i];
            if(arrayVals.containsKey(currentIndexVal)){
                int currentOccurencesNum = (Integer) arrayVals.get(currentIndexVal);
                currentOccurencesNum++;
                arrayVals.put(currentIndexVal, currentOccurencesNum );
                if(currentOccurencesNum >= maxOccurences)
                {
                    mode = currentIndexVal;
                    maxOccurences = currentOccurencesNum;
                }
            }
            else{
                arrayVals.put(arr[i], 1);
            }
        }


        return mode;
    }
1 голос
/ 01 мая 2014

Этот код представляет собой другой способ, который не использует хеш-карты. Этот метод, созданный в Java, принимает массив в качестве параметра и создает другой массив с именем «numberCount» в методе. Этот массив "numberCount" установит свой индекс на значение в массиве. Индекс «numberCount», содержащий значение в переданном массиве, добавит 1 к значению «numberCount» («++ numberCount [array [i]]»), а затем перейдет к следующему значению в массиве (повторять до конец массива). Затем создает еще один цикл for для прохождения каждого значения массива в "numberCount", у которого когда-либо индекс имеет наибольшее значение / счетчик будет сохранен и возвращен как "max." Этот метод должен будет претерпеть некоторые сложные изменения, чтобы использовать двойной массив. но, похоже, отлично работает с массивом int.

public static int findMostFrequentValue(int[] array) {
    int i;
    int[] numberCount = new int[100];
    for (i = 0; i < array.length; i++)++numberCount[array[i]];
    int max = 0;
    int j;

    for (j = 0; j < numberCount.length; j++) {
        if (numberCount[j] > max) max = j;
    }
    return max;
}
0 голосов
/ 11 января 2017

Вы должны проверить количество вхождений каждого элемента в вашем массиве.Вы можете сделать это, сравнивая каждый элемент массива с собой и другими через 2 внутренних цикла for.

Помните, что если массив не отсортирован и содержит более 1 модального значения (таким образом, повторяя количество вхождений), это вернет первое.Может быть, стоит сначала упорядочить массив с помощью Arrays.sort (array) , чтобы можно было выбрать самое маленькое или самое большое модальное значение.

public static int modeOfArray(int[] array){
    int mode;     
    int maxOccurance = 0;

    for(int i=0; i<array.length; i++){
        int occuranceOfThisValue = 0;
        for(int j=0; j<array.length; j++){
            if(array[i] == array[j])
               occuranceOfThisValue++;
        }

        if(occuranceOfThisValue > maxOccurance){
            maxOccurance = occuranceOfThisValue;
            mode = array[i];
        }
    }
    return mode;
}
...