Анализ алгоритмов (объемно)
Сложность всех задач:
Подсчет количества и среднего года: O(n) — один проход по списку.
Самый плодовитый автор: O(n) — один проход + O(n) на поиск max в map (всего O(n)).
Два наименьших: O(n) — один проход + O(n) на поиск двух min (всего O(n)).
Почему не нужна сортировка:
Сортировка — O(n log n), но мы решаем задачу за O(n).
Для max/min достаточно одного прохода с переменными (или map).
Сортировка нужна только для полного упорядочивания (например, топ-10).
Что изменится при увеличении данных в 1000 раз:
Исходный n = 1000 книг → O(n) = 1000 операций.
n = 1 000 000 книг → O(n) = 1 млн операций — всё равно быстро (миллисекунды на современном ПК).
O(n log n) сортировка на 1 млн — ~20 млн операций — в 20 раз медленнее.
Память: HashMap — O(n) для авторов (если авторов много — тоже O(n)).
Вывод: O(n) алгоритмы масштабируются линейно — идеально для больших данных.
Тестирование и отладка
Добавьте книги:
В Main добавьте 10–15 книг с повторяющимися авторами (3–4 автора).
Протестируйте:
Вызовите countBooks() — проверьте размер.
calculateAverageYear() — посчитайте вручную и сравните.
findMostProductiveAuthor() — проверьте, кто лидер.
findTwoLeastProductiveAuthors() — найдите двух с минимумом книг.
Отладка:
Breakpoint в циклах — смотрите map.size() и max/min.
Если авторы null — добавьте проверку.
Полезные советы для новичков
Один проход: Всегда старайтесь решать за O(n) — эффективно и просто.
HashMap для подсчета: Лучший способ для частот.
Null: Проверяйте author != null.
Точность среднего: Используйте double.
Расширение: Добавьте метод topAuthors(int n) — используйте PriorityQueue.
Практическое задание
Задача 1: Добавьте метод getBooksCountByAuthor(String author) — использует map для подсчета.
Задача 2: Реализуйте findAuthorsWithMoreThan(int count) — возвращает List<String> авторов с >count книг.
Задача 3: В Main добавьте 20 книг, вызовите все методы — проверьте результаты.
#Java #для_новичков #beginner #algorithm #Практика
Сложность всех задач:
Подсчет количества и среднего года: O(n) — один проход по списку.
Самый плодовитый автор: O(n) — один проход + O(n) на поиск max в map (всего O(n)).
Два наименьших: O(n) — один проход + O(n) на поиск двух min (всего O(n)).
Почему не нужна сортировка:
Сортировка — O(n log n), но мы решаем задачу за O(n).
Для max/min достаточно одного прохода с переменными (или map).
Сортировка нужна только для полного упорядочивания (например, топ-10).
Что изменится при увеличении данных в 1000 раз:
Исходный n = 1000 книг → O(n) = 1000 операций.
n = 1 000 000 книг → O(n) = 1 млн операций — всё равно быстро (миллисекунды на современном ПК).
O(n log n) сортировка на 1 млн — ~20 млн операций — в 20 раз медленнее.
Память: HashMap — O(n) для авторов (если авторов много — тоже O(n)).
Вывод: O(n) алгоритмы масштабируются линейно — идеально для больших данных.
Тестирование и отладка
Добавьте книги:
В Main добавьте 10–15 книг с повторяющимися авторами (3–4 автора).
Протестируйте:
Вызовите countBooks() — проверьте размер.
calculateAverageYear() — посчитайте вручную и сравните.
findMostProductiveAuthor() — проверьте, кто лидер.
findTwoLeastProductiveAuthors() — найдите двух с минимумом книг.
Отладка:
Breakpoint в циклах — смотрите map.size() и max/min.
Если авторы null — добавьте проверку.
Полезные советы для новичков
Один проход: Всегда старайтесь решать за O(n) — эффективно и просто.
HashMap для подсчета: Лучший способ для частот.
Null: Проверяйте author != null.
Точность среднего: Используйте double.
Расширение: Добавьте метод topAuthors(int n) — используйте PriorityQueue.
Практическое задание
Задача 1: Добавьте метод getBooksCountByAuthor(String author) — использует map для подсчета.
Задача 2: Реализуйте findAuthorsWithMoreThan(int count) — возвращает List<String> авторов с >count книг.
Задача 3: В Main добавьте 20 книг, вызовите все методы — проверьте результаты.
#Java #для_новичков #beginner #algorithm #Практика
👍2🔥1
Что выведет код?
#Tasks
import java.util.List;
public class Task160126 {
public static void main(String[] args) {
List<String> data = List.of("apple", "banana");
boolean result = data.stream()
.filter(s -> s.length() > 10)
.allMatch(s -> {
System.out.print("check ");
return s.startsWith("a");
});
System.out.print(result);
}
}
#Tasks
👍1
😱1
Почему Entity нельзя напрямую отдавать в REST? 🤓
Ответ:
Entity привязаны к persistence-контексту, содержат ленивые связи и аннотации ORM.
Это приводит к N+1, LazyInitializationException и утечке внутренней модели. DTO решают эти проблемы.
#собеседование
Ответ:
Это приводит к N+1, LazyInitializationException и утечке внутренней модели. DTO решают эти проблемы.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🍾3
История IT-технологий сегодня — 17 января
ℹ️ Кто родился в этот день
Анита Борг (англ. Anita Borg Naffz; 17 января 1949 — 6 апреля 2003) — американская учёная в области компьютерных технологий и вычислений. Анита родилась в Чикаго, штат Иллинойс, росла в Палатине, штат Иллинойс, а затем в Kaneohe на Гавайях и в Мукилтео (Mukilteo), Вашингтон. Основала Институт женщин и технологий (ныне AnitaB.org) и конференцию Grace Hopper Celebration. Она работала над операционными системами и высокопроизводительными вычислениями в Digital Equipment Corp (DEC), занимаясь вопросами архитектуры памяти.
Бе́нджамин Фра́нклин (англ. Benjamin Franklin [ˈbɛndʒəmɪn ˈfɹæŋklɪn]; 17 января 1706, Бостон, Провинция Массачусетс-Бэй, Британская империя — 17 апреля 1790, Филадельфия, Пенсильвания, США) — американский политический деятель, дипломат, изобретатель, учёный, философ, писатель, масон, полимат. Одна из самых влиятельных фигур XVIII века. Его эксперименты с электричеством привели к открытию закона сохранения заряда и введению терминов «положительный» и «отрицательный». Вся современная двоичная логика и работа транзисторов физически базируются на концепции заряда, предложенной Франклином.
🌐 Знаковые события
1969 — Возвращение корабля «Союз-4». После первой в истории успешной стыковки и перехода экипажа, 17 января Владимир Шаталов успешно приземлился. Это был триумф советской космической программы, доказавший возможность сборки станций на орбите.
#Biography #Birth_Date #Events #17Января
Анита Борг (англ. Anita Borg Naffz; 17 января 1949 — 6 апреля 2003) — американская учёная в области компьютерных технологий и вычислений. Анита родилась в Чикаго, штат Иллинойс, росла в Палатине, штат Иллинойс, а затем в Kaneohe на Гавайях и в Мукилтео (Mukilteo), Вашингтон. Основала Институт женщин и технологий (ныне AnitaB.org) и конференцию Grace Hopper Celebration. Она работала над операционными системами и высокопроизводительными вычислениями в Digital Equipment Corp (DEC), занимаясь вопросами архитектуры памяти.
Бе́нджамин Фра́нклин (англ. Benjamin Franklin [ˈbɛndʒəmɪn ˈfɹæŋklɪn]; 17 января 1706, Бостон, Провинция Массачусетс-Бэй, Британская империя — 17 апреля 1790, Филадельфия, Пенсильвания, США) — американский политический деятель, дипломат, изобретатель, учёный, философ, писатель, масон, полимат. Одна из самых влиятельных фигур XVIII века. Его эксперименты с электричеством привели к открытию закона сохранения заряда и введению терминов «положительный» и «отрицательный». Вся современная двоичная логика и работа транзисторов физически базируются на концепции заряда, предложенной Франклином.
1969 — Возвращение корабля «Союз-4». После первой в истории успешной стыковки и перехода экипажа, 17 января Владимир Шаталов успешно приземлился. Это был триумф советской космической программы, доказавший возможность сборки станций на орбите.
#Biography #Birth_Date #Events #17Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
С 10.01 по 16.01
Предыдущий пост(с 27.12 по 09.01)
Воскресный мотивационный пост:
не было мотивации
Запись встреч/видео:
Telegram AI Bot. Версия Telegram API 9.3+
Обучающие статьи:
Java:
Раздел 7. Алгоритмы
Глава 1: Основы анализа алгоритмов
Пространственная сложность и компромиссы
Линейный поиск и его ниша
Агрегация за один проход: максимум эффективности
Практика
Глубокая архитектура и внутреннее устройство RabbitMQ
Обработка ошибок и мониторинг RabbitMQ
Полезные статьи и видео:
ПОДКЛЮЧЕНИЕ GPT GO на ГОД!
Осознанная стоимость абстракций: Autoboxing в современной Java
Перевод Spring Boot приложения с HTTP на HTTPS без ругани браузера
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Предыдущий пост(с 27.12 по 09.01)
Воскресный мотивационный пост:
не было мотивации
Запись встреч/видео:
Telegram AI Bot. Версия Telegram API 9.3+
Обучающие статьи:
Java:
Раздел 7. Алгоритмы
Глава 1: Основы анализа алгоритмов
Пространственная сложность и компромиссы
Линейный поиск и его ниша
Агрегация за один проход: максимум эффективности
Практика
Глубокая архитектура и внутреннее устройство RabbitMQ
Обработка ошибок и мониторинг RabbitMQ
Полезные статьи и видео:
ПОДКЛЮЧЕНИЕ GPT GO на ГОД!
Осознанная стоимость абстракций: Autoboxing в современной Java
Перевод Spring Boot приложения с HTTP на HTTPS без ругани браузера
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍3 1
История IT-технологий сегодня — 18 января
ℹ️ Кто родился в этот день
Рэй Милтон Долби (англ. Ray Milton Dolby; 18 января 1933, Портленд — 12 сентября 2013, Сан-Франциско) — американский инженер и изобретатель. Вошёл в историю как разработчик системы шумопонижения, получившей его имя. Логотип Dolby значился на миллионах единиц звукозаписывающего оборудования и аудиокассет, производившихся в мире на протяжении нескольких десятилетий.
🌐 Знаковые события
2012 — Википедия на одни сутки закрыла доступ к своему англоязычному сайту в знак протеста против обсуждаемого в США законопроекта о борьбе с интернет-пиратством.
#Biography #Birth_Date #Events #18Января
Рэй Милтон Долби (англ. Ray Milton Dolby; 18 января 1933, Портленд — 12 сентября 2013, Сан-Франциско) — американский инженер и изобретатель. Вошёл в историю как разработчик системы шумопонижения, получившей его имя. Логотип Dolby значился на миллионах единиц звукозаписывающего оборудования и аудиокассет, производившихся в мире на протяжении нескольких десятилетий.
2012 — Википедия на одни сутки закрыла доступ к своему англоязычному сайту в знак протеста против обсуждаемого в США законопроекта о борьбе с интернет-пиратством.
#Biography #Birth_Date #Events #18Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
2. Миграции с Flyway и LiquiBase. Основы управления БД
Это не очередной tutorial по настройке Flyway. Это инженерный разбор двух подходов к управлению БД, с реальными примерами на Spring Boot и PostgreSQL.
Я покажу:
🔹 Почему @Entity ≠ схема БД и чем это опасно на проде
🔹 Как Hibernate "ломает" данные при ddl-auto=update (живая демонстрация с падением!)
🔹 Полное сравнение Flyway vs Liquibase — философия, плюсы, минусы
🔹 REAL-WORLD примеры миграций для существующего проекта OrderHub
🔹 Ошибки, с которыми столкнулся лично я, и как их исправить
🔹 И немного дебага как всегда)
Исходный код проекта на GitHub очень ждет Ваших звезд.
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Это не очередной tutorial по настройке Flyway. Это инженерный разбор двух подходов к управлению БД, с реальными примерами на Spring Boot и PostgreSQL.
Я покажу:
🔹 Почему @Entity ≠ схема БД и чем это опасно на проде
🔹 Как Hibernate "ломает" данные при ddl-auto=update (живая демонстрация с падением!)
🔹 Полное сравнение Flyway vs Liquibase — философия, плюсы, минусы
🔹 REAL-WORLD примеры миграций для существующего проекта OrderHub
🔹 Ошибки, с которыми столкнулся лично я, и как их исправить
🔹 И немного дебага как всегда)
Исходный код проекта на GitHub очень ждет Ваших звезд.
Ссылка на Youtube
Ссылка на Рутьюб
Смотрите, ставьте лайки, подписывайтесь на каналы!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2 1
История IT-технологий сегодня — 19 января
ℹ️ Кто родился в этот день
Леони́д Вита́льевич Канторо́вич (19 января 1912[9], Санкт-Петербург — 7 апреля 1986, Москва) — советский математик и экономист, один из создателей линейного программирования. Лауреат премии по экономике памяти Альфреда Нобеля 1975 года «за вклад в теорию оптимального распределения ресурсов». Академик АН СССР (1964), доктор физико-математических наук (1935), профессор.
🌐 Знаковые события
1978 — основан институт Санкт-Петербургский институт информатики и автоматизации РАН.
1983 — Apple представила один из первых персональных компьютеров с графическим интерфейсом (GUI) и мышью. Несмотря на коммерческий провал из-за цены в $10 000, именно Lisa проложила путь для Macintosh и Windows. Она ввела такие понятия, как «рабочий стол», «иконки» и «окна».
#Biography #Birth_Date #Events #19Января
Леони́д Вита́льевич Канторо́вич (19 января 1912[9], Санкт-Петербург — 7 апреля 1986, Москва) — советский математик и экономист, один из создателей линейного программирования. Лауреат премии по экономике памяти Альфреда Нобеля 1975 года «за вклад в теорию оптимального распределения ресурсов». Академик АН СССР (1964), доктор физико-математических наук (1935), профессор.
1978 — основан институт Санкт-Петербургский институт информатики и автоматизации РАН.
1983 — Apple представила один из первых персональных компьютеров с графическим интерфейсом (GUI) и мышью. Несмотря на коммерческий провал из-за цены в $10 000, именно Lisa проложила путь для Macintosh и Windows. Она ввела такие понятия, как «рабочий стол», «иконки» и «окна».
#Biography #Birth_Date #Events #19Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 7. Алгоритмы
Глава 3: Алгоритмы сортировки и подготовка данных
Назначение и стоимость сортировки: стратегическая инвестиция в данные
Сортировка — это процесс упорядочивания элементов согласно определенному критерию сравнения. Это одна из наиболее изученных и практически значимых операций в информатике, чья важность простирается далеко за пределы простого упорядочивания. Основные цели сортировки можно разделить на три категории.
Ускорение поиска
Главное практическое применение сортировки — обеспечение быстрого поиска. Неотсортированные данные допускают только линейный поиск с временной сложностью O(n). После сортировки становится возможным бинарный поиск, сокращающий время до O(log n). Это преобразует поиск из линейной в логарифмическую операцию, что для миллиона элементов означает сокращение с миллиона сравнений до всего 20.
Улучшение представления данных
Сортировка делает данные понятными для человека. Пользовательские интерфейсы, отчеты, лог-файлы — везде отсортированные данные воспринимаются легче. Сортировка по алфавиту, дате, приоритету или релевантности — это не техническая необходимость, а требование человеко-компьютерного взаимодействия.
Обеспечение группировки и агрегации
Сортировка является предварительным шагом для многих алгоритмов анализа данных.
После сортировки идентичные или схожие элементы располагаются рядом, что упрощает:
Удаление дубликатов за один проход
Построение гистограмм и частотных распределений
Выполнение операций слияния (как в MergeSort)
Реализацию алгоритмов слияния интервалов или поиска пересечений
Сортировка как стратегическая инвестиция
Сортировку можно рассматривать как инвестицию с отложенной выгодой. Мы платим относительно высокую первоначальную цену — O(n log n) операций — чтобы получить ускорение в будущих операциях. Эта модель окупается, когда количество операций поиска значительно превышает единицу.
Рассмотрим математическую модель:
Стоимость сортировки: C₁ × n log n
Стоимость одного линейного поиска: C₂ × n
Стоимость одного бинарного поиска: C₃ × log n
Точка безубыточности наступает, когда k операций бинарного поиска после сортировки становятся выгоднее k операций линейного поиска без сортировки:
C₁ × n log n + k × C₃ × log n < k × C₂ × n
Для типичных значений (n=1000, C₁≈C₂≈C₃) получаем, что уже при 10-15 операциях поиска сортировка окупается.
Оптимизация для повторного использования
Отсортированные данные становятся активом, который можно многократно использовать для различных целей.
Один раз отсортировав массив сотрудников по фамилии, мы получаем возможность:
Быстрого поиска конкретного сотрудника
Генерации алфавитного списка
Поиска сотрудников в заданном алфавитном диапазоне
Объединения с другим отсортированным списком
Это преобразует данные из пассивного состояния в активную структуру, поддерживающую множество операций.
#Java #для_новичков #beginner #algorithm #sorted
Глава 3: Алгоритмы сортировки и подготовка данных
Назначение и стоимость сортировки: стратегическая инвестиция в данные
Сортировка — это процесс упорядочивания элементов согласно определенному критерию сравнения. Это одна из наиболее изученных и практически значимых операций в информатике, чья важность простирается далеко за пределы простого упорядочивания. Основные цели сортировки можно разделить на три категории.
Ускорение поиска
Главное практическое применение сортировки — обеспечение быстрого поиска. Неотсортированные данные допускают только линейный поиск с временной сложностью O(n). После сортировки становится возможным бинарный поиск, сокращающий время до O(log n). Это преобразует поиск из линейной в логарифмическую операцию, что для миллиона элементов означает сокращение с миллиона сравнений до всего 20.
// Демонстрация разницы в поиске
public class SearchComparison {
// Линейный поиск в неотсортированном массиве
public static int linearSearch(int[] array, int target) {
for (int i = 0; i < array.length; i++) {
if (array[i] == target) return i;
}
return -1;
}
// Бинарный поиск в отсортированном массиве
public static int binarySearch(int[] sortedArray, int target) {
int left = 0, right = sortedArray.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (sortedArray[mid] == target) return mid;
if (sortedArray[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
}
Улучшение представления данных
Сортировка делает данные понятными для человека. Пользовательские интерфейсы, отчеты, лог-файлы — везде отсортированные данные воспринимаются легче. Сортировка по алфавиту, дате, приоритету или релевантности — это не техническая необходимость, а требование человеко-компьютерного взаимодействия.
Обеспечение группировки и агрегации
Сортировка является предварительным шагом для многих алгоритмов анализа данных.
После сортировки идентичные или схожие элементы располагаются рядом, что упрощает:
Удаление дубликатов за один проход
Построение гистограмм и частотных распределений
Выполнение операций слияния (как в MergeSort)
Реализацию алгоритмов слияния интервалов или поиска пересечений
Сортировка как стратегическая инвестиция
Сортировку можно рассматривать как инвестицию с отложенной выгодой. Мы платим относительно высокую первоначальную цену — O(n log n) операций — чтобы получить ускорение в будущих операциях. Эта модель окупается, когда количество операций поиска значительно превышает единицу.
Рассмотрим математическую модель:
Стоимость сортировки: C₁ × n log n
Стоимость одного линейного поиска: C₂ × n
Стоимость одного бинарного поиска: C₃ × log n
Точка безубыточности наступает, когда k операций бинарного поиска после сортировки становятся выгоднее k операций линейного поиска без сортировки:
C₁ × n log n + k × C₃ × log n < k × C₂ × n
Для типичных значений (n=1000, C₁≈C₂≈C₃) получаем, что уже при 10-15 операциях поиска сортировка окупается.
Оптимизация для повторного использования
Отсортированные данные становятся активом, который можно многократно использовать для различных целей.
Один раз отсортировав массив сотрудников по фамилии, мы получаем возможность:
Быстрого поиска конкретного сотрудника
Генерации алфавитного списка
Поиска сотрудников в заданном алфавитном диапазоне
Объединения с другим отсортированным списком
Это преобразует данные из пассивного состояния в активную структуру, поддерживающую множество операций.
#Java #для_новичков #beginner #algorithm #sorted
👍4
Кэш-дружественность отсортированных данных
Современные процессоры сильно зависят от кэш-памяти. Отсортированные данные обладают лучшей пространственной локальностью: последовательные обращения к памяти с высокой вероятностью попадают в кэш. Это особенно важно для итеративных алгоритмов, где каждый проход по отсортированным данным выполняется на 20-40% быстрее благодаря уменьшению количества кэш-промахов.
Устойчивость сортировки: концепция и практическая ценность
Сортировка называется устойчивой (stable), если она сохраняет относительный порядок элементов с одинаковыми ключами. Формально: если до сортировки элемент A предшествовал элементу B, и их ключи сортировки равны, то после сортировки A останется перед B.
Практический пример: многоуровневая сортировка
Рассмотрим каталог книг с полями: автор, год издания, название. Требуется отсортировать книги по автору, а внутри каждого автора — по году издания.
Без устойчивой сортировки задача требует сложной логики:
С устойчивой сортировкой решение элегантно:
Устойчивость гарантирует, что результат двух последовательных сортировок эквивалентен сортировке составным ключом.
Где устойчивость критически важна
Визуализация данных: При построении графиков, где элементы должны сохранять дополнительную атрибутику после сортировки по значению.
Транзакционные системы: В финансовых приложениях, где порядок одинаковых транзакций должен сохраняться согласно времени поступления.
Обработка последовательностей: В биоинформатике при анализе геномных данных, где относительный порядок элементов с одинаковым весом несет смысловую нагрузку.
Инкрементальная сортировка: При добавлении новых элементов в уже отсортированную коллекцию и последующей повторной сортировке.
Цена устойчивости
Устойчивость обычно достигается за счет:
Дополнительной памяти (как в MergeSort)
Более сложных алгоритмов сравнения
Незначительного увеличения времени выполнения
Неустойчивые алгоритмы (как QuickSort или HeapSort) часто быстрее и используют меньше памяти, но требуют осторожности при работе с составными ключами.
Количественная оценка стоимости сортировки
Стоимость сортировки можно амортизировать на все последующие операции.
Для коллекции из n элементов, над которой выполняется m операций поиска:
Без сортировки: Суммарная стоимость = m × O(n) = O(m × n)
С сортировкой: Суммарная стоимость = O(n log n) + m × O(log n)
Разница становится существенной при m > log n. Для n=1000 (log n ≈ 10) уже при 11 поисках сортировка окупается.
Влияние на системную архитектуру
Решение о предварительной сортировке влияет на проектирование систем:
Пакетная обработка: Сортировка выполняется один раз при загрузке данных, затем используется для множества запросов.
Интерактивные системы: Для часто изменяющихся данных поддерживается индексированная структура (как B-дерево), которая обеспечивает и сортировку, и быстрый поиск.
Распределенные системы: Данные распределяются между узлами уже отсортированными (shard-ключи), что позволяет выполнять параллельный поиск.
#Java #для_новичков #beginner #algorithm #sorted
Современные процессоры сильно зависят от кэш-памяти. Отсортированные данные обладают лучшей пространственной локальностью: последовательные обращения к памяти с высокой вероятностью попадают в кэш. Это особенно важно для итеративных алгоритмов, где каждый проход по отсортированным данным выполняется на 20-40% быстрее благодаря уменьшению количества кэш-промахов.
Устойчивость сортировки: концепция и практическая ценность
Сортировка называется устойчивой (stable), если она сохраняет относительный порядок элементов с одинаковыми ключами. Формально: если до сортировки элемент A предшествовал элементу B, и их ключи сортировки равны, то после сортировки A останется перед B.
Практический пример: многоуровневая сортировка
Рассмотрим каталог книг с полями: автор, год издания, название. Требуется отсортировать книги по автору, а внутри каждого автора — по году издания.
Без устойчивой сортировки задача требует сложной логики:
// Сложный компаратор для неустойчивой сортировки
Comparator<Book> complexComparator = Comparator
.comparing(Book::getAuthor)
.thenComparing(Book::getYear);
books.sort(complexComparator); // Работает, но если сортировка неустойчива,
// порядок внутри автора может нарушиться
С устойчивой сортировкой решение элегантно:
// Сначала сортируем по вторичному ключу
books.sort(Comparator.comparing(Book::getYear));
// Затем сортируем по основному ключу
books.sort(Comparator.comparing(Book::getAuthor));
// После второй сортировки порядок годов сохранится для каждого автора
// благодаря устойчивости
Устойчивость гарантирует, что результат двух последовательных сортировок эквивалентен сортировке составным ключом.
Где устойчивость критически важна
Визуализация данных: При построении графиков, где элементы должны сохранять дополнительную атрибутику после сортировки по значению.
Транзакционные системы: В финансовых приложениях, где порядок одинаковых транзакций должен сохраняться согласно времени поступления.
Обработка последовательностей: В биоинформатике при анализе геномных данных, где относительный порядок элементов с одинаковым весом несет смысловую нагрузку.
Инкрементальная сортировка: При добавлении новых элементов в уже отсортированную коллекцию и последующей повторной сортировке.
Цена устойчивости
Устойчивость обычно достигается за счет:
Дополнительной памяти (как в MergeSort)
Более сложных алгоритмов сравнения
Незначительного увеличения времени выполнения
Неустойчивые алгоритмы (как QuickSort или HeapSort) часто быстрее и используют меньше памяти, но требуют осторожности при работе с составными ключами.
Количественная оценка стоимости сортировки
Стоимость сортировки можно амортизировать на все последующие операции.
Для коллекции из n элементов, над которой выполняется m операций поиска:
Без сортировки: Суммарная стоимость = m × O(n) = O(m × n)
С сортировкой: Суммарная стоимость = O(n log n) + m × O(log n)
Разница становится существенной при m > log n. Для n=1000 (log n ≈ 10) уже при 11 поисках сортировка окупается.
Влияние на системную архитектуру
Решение о предварительной сортировке влияет на проектирование систем:
Пакетная обработка: Сортировка выполняется один раз при загрузке данных, затем используется для множества запросов.
Интерактивные системы: Для часто изменяющихся данных поддерживается индексированная структура (как B-дерево), которая обеспечивает и сортировку, и быстрый поиск.
Распределенные системы: Данные распределяются между узлами уже отсортированными (shard-ключи), что позволяет выполнять параллельный поиск.
#Java #для_новичков #beginner #algorithm #sorted
👍5
Компромисс: сортировка vs индексация
Сортировка — не единственный способ ускорить поиск. Альтернатива — построение индекса (например, хеш-таблицы).
Сравнение:
Сортировка: O(n log n) времени, O(1) дополнительной памяти (in-place), поддерживает диапазонные запросы
Хеширование: O(n) времени, O(n) дополнительной памяти, точечный доступ O(1), нет поддержки диапазонов
Выбор зависит от паттерна доступа: частые диапазонные запросы требуют сортировки, точечные — хеширования.
Практические рекомендации
Когда сортировать данные
Предварительная сортировка: Когда известно, что данные будут многократно использоваться для поиска или анализа.
Кэширование отсортированных представлений: Хранить данные в основной форме, но создавать отсортированные копии для частых запросов.
Ленивая сортировка: Откладывать сортировку до первого запроса, требующего порядка.
Когда избегать сортировки
Единичные операции: Если требуется одна операция поиска, линейный поиск может быть эффективнее.
Частые модификации: При постоянных добавлениях/удалениях поддержание отсортированного состояния требует дополнительных затрат.
Ограниченные ресурсы: На устройствах с ограниченной памятью in-place сортировка предпочтительнее, но может быть слишком дорогой по времени.
Выбор алгоритма сортировки
Критерии выбора:
Устойчивость: Нужна ли сохранение относительного порядка?
Память: Доступна ли дополнительная память O(n)?
Время: Важна ли гарантия O(n log n) в худшем случае?
Данные: Частично отсортированы ли данные?
#Java #для_новичков #beginner #algorithm #sorted
Сортировка — не единственный способ ускорить поиск. Альтернатива — построение индекса (например, хеш-таблицы).
Сравнение:
Сортировка: O(n log n) времени, O(1) дополнительной памяти (in-place), поддерживает диапазонные запросы
Хеширование: O(n) времени, O(n) дополнительной памяти, точечный доступ O(1), нет поддержки диапазонов
Выбор зависит от паттерна доступа: частые диапазонные запросы требуют сортировки, точечные — хеширования.
Практические рекомендации
Когда сортировать данные
Предварительная сортировка: Когда известно, что данные будут многократно использоваться для поиска или анализа.
Кэширование отсортированных представлений: Хранить данные в основной форме, но создавать отсортированные копии для частых запросов.
Ленивая сортировка: Откладывать сортировку до первого запроса, требующего порядка.
Когда избегать сортировки
Единичные операции: Если требуется одна операция поиска, линейный поиск может быть эффективнее.
Частые модификации: При постоянных добавлениях/удалениях поддержание отсортированного состояния требует дополнительных затрат.
Ограниченные ресурсы: На устройствах с ограниченной памятью in-place сортировка предпочтительнее, но может быть слишком дорогой по времени.
Выбор алгоритма сортировки
Критерии выбора:
Устойчивость: Нужна ли сохранение относительного порядка?
Память: Доступна ли дополнительная память O(n)?
Время: Важна ли гарантия O(n log n) в худшем случае?
Данные: Частично отсортированы ли данные?
#Java #для_новичков #beginner #algorithm #sorted
👍6
Что выведет код?
#Tasks
import java.util.*;
public class Task190126 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 2, 9, 1, 5, 6);
Comparator<Integer> comparator = (a, b) -> {
if (a % 2 == b % 2) return 0;
return a % 2 == 0 ? -1 : 1;
};
Collections.sort(list, comparator);
System.out.println(list);
}
}
#Tasks
👍3
Варианты ответа:
Anonymous Quiz
28%
[2, 6, 5, 9, 1, 5]
28%
[5, 2, 9, 1, 5, 6]
22%
[1, 2, 5, 5, 6, 9]
22%
Исключение IllegalArgumentException
🤯3
Что такое idempotency и зачем она нужна? 🤓
Ответ:
Идемпотентная операция даёт одинаковый результат при повторном выполнении.
Это критично для REST, retries и distributed systems.
Например, повторный POST без идемпотентности может создать дубликаты.
#собеседование
Ответ:
Это критично для REST, retries и distributed systems.
Например, повторный POST без идемпотентности может создать дубликаты.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
История IT-технологий сегодня — 20 января
ℹ️ Кто родился в этот день
Уильям Ральф Райт (англ. William Ralph Wright, род. 20 января 1960 года, Атланта, Джорджия, США) — американский разработчик и дизайнер компьютерных игр, основатель компании по разработке игр Maxis, а позднее — и компании Syntertainment. Получил наибольшую известность как первоначальный дизайнер популярных компьютерных игр SimCity, The Sims и Spore. Был удостоен премии BAFTA.
Андре́-Мари́ Ампе́р (фр. André-Marie Ampère; 20 января 1775 — 10 июня 1836) — французский физик, математик и естествоиспытатель. Джеймс Максвелл назвал Ампера «Ньютоном электричества». Ампер создал первую теорию, которая выражала связь электрических и магнитных явлений, ввёл в физику понятие электрического тока и проницательно предположил, что магнетизм вызван электрическими токами «на молекулярном уровне». Внёс значительный вклад в механику, теорию вероятностей, математический анализ.
Кэндзиро Такаянаги (яп. 高柳 健次郎 Такаянаги Кэндзиро:, 20 января 1899, Хамамацу — 23 июля 1990, Йокосука) — японский конструктор, создатель первого в мире полностью электронного телеприёмника. Увлёкся телевидением в 1925 году после прочтения во французском журнале статьи о новой технологии. Уже в 1926 году доктор Такаянаги впервые в мире при помощи электронно-лучевой трубки продемонстрировал изображение каны イ. После Второй мировой войны Такаянаги пришёл в компанию JVC, где занимал должность вице-президента.
А еще наш один из самых первых подписчиков - @RumEvo. С днем рождения🎉
🌐 Знаковые события
1960 — осуществлён первый пуск межконтинентальной баллистической ракеты Р-7А на предельную дальность в район Тихого океана. Принятие ракеты на вооружение.
#Biography #Birth_Date #Events #20Января
Уильям Ральф Райт (англ. William Ralph Wright, род. 20 января 1960 года, Атланта, Джорджия, США) — американский разработчик и дизайнер компьютерных игр, основатель компании по разработке игр Maxis, а позднее — и компании Syntertainment. Получил наибольшую известность как первоначальный дизайнер популярных компьютерных игр SimCity, The Sims и Spore. Был удостоен премии BAFTA.
Андре́-Мари́ Ампе́р (фр. André-Marie Ampère; 20 января 1775 — 10 июня 1836) — французский физик, математик и естествоиспытатель. Джеймс Максвелл назвал Ампера «Ньютоном электричества». Ампер создал первую теорию, которая выражала связь электрических и магнитных явлений, ввёл в физику понятие электрического тока и проницательно предположил, что магнетизм вызван электрическими токами «на молекулярном уровне». Внёс значительный вклад в механику, теорию вероятностей, математический анализ.
Кэндзиро Такаянаги (яп. 高柳 健次郎 Такаянаги Кэндзиро:, 20 января 1899, Хамамацу — 23 июля 1990, Йокосука) — японский конструктор, создатель первого в мире полностью электронного телеприёмника. Увлёкся телевидением в 1925 году после прочтения во французском журнале статьи о новой технологии. Уже в 1926 году доктор Такаянаги впервые в мире при помощи электронно-лучевой трубки продемонстрировал изображение каны イ. После Второй мировой войны Такаянаги пришёл в компанию JVC, где занимал должность вице-президента.
А еще наш один из самых первых подписчиков - @RumEvo. С днем рождения
1960 — осуществлён первый пуск межконтинентальной баллистической ракеты Р-7А на предельную дальность в район Тихого океана. Принятие ракеты на вооружение.
#Biography #Birth_Date #Events #20Января
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🍾1
Как вы считаете, стоит ли мне настроить выпуск свежих видео и статей сначала на чем-то типа boosty, чтобы заработать шекелей, а потом и везде, или я просто охуел от наглости и таких мыслей?
Anonymous Poll
28%
Да ты охуел!
52%
Не, а что правильно, за труд можно и попросить плату.
20%
Мне похер, я не понимаю, что я тут делаю
🔥1👾1
Раздел 7. Алгоритмы
Глава 3: Алгоритмы сортировки и подготовка данных
Квадратичные сортировки: фундамент понимания
Классические алгоритмы O(n²)
Квадратичные сортировки представляют собой интеллектуальную основу для понимания более сложных алгоритмов. Их простота позволяет ясно увидеть фундаментальные принципы упорядочивания данных.
Пузырьковая сортировка (Bubble Sort)
Принцип работы: алгоритм последовательно сравнивает соседние элементы и меняет их местами, если они находятся в неправильном порядке. За каждый проход наибольший "всплывающий" элемент занимает свою окончательную позицию.
Характеристики:
Временная сложность: O(n²) в худшем и среднем случае
Пространственная сложность: O(1) (in-place)
Устойчивость: да (не меняет порядок равных элементов)
Особенность: после k итераций последние k элементов находятся на своих местах
Оптимизация: добавление флага прекращает выполнение, если на проходе не было обменов. Для уже отсортированного массива это дает O(n).
Сортировка выбором (Selection Sort)
Принцип работы: алгоритм делит массив на отсортированную и неотсортированную части. На каждом шаге он находит минимальный элемент в неотсортированной части и перемещает его в конец отсортированной.
Характеристики:
Временная сложность: всегда O(n²) независимо от исходных данных
Количество сравнений: n(n-1)/2
Количество обменов: n-1 (минимальное среди квадратичных алгоритмов)
Устойчивость: нет (может менять порядок равных элементов)
Преимущество: минимальное количество операций записи, что важно для устройств с ограниченным ресурсом записи (например, флеш-память)
Сортировка вставками (Insertion Sort)
Принцип работы: алгоритм строит отсортированную последовательность постепенно, вставляя каждый новый элемент в правильную позицию относительно уже отсортированной части.
Характеристики:
Временная сложность: O(n²) в худшем случае, O(n) в лучшем (уже отсортированный массив)
Количество сравнений: от n-1 до n(n-1)/2
Количество обменов: от 0 до n(n-1)/2
Устойчивость: да
Особенность: эффективен на небольших наборах данных (n < 50) и почти отсортированных массивах
Адаптивность сортировки вставками
Эффективность на почти отсортированных данных
Сортировка вставками обладает свойством адаптивности: ее время выполнения зависит от степени упорядоченности входных данных. Для массива, в котором каждый элемент находится не более чем на k позиций от своего окончательного места, сложность составляет O(nk).
На практически отсортированных данных (k мало) алгоритм приближается к линейному времени.
#Java #для_новичков #beginner #algorithm #sorted
Глава 3: Алгоритмы сортировки и подготовка данных
Квадратичные сортировки: фундамент понимания
Классические алгоритмы O(n²)
Квадратичные сортировки представляют собой интеллектуальную основу для понимания более сложных алгоритмов. Их простота позволяет ясно увидеть фундаментальные принципы упорядочивания данных.
Пузырьковая сортировка (Bubble Sort)
Принцип работы: алгоритм последовательно сравнивает соседние элементы и меняет их местами, если они находятся в неправильном порядке. За каждый проход наибольший "всплывающий" элемент занимает свою окончательную позицию.
public class BubbleSort {
public static void sort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// Обмен элементов
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}Характеристики:
Временная сложность: O(n²) в худшем и среднем случае
Пространственная сложность: O(1) (in-place)
Устойчивость: да (не меняет порядок равных элементов)
Особенность: после k итераций последние k элементов находятся на своих местах
Оптимизация: добавление флага прекращает выполнение, если на проходе не было обменов. Для уже отсортированного массива это дает O(n).
Сортировка выбором (Selection Sort)
Принцип работы: алгоритм делит массив на отсортированную и неотсортированную части. На каждом шаге он находит минимальный элемент в неотсортированной части и перемещает его в конец отсортированной.
public class SelectionSort {
public static void sort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
// Обмен текущего элемента с минимальным
int temp = arr[minIdx];
arr[minIdx] = arr[i];
arr[i] = temp;
}
}
}Характеристики:
Временная сложность: всегда O(n²) независимо от исходных данных
Количество сравнений: n(n-1)/2
Количество обменов: n-1 (минимальное среди квадратичных алгоритмов)
Устойчивость: нет (может менять порядок равных элементов)
Преимущество: минимальное количество операций записи, что важно для устройств с ограниченным ресурсом записи (например, флеш-память)
Сортировка вставками (Insertion Sort)
Принцип работы: алгоритм строит отсортированную последовательность постепенно, вставляя каждый новый элемент в правильную позицию относительно уже отсортированной части.
public class InsertionSort {
public static void sort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
// Сдвигаем элементы, большие key, вправо
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
}Характеристики:
Временная сложность: O(n²) в худшем случае, O(n) в лучшем (уже отсортированный массив)
Количество сравнений: от n-1 до n(n-1)/2
Количество обменов: от 0 до n(n-1)/2
Устойчивость: да
Особенность: эффективен на небольших наборах данных (n < 50) и почти отсортированных массивах
Адаптивность сортировки вставками
Эффективность на почти отсортированных данных
Сортировка вставками обладает свойством адаптивности: ее время выполнения зависит от степени упорядоченности входных данных. Для массива, в котором каждый элемент находится не более чем на k позиций от своего окончательного места, сложность составляет O(nk).
На практически отсортированных данных (k мало) алгоритм приближается к линейному времени.
#Java #для_новичков #beginner #algorithm #sorted
👍5
Это делает его идеальным для:
Досортировки результатов предыдущих частичных сортировок
Поддержания порядка в динамически изменяемых коллекциях
Обработки потоковых данных, где новые элементы добавляются к уже отсортированной последовательности
Механизм адаптации
Алгоритм эффективен благодаря двум свойствам:
Локальность: при вставке нового элемента перемещения происходят только в его окрестности
Инкрементальность: каждая итерация поддерживает частично отсортированное состояние
Для уже отсортированного массива внутренний цикл while никогда не выполняется, и алгоритм делает ровно n-1 сравнение.
Применение в современных гибридных алгоритмах
Timsort: промышленный стандарт
Timsort — гибридный алгоритм, используемый в Python, Java (для массивов объектов), Android и V8. Он сочетает сортировку вставками и слиянием, демонстрируя эволюцию простых алгоритмов в промышленные решения.
В Timsort сортировка вставками применяется для:
Создания минимальных упорядоченных сегментов (run)
Досортировки мелких подмассивов (обычно до 32-64 элементов)
Причины выбора сортировки вставками для мелких массивов
Низкие константы: У сортировки вставками небольшие накладные расходы по сравнению с рекурсивными алгоритмами
Кэш-дружественность: Последовательный доступ к памяти хорошо работает с кэшем процессора
Адаптивность: На почти отсортированных данных она работает быстрее теоретически более быстрых алгоритмов
Другие гибридные применения
Introsort: использует быструю сортировку, но переключается на пирамидальную при глубокой рекурсии, а для маленьких подмассивов — на сортировку вставками
Сортировка Шелла: использует идею сортировки вставками, но сравнивает элементы, отстоящие далеко друг от друга, постепенно уменьшая шаг
Педагогическая ценность квадратичных алгоритмов
Квадратичные сортировки служат идеальной точкой входа в изучение алгоритмов по нескольким причинам:
Наглядность: Принципы работы можно понять без сложной математики
Полнота: Охватывают основные стратегии: сравнение соседей (пузырьковая), поиск минимума (выбором), вставка в упорядоченную последовательность (вставками)
Естественность: Сортировка вставками соответствует тому, как люди обычно упорядочивают карты в руке
Нижняя планка эффективности
Эти алгоритмы устанавливают базовый уровень, от которого можно измерять прогресс. Понимание, почему O(n²) неприемлемо для больших n, мотивирует изучение более эффективных методов.
Для n=1000:
Квадратичная сортировка: ~1,000,000 операций
Эффективная сортировка (n log n): ~10,000 операций
Разница в 100 раз становится критичной при масштабировании
Развитие алгоритмического мышления
Анализ квадратичных алгоритмов учит важным навыкам:
Анализ сложности: Понимание вложенных циклов и их стоимости
Оптимизация: Как небольшие изменения (флаг в пузырьковой) влияют на производительность
Адаптивность: Почему одни алгоритмы лучше работают на определенных данных
#Java #для_новичков #beginner #algorithm #sorted
Досортировки результатов предыдущих частичных сортировок
Поддержания порядка в динамически изменяемых коллекциях
Обработки потоковых данных, где новые элементы добавляются к уже отсортированной последовательности
Механизм адаптации
Алгоритм эффективен благодаря двум свойствам:
Локальность: при вставке нового элемента перемещения происходят только в его окрестности
Инкрементальность: каждая итерация поддерживает частично отсортированное состояние
Для уже отсортированного массива внутренний цикл while никогда не выполняется, и алгоритм делает ровно n-1 сравнение.
Применение в современных гибридных алгоритмах
Timsort: промышленный стандарт
Timsort — гибридный алгоритм, используемый в Python, Java (для массивов объектов), Android и V8. Он сочетает сортировку вставками и слиянием, демонстрируя эволюцию простых алгоритмов в промышленные решения.
В Timsort сортировка вставками применяется для:
Создания минимальных упорядоченных сегментов (run)
Досортировки мелких подмассивов (обычно до 32-64 элементов)
// Упрощенная концепция Timsort
public class TimsortConcept {
private static final int RUN = 32;
public static void timsort(int[] arr) {
// 1. Разбиваем на маленькие сегменты
for (int i = 0; i < arr.length; i += RUN) {
insertionSort(arr, i, Math.min(i + RUN - 1, arr.length - 1));
}
// 2. Сливаем сегменты попарно
// ... (реализация слияния)
}
// Оптимизированная сортировка вставками для диапазона
private static void insertionSort(int[] arr, int left, int right) {
for (int i = left + 1; i <= right; i++) {
int key = arr[i];
int j = i - 1;
// Используем бинарный поиск для нахождения позиции
int pos = binarySearch(arr, key, left, j);
// Сдвигаем элементы
while (j >= pos) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
}
Причины выбора сортировки вставками для мелких массивов
Низкие константы: У сортировки вставками небольшие накладные расходы по сравнению с рекурсивными алгоритмами
Кэш-дружественность: Последовательный доступ к памяти хорошо работает с кэшем процессора
Адаптивность: На почти отсортированных данных она работает быстрее теоретически более быстрых алгоритмов
Другие гибридные применения
Introsort: использует быструю сортировку, но переключается на пирамидальную при глубокой рекурсии, а для маленьких подмассивов — на сортировку вставками
Сортировка Шелла: использует идею сортировки вставками, но сравнивает элементы, отстоящие далеко друг от друга, постепенно уменьшая шаг
Педагогическая ценность квадратичных алгоритмов
Квадратичные сортировки служат идеальной точкой входа в изучение алгоритмов по нескольким причинам:
Наглядность: Принципы работы можно понять без сложной математики
Полнота: Охватывают основные стратегии: сравнение соседей (пузырьковая), поиск минимума (выбором), вставка в упорядоченную последовательность (вставками)
Естественность: Сортировка вставками соответствует тому, как люди обычно упорядочивают карты в руке
Нижняя планка эффективности
Эти алгоритмы устанавливают базовый уровень, от которого можно измерять прогресс. Понимание, почему O(n²) неприемлемо для больших n, мотивирует изучение более эффективных методов.
Для n=1000:
Квадратичная сортировка: ~1,000,000 операций
Эффективная сортировка (n log n): ~10,000 операций
Разница в 100 раз становится критичной при масштабировании
Развитие алгоритмического мышления
Анализ квадратичных алгоритмов учит важным навыкам:
Анализ сложности: Понимание вложенных циклов и их стоимости
Оптимизация: Как небольшие изменения (флаг в пузырьковой) влияют на производительность
Адаптивность: Почему одни алгоритмы лучше работают на определенных данных
#Java #для_новичков #beginner #algorithm #sorted
👍4
Что выведет код?
#Tasks
import java.util.Arrays;
import java.util.Comparator;
public class Task200126 {
public static void main(String[] args) {
Integer[] arr = {5, 2, 8, 1, 9};
Comparator<Integer> comp = (a, b) -> a % 2 - b % 2;
insertionSort200126(arr, comp);
System.out.println(Arrays.toString(arr));
}
static <T> void insertionSort200126(T[] arr, Comparator<T> comp) {
for (int i = 1; i < arr.length; i++) {
T key = arr[i];
int j = i - 1;
while (j >= 0 && comp.compare(arr[j], key) > 0) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
}
#Tasks
👍3
Варианты ответа:
Anonymous Quiz
33%
[1, 2, 5, 8, 9]
42%
[2, 8, 5, 1, 9]
17%
[1, 5, 9, 2, 8]
8%
[9, 8, 5, 2, 1]
👍3