Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 17
1

Оптимизация кода

16.12.2015, 21:51. Просмотров 1809. Ответов 16
Метки нет (Все метки)

задача :
Группа людей участвует в марафоне, их имена и время за которое они пробежали марафон вы можете увидеть ниже.
Ваша задача найти человека, который быстрее всех пробежал дистанцию и вывести его имя и счет.
(Опционально) Найдите человека, который прибежал вторым.
Java
1
2
3
String[] names = { "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate" };
 
int[] times = { 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265 };
я решил ее , но понимаю , что можно лучше , хотелось бы увидеть объективное обсуждение моего кода и другой вариант))

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args) {
        String[] names = { "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate" };
        int[] times = { 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265 };
        int max = 0,n = 0,i,m = 0,j = 0;
        
        for(i = 0 ; i < times.length-1 ; i++){
            if(max < times[i] && j != 1){
               max = times[i]; //находим первое место
               n = i;
            }
            
            if(i == times.length-2 && j != 1){
                i = 0;
                j = 1;//изменяем значения , чтобы не заходило в if для поиска 1 места
                max = 0;
                System.out.println("complete request for first place");
            }
            
            if(max < times[i] && j == 1 && i != n){
                max = times[i];//находим второе место 
                m = i;
            }
        }
        System.out.println(names[n]+" win the race with time "+times[n]);
        System.out.println(names[m]+" take the second place with time "+times[m]);
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2015, 21:51
Ответы с готовыми решениями:

Оптимизация кода
Есть 2 метода, изначально вводится строка допусти 2 + 3. Строка разбивается на массив(чисел и...

Оптимизация кода
во всем коде много раз повторяются такие вот строчки for(int i = 0; i &lt; 9; i++) for(int j =...

Оптимизация кода
Добрый день, уважаемые форумчане. Вопрос несколько тривиальный, но в голову уже ничего не лезет...

Массивы, оптимизация кода
Int n = sc.nextInt(); Int mass=new int ; For (int i=1;i&lt; mass.length; i++){ mass =(i*2)-1;} ...

16
30 / 28 / 11
Регистрация: 27.09.2014
Сообщений: 310
16.12.2015, 23:44 2
Мне больше так нравится
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static void main(String[] args) {
        String[] names = { "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate" };
        int[] times = { 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265 };
        
        int n = 0, m = 0;
        int[] arraySort = times;  //создём массив который отсортируем методом sort
        
        Arrays.sort(arraySort);   //сортируем массив 
        
        int firstTime = arraySort[0]; // 0 индекс == наименьшее время
        int secondTime = arraySort[1];
        
        for(int i = 0; i<times.length; i++) // здесь узнаём индекс наименьшего времени массива times
        {
            if (times[i] == firstTime)
            {
                 n = i;
                 break;
            }
        }
        for (int i = 0; i<times.length; i++) // тут и так всё ясно
        {
            if (times[i] == secondTime)
            {
                m = i;
                break;
            }
        }
        // ву а ля
        System.out.println(names[n]+" win the race with time "+times[n]);
        System.out.println(names[m]+" take the second place with time "+times[m]);
 
    }
 
}
Нужно проверить чей код быстрее
0
Эксперт Java
2304 / 2144 / 546
Регистрация: 28.12.2010
Сообщений: 8,434
16.12.2015, 23:49 3
Цитата Сообщение от olexiy86 Посмотреть сообщение
Нужно проверить чей код быстрее
зачем? И так видно что у вас Nlog(N) а у ТС N
0
95 / 95 / 50
Регистрация: 07.07.2015
Сообщений: 208
17.12.2015, 00:15 4
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package samples.compare;
 
import java.util.*;
import java.util.logging.Logger;
 
/**
 *
 */
public class FindFirst {
 
    private static Logger logger = Logger.getLogger(String.valueOf(FindFirst.class));
 
    public static List<Map.Entry<String, Integer>> getSortedList(String[] names, int[] time) {
        Map<String, Integer> map = new HashMap<>();
        try {
            for (int i = 0; i < names.length; i++) {
                map.put(names[i], time[i]);
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            logger.severe("Pichal'ka! " + e.toString());
        }
 
        List<Map.Entry<String, Integer>> resultList = new ArrayList<>(map.entrySet());
 
        Collections.sort(resultList, (o1, o2) -> Integer.compare(o1.getValue(), o2.getValue()));
 
        return resultList;
    }
 
    public static void main(String[] args) {
        String[] names = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt",
                "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda",
                "Aaron", "Kate"};
        int[] time = {341, 273, 278, 329, 445, 402, 388, 275, 243, 334,
                412, 393, 299, 343, 317, 265};
 
        List<Map.Entry<String, Integer>> list = getSortedList(names, time);
 
        System.out.println(new StringBuilder().append("Первый ").append(list.get(0).getKey())
                .append(" со временем ").append(list.get(0).getValue()).append(" секунд.").toString());
        System.out.println(new StringBuilder().append("Второй ").append(list.get(1).getKey())
                .append(" со временем ").append(list.get(1).getValue()).append(" секунд.").toString());
    }
}
0
30 / 28 / 11
Регистрация: 27.09.2014
Сообщений: 310
17.12.2015, 00:37 5
Кстати у Kevin Flynn программа не правильно работает , хоть и в 7.8 раза быстрее
0
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 17
17.12.2015, 07:31  [ТС] 6
olexiy86, все правильно работает , вот вывод :
complete request for first place
Phil win the race with time 445
Jane take the second place with time 412

Добавлено через 2 минуты
изменяю в массиве 412 на 499 , вывод :
complete request for first place
Jane win the race with time 499
Phil take the second place with time 445

Добавлено через 3 минуты
olexiy86, ахах , только если ты про то , что я нахожу лузера , а не победителя
только сейчас заметил , ну в принципе там только 2 знака изменить))

Добавлено через 2 минуты
и максимуму присвоить число под несколько К
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int max = 999999,n = 0,i,m = 0,j = 0;
        
        for(i = 0 ; i < times.length-1 ; i++){
            if(max > times[i] && j != 1){
               max = times[i];
               n = i;
            }
            
            if(i == times.length-2 && j != 1){
                i = 0;
                j = 1;
                max = 99999999;
                System.out.println("complete request for first place");
            }
            
            if(max > times[i] && j == 1 && i != n){
                max = times[i];
                m = i;
            }}
complete request for first place
John win the race with time 243
Thomas take the second place with time 273
Добавлено через 2 минуты
для моралфагов можно max присвоить 2147483647

Добавлено через 9 минут
olexiy86, кстати если у тебя в программе в массиве будет два одинаковых времени и если они минимальны , то second и first Time будет одинаковым и выдаст одинаковое время хоть и с разными именами(они разделят 1 место) и тебе надо искать второе
0
30 / 28 / 11
Регистрация: 27.09.2014
Сообщений: 310
17.12.2015, 21:34 7
Ув. Kevin Flynn твой код работает не правильно второй результат ну ни как не 273.
0
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 17
17.12.2015, 21:50  [ТС] 8
olexiy86, убрал в цикле -1 у times.length , теперь все правильно . ... А у тебя не особо))

Добавлено через 9 минут
olexiy86, P.s. нажимай на имя пользователя на форуме и это будет оформляться как ответ)
0
30 / 28 / 11
Регистрация: 27.09.2014
Сообщений: 310
18.12.2015, 14:07 9
Kevin Flynn, а у тебя если два одинаковых времени то они занимают первое и второе место - тоже не честно по отношению к спортсменам
0
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 17
18.12.2015, 19:35  [ТС] 10
olexiy86, ты мои сообщения читаешь ?)) У тебя тоже так будет.))
Цитата Сообщение от Kevin Flynn Посмотреть сообщение
olexiy86, кстати если у тебя в программе в массиве будет два одинаковых времени и если они минимальны , то second и first Time будет одинаковым и выдаст одинаковое время хоть и с разными именами
0
2872 / 2284 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
18.12.2015, 20:17 11
Лучший ответ Сообщение было отмечено Kevin Flynn как решение

Решение

объясните мне почему Фил выиграл марафон, если у него время самое большое?
я не могу врубиться

Добавлено через 8 минут
ладно, допустим так и есть - у кого больше число тот и победил
мой вариант
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public static void main(String[] args) {
        String[] names = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"};
        int[] times = {341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265};
        //
        int firstMin = Integer.MIN_VALUE;
        int secondMin = Integer.MIN_VALUE;
        int firstPos = -1;
        int secondPos = -1;
        //
        for (int i = 0; i < times.length; i++) {
            int t = times[i];
            if (t > firstMin) {
                firstMin = t;
                firstPos = i;
            } else if (t > secondMin && secondMin < firstMin) {
                secondMin = t;
                secondPos = i;
            }
        }
        System.out.println(names[firstPos] + " win the race with time " + times[firstPos]);
        System.out.println(names[secondPos] + " take the second place with time " + times[secondPos]);
    }
0
0 / 0 / 0
Регистрация: 05.12.2015
Сообщений: 17
18.12.2015, 20:56  [ТС] 12
Паблито,
Цитата Сообщение от Kevin Flynn Посмотреть сообщение
я нахожу лузера , а не победителя
0
318 / 304 / 206
Регистрация: 14.09.2015
Сообщений: 827
18.12.2015, 23:20 13
Kevin Flynn,
Цитата Сообщение от Kevin Flynn Посмотреть сообщение
хотелось бы увидеть объективное обсуждение моего кода
- тут самый простой вариант: зайдите на этот пост, если конечно не расстанетесь с Java, через месяцочек, а потом ещё через месяцочек. Это будет самая объективная и едкая критика.
Цитата Сообщение от Kevin Flynn Посмотреть сообщение
for(i = 0 ; i < times.length-1 ; i++)
- для меня вот совершенно не понятно зачем сужать диапазон цикла? Какой в этом резон? Разработчику виднее...
Могу предложить несколько иной вариант реализации поставленной задачи:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Sport {
 
    public static void main(String[] args) {
        String[] names = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"};
        int[] times = {341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265};
        int[] temp = new int[times.length];
        temp = times.clone();
        Arrays.sort(temp);
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < times.length; j++) {
                if(temp[i] == times[j]){
            System.out.println((i + 1) + " место с результатом " + times[j] + " занимает " + names[j]);
                }
            }
        }
    }
}
Выводит на экран первые три места. Ежели желаете больше, то поменяйте в первом цикле цифру "3" на то, что пожелаете.
Сейчас на консоль выдаст следующее:
Java
1
2
3
1 место с результатом 243 занимает John
2 место с результатом 265 занимает Kate
3 место с результатом 273 занимает Thomas
Добавлено через 13 минут
Вот, к примеру, первая дюжина:
Java
1
2
3
4
5
6
7
8
9
10
11
12
1 место с результатом 243 занимает John
2 место с результатом 265 занимает Kate
3 место с результатом 273 занимает Thomas
4 место с результатом 275 занимает Emma
5 место с результатом 278 занимает Hamilton
6 место с результатом 299 занимает Daniel
7 место с результатом 317 занимает Aaron
8 место с результатом 329 занимает Suzie
9 место с результатом 334 занимает James
10 место с результатом 341 занимает Elena
11 место с результатом 343 занимает Neda
12 место с результатом 388 занимает Alex
0
30 / 28 / 11
Регистрация: 27.09.2014
Сообщений: 310
19.12.2015, 20:59 14
HOBATOP, с применением Arrays.sort(temp) я уже предлагал, но такой код работает медленее, а тема создана для оптимизации а не усложнения, если напишите код который будет работать быстрее авторского то я за Вас порадуюсь.
0
Эксперт Java
2304 / 2144 / 546
Регистрация: 28.12.2010
Сообщений: 8,434
19.12.2015, 21:45 15
Цитата Сообщение от olexiy86 Посмотреть сообщение
если напишите код который будет работать быстрее авторского
в контексте быстродействия ТС предложил наиболее быстрый алгоритм O(N). Быстрее эта задача не решается.
0
318 / 304 / 206
Регистрация: 14.09.2015
Сообщений: 827
20.12.2015, 01:22 16
olexiy86, о том, что приведённый в начале поста, код работает неверно я промолчу. А вот про скорость работы попробую отписаться. Код был доработан следующим образом:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Sport {
 
    public static void main(String[] args) {
        long q = 10000, f = 0;
        int n = (int) q;
        for (int i = 0; i < n; i++) {
            f += sport();
        }
        System.out.println((f / q));
    }
 
    public static long sport() {
        long timer = System.nanoTime();
        String[] names = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"};
        int[] times = {341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265};
        int max = 0, n = 0, i, m = 0, j = 0;
 
        for (i = 0; i < times.length - 1; i++) {
            if (max < times[i] && j != 1) {
                max = times[i]; //находим первое место
                n = i;
            }
 
            if (i == times.length - 2 && j != 1) {
                i = 0;
                j = 1;//изменяем значения , чтобы не заходило в if для поиска 1 места
                max = 0;
                System.out.println("complete request for first place");
            }
 
            if (max < times[i] && j == 1 && i != n) {
                max = times[i];//находим второе место 
                m = i;
            }
        }
        System.out.println(names[n] + " win the race with time " + times[n]);
        System.out.println(names[m] + " take the second place with time " + times[m]);
        timer = System.nanoTime() - timer;
        System.out.println(timer);
        return timer;
    }
}
И вот такая тестовая версия:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Arrays;
 
public class Sport {
 
    public static void main(String[] args) {
        long q = 10000, f = 0;
        int n = (int) q;
        for (int i = 0; i < n; i++) {
            f += sport();
        }
        System.out.println((f / q));
    }
    public static long sport(){   
        long timer = System.nanoTime();
        String[] names = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda", "Aaron", "Kate"};
        int[] times = {341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299, 343, 317, 265};
        StringBuilder s = new StringBuilder();
        int[] temp = Arrays.copyOf(times, times.length);
        Arrays.sort(temp);
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < times.length; j++) {
                if(temp[i] == times[j]){
            s.append(i + 1).append(" место с результатом ").append(times[j]).append(" занимает ").append(names[j]).append("\n");
                }
            }
        }
        System.out.println(s.toString());
        timer = System.nanoTime() - timer;
        System.out.println(timer);
        return timer;
    }
}

После компиляции обоих версий были запущены на отработку на одном и том же компьютере. Результаты на скриншотах. Конечно да, версия с Arrays.sort проигрывает, но не настолько критично, чтобы стоило пренебрегать подобной вариацией.
Оптимизация кода
Оптимизация кода
0
2872 / 2284 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.12.2015, 11:46 17
никак не успокоится...мой код все равно работает быстрее
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2015, 11:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Java оптимизация кода
Есть некий код, осуществляющий чтения числа элементов массива, а далее и сам массив, на выходе...

Оптимизация кода на Java
Доброго времени суток, понимаю что данный код можно оптимизировать и по человечески переписать, но...

Оптимизация кода для вывода категорий.
Здравствуйте. У меня есть таблица с категориями примерно с такой структурой. category...

Оптимизация кода поиска наибольшего и наименьшего числа
Ребята, Java изучаю по книжке. Хотелось бы увидеть решение от гуру, чтоб знать к чему стремиться....

Оптимизация кода (подсчет числа цифр 1-9 в последовательности)
Здравтсвуйте! Помогите, пожалуйста, оптимизировать код. В одном тесте - TLE. import...

Оптимизация кода
import java.awt.Dimension; import java.util.ArrayList; import java.util.HashSet; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.