Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Небольшая задача |
Автор: brave 17.10.2012, 17:16 | ||
Всем привет, решил(или не совсем решил:)) небольшую задачку. Тех, у кого есть немного времени, прошу прокомментировать и указать на недостатки. Тянут ли задачи такого типа на уровень джуниора? Задача: Определить класс, описывающий покупку одного и того же штучного товара по одной и той же цене в течение одного месяца и содержащий сведения о дне покупки и количестве приобретенных единиц. Допускаются еще три варианта покупок: 1. со скидкой, задаваемой процентом от стоимости; 2. со скидкой в цене (например, цена товара 5000 руб., скидка 300 руб.); 3. с надбавкой за транспортные расходы на доставку товара. Создать консольное приложение, в котором последовательно выполнить следующие задания: – определить набор покупок различного вида (не менее 10); – вывести на консоль в табличном виде (можно без границ) набор покупок (полный состав атрибутов); – вычислить и вывести стоимость всех покупок; – отсортировать покупки по возрастанию дня покупки и вывести их на консоль; – определить, была ли покупка в десятый день месяца. Требования: – Использовать объектно-ориентированный подход для описания покупок. – Массив или коллекцию покупок инициализировать в коде с помощью конструктора или метода. Как следствие, не использовать внешние источники данных: консоль (т.е. ввод с клавиатуры), файлы, СУБД, XML и т.п. – Приложение должно быть консольным. Не использовать графический интерфейс! Таким образом, приложение ничего не должно вводить, а только выводить результаты на консоль.
|
Автор: Mirkes 18.10.2012, 06:44 | ||
Не очень эффективно, но правильно. Почти. Строка "There was no purchase on the tenth day of this month." будет печататься всегда, поскольку в этой строке нет ключевого слова else. Этот фрагментп рограммы должен выглядеть так:
|
Автор: brave 18.10.2012, 07:26 | ||||
Точно, else пропустил. Спасибо! А где именно потеря эффективности? |
Автор: Mirkes 18.10.2012, 07:46 | ||
В сортировке.
Метод сортировки очень медленный. На десятке и даже сотне ничего, но на больших объемах медленный. В нем плохо большое количество присваиваний. Правда в вслучаи коллекции они быстрые. |
Автор: brave 18.10.2012, 08:19 | ||||
Спасибо, использовал bubblesort, чтобы попроще. Можно реализовать через quicksort. А как решить проблему присваиваний? Есть какой-то способ сделать этот метод эффективнее? |
Автор: brave 18.10.2012, 11:46 | ||||
Ок, я имел ввиду, что не так с присваиваниями, проблема в их количестве? |
Автор: Mirkes 18.10.2012, 13:35 | ||||
Вообще-то я посоветовал почитать книги. В данном конкретном случае суть сортировки состоит в том, что вы перемещаете максимальное значение несортированной части массива в его конец и уменьшаете размер несортированной части на 1. Для этого достаточно ОДНОЙ перестановки двух элементов. Ваш код
В худшей ситуации, когда исходно массив был отсортирован по убыванию, вы получите n^2 операций перестановок. Точнее n(n-1)/2. Столько же сравнений. И дважды столько получений даты из коллекции. Полагаю, что это операции одного уровня затрат по времени. При данном алгоритме невозможно уменьшить число сравнений. А вот с перестановками и извлеченями из коллекции можно поиграть.
Число сравнений то же. Число перестановок n-1 -уменьшилось в n/2 раз Число извлечений из массива не более n(n+1)/2 - уменьшилось не менее чем в два раза (почти). В среднем уменьшится раза в 4. Вот собственно и вся оптимизация. На 10 или 100 значениях заметно не будет. На нескольких тысячах уже весьма ощутимо. |
Автор: brave 18.10.2012, 15:02 | ||||||
Спасибо за детальный анализ. Значит, основная проблема - это эффективность метода сортировки. Буду разбираться на досуге. P.S. метод sort я объявил как статик, чтобы была возможность использовать его в методе main. |
Автор: Mirkes 19.10.2012, 10:39 | ||
Согласен, недосмотрел ![]() А анализ методов сортировки лучше изучать по литературе, а не по моим наброскам. |
Автор: VSB 20.10.2012, 17:55 | ||
А если использовать стандартную сортировку слиянием?
|
Автор: brave 22.10.2012, 10:16 |
Да, действительно. |