Как оптимизировать мой текущий метод getMax для получения наибольшего числа в массиве? - PullRequest
0 голосов
/ 10 сентября 2010

Что было бы лучшим способом оптимизировать этот код ниже, чтобы сделать его более эффективным при применении «лучших практик». Это простой школьный проект, и он работает, я его протестировал. Но я просто чувствую, что есть лучший и более эффективный способ написания этого метода. Что ты думаешь?

  1. У меня есть массив, который предварительно заселено кучей номера. Метод getMax() получает наибольшее число в массив. Но если массив пуст возвращает -1.
  2. nElems - это просто переменная, которая отслеживает, сколько элементов присутствует в массиве.

  3. array - это закрытый массив, объявленный в начале класса.

    public int getMax() {
    int k = 0;
    int max = array[0];
    
    for(int j=0; j<nElems; j++) {
        if(max < array[j])
            max = array[j];
    }
    
    if(k == nElems)
        return -1;
    else return max;
    } // end of method
    

О, и как мне назвать мою переменную k, чтобы сделать ее более читабельной? Его цель - 0, чтобы его можно было проверить по количеству элементов в массиве, чтобы получить либо -1, либо наибольшее число;

Предположим, что все значения массива положительные.

Ответы [ 5 ]

4 голосов
/ 10 сентября 2010

Вам не нужно отслеживать количество элементов в массиве с помощью nElems, если только вы не имеете в виду, что у вас есть частично заполненный массив, а nElems - это количество слотов в нем, которые действительно имеют значения.Скорее всего, вы просто должны использовать array.length для проверки длины массива.

Вам не нужна переменная k, чтобы "быть 0".Литерал 0 является точным представлением 0. Так что, если вы хотите вернуть -1, если массив пуст, вы можете запустить метод с

if (array.length == 0)
  return -1;

Тем не менее, возвращая -1 для пустогоМассив довольно странный, так как -1 должен быть верным результатом для метода.

3 голосов
/ 10 сентября 2010

Его цель - быть 0, чтобы его можно было проверить по количеству элементов в массиве, чтобы получить либо -1, либо наибольшее число;

Ноль не требуетсяname - если вы имеете в виду 0, используйте литерал 0.

Ваш цикл в порядке.Есть вещи, которые вы можете сделать, чтобы попытаться оптимизировать его, но они не обязательно помогут.Почти всегда вы можете просто оставить такую ​​локализованную оптимизацию «замочной скважины» для JIT.Если вы просто хотите попробовать несколько вещей в качестве учебного упражнения, то вы можете поэкспериментировать следующим образом:

  • вместо того, чтобы дважды использовать массив, установить переменную в значение массива, а затем использовать его дважды.
  • разверните цикл на разные суммы.Будьте осторожны, чтобы не ошибиться при доступе к неправильным индексам, если numElem не кратно числу раз, которое вы разворачиваете.
  • работает в обратном направлении через массив, а не вперед
  • немедленно вернитесь, если вы встретите значение Integer.MAX_VALUE.Вы не найдете ничего большего.Трудно определить эффект производительности на этом, так как это ускорит его для больших массивов с MAX_VALUE, который не слишком близок к концу, но, скорее всего, замедлит его для всего остального.Возможно, было бы интересно узнать, насколько это важно.
  • все, что вы можете придумать.

Я не говорю, что что-то из этого будет иметь значение, быстрееили медленнее, но они могли.Так что беги их и время, как быстро каждый идет.Скорее всего, вы узнаете, что по сравнению с передачей в JIT этот материал не стоит вашего времени.Но вы никогда не знаете; -)

Окружающий код может быть очищен, однако, чтобы сделать его более понятным, а не сделать его быстрее.Например:

public int getMax() {
    int max = -1;
    if (nElems > 0) {
        max = array[0];
        for(int j=1; j<nElems; j++) {
            if(max < array[j])
                max = array[j];
        }
    }
    return max;
}

Это также устраняет ошибку в вашем коде: если массив имеет размер 0, вы получаете доступ за пределами второй строки.Способ ColinD сделать это так же хорошо, я показываю что-то другое для разнообразия.

Вот более короткий код, предполагая, что все значения неотрицательны:

public int getMax() {
    int max = -1;
    for(int j=0; j<nElems; j++) {
        if(max < array[j])
            max = array[j];
    }
    return max;
}
1 голос
/ 08 июля 2012

Лучший метод, который я нашел для примитивов, таких как int .. Используйте Integer intead of int.

Integer[] arr = { 6, 7, 10, 15, 2, 4, 8 };
Integer max = Collections.max( Arrays.asList(arr) );

и done ..: -)

0 голосов
/ 10 сентября 2010

Теоретически в многопроцессорной системе (k процессоров) вы могли бы ускорить процесс, разделив список на k подсписков. Создайте процесс, чтобы найти максимум для каждого подсписка, а затем найдите максимум из максимумов.

Вы можете испытывать или не испытывать ускорение, если

  1. у вас многопроцессорная система; и
  2. список огромен.
0 голосов
/ 10 сентября 2010

Взгляните на http://www.sorting -algorithms.com / Он имеет несколько алгоритмов сортировки, объяснения и анимации, которые дают вам хорошее представление о том, что происходит во время сортировки.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...