![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
brave |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 7.3.2010 Репутация: нет Всего: нет |
Всем привет, решил(или не совсем решил:)) небольшую задачку. Тех, у кого есть немного времени, прошу прокомментировать и указать на недостатки. Тянут ли задачи такого типа на уровень джуниора?
Задача: Определить класс, описывающий покупку одного и того же штучного товара по одной и той же цене в течение одного месяца и содержащий сведения о дне покупки и количестве приобретенных единиц. Допускаются еще три варианта покупок: 1. со скидкой, задаваемой процентом от стоимости; 2. со скидкой в цене (например, цена товара 5000 руб., скидка 300 руб.); 3. с надбавкой за транспортные расходы на доставку товара. Создать консольное приложение, в котором последовательно выполнить следующие задания: – определить набор покупок различного вида (не менее 10); – вывести на консоль в табличном виде (можно без границ) набор покупок (полный состав атрибутов); – вычислить и вывести стоимость всех покупок; – отсортировать покупки по возрастанию дня покупки и вывести их на консоль; – определить, была ли покупка в десятый день месяца. Требования: – Использовать объектно-ориентированный подход для описания покупок. – Массив или коллекцию покупок инициализировать в коде с помощью конструктора или метода. Как следствие, не использовать внешние источники данных: консоль (т.е. ввод с клавиатуры), файлы, СУБД, XML и т.п. – Приложение должно быть консольным. Не использовать графический интерфейс! Таким образом, приложение ничего не должно вводить, а только выводить результаты на консоль.
|
|||
|
||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Не очень эффективно, но правильно. Почти.
Строка "There was no purchase on the tenth day of this month." будет печататься всегда, поскольку в этой строке нет ключевого слова else. Этот фрагментп рограммы должен выглядеть так:
-------------------- Mirkes |
|||
|
||||
brave |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 7.3.2010 Репутация: нет Всего: нет |
Точно, else пропустил. Спасибо! А где именно потеря эффективности? |
||||
|
|||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
В сортировке.
Метод сортировки очень медленный. На десятке и даже сотне ничего, но на больших объемах медленный. В нем плохо большое количество присваиваний. Правда в вслучаи коллекции они быстрые. -------------------- Mirkes |
|||
|
||||
brave |
|
||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 7.3.2010 Репутация: нет Всего: нет |
Спасибо, использовал bubblesort, чтобы попроще. Можно реализовать через quicksort. А как решить проблему присваиваний? Есть какой-то способ сделать этот метод эффективнее? |
||||
|
|||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
На эту тему есть обширная литература как на русском, так и на английском. Из абсолютной классики Кнут. К сожалению я не могу назвать подхлдящего источника. -------------------- Mirkes |
|||
|
||||
brave |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 7.3.2010 Репутация: нет Всего: нет |
Ок, я имел ввиду, что не так с присваиваниями, проблема в их количестве? |
|||
|
||||
Mirkes |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Вообще-то я посоветовал почитать книги.
В данном конкретном случае суть сортировки состоит в том, что вы перемещаете максимальное значение несортированной части массива в его конец и уменьшаете размер несортированной части на 1. Для этого достаточно ОДНОЙ перестановки двух элементов. Ваш код
В худшей ситуации, когда исходно массив был отсортирован по убыванию, вы получите n^2 операций перестановок. Точнее n(n-1)/2. Столько же сравнений. И дважды столько получений даты из коллекции. Полагаю, что это операции одного уровня затрат по времени. При данном алгоритме невозможно уменьшить число сравнений. А вот с перестановками и извлеченями из коллекции можно поиграть.
Число сравнений то же. Число перестановок n-1 -уменьшилось в n/2 раз Число извлечений из массива не более n(n+1)/2 - уменьшилось не менее чем в два раза (почти). В среднем уменьшится раза в 4. Вот собственно и вся оптимизация. На 10 или 100 значениях заметно не будет. На нескольких тысячах уже весьма ощутимо. -------------------- Mirkes |
||||
|
|||||
brave |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 7.3.2010 Репутация: нет Всего: нет |
Спасибо за детальный анализ. Значит, основная проблема - это эффективность метода сортировки. Буду разбираться на досуге. P.S. метод sort я объявил как статик, чтобы была возможность использовать его в методе main. |
||||||
|
|||||||
Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 7 Всего: 17 |
Согласен, недосмотрел ![]() А анализ методов сортировки лучше изучать по литературе, а не по моим наброскам. -------------------- Mirkes |
|||
|
||||
VSB |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 23.8.2007 Репутация: нет Всего: 2 |
А если использовать стандартную сортировку слиянием?
|
|||
|
||||
brave |
|
|||
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 7.3.2010 Репутация: нет Всего: нет |
Да, действительно.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |