Алгоритм рекурсивного лабиринта
Алгоритм рекурсивного лабиринта — один из лучших примеров алгоритмов обратного отслеживания.
Лабиринт — это территория, окруженная стенами; между ними у нас есть путь от начальной точки до конечной позиции. Нам нужно начать с начальной точки и двигаться к конечной точке. Проблема в выборе пути.
Если мы обнаружим какой-либо тупик перед конечной точкой, нам придется вернуться назад и изменить направление. Направление движения — север, восток, запад и юг. Нам придется продолжать «двигаться и возвращаться», пока не достигнем финальной точки.
Алгоритм рекурсивного лабиринта — один из лучших примеров алгоритмов обратного отслеживания.
Лабиринт — это территория, окруженная стенами; между ними у нас есть путь от начальной точки до конечной позиции. Нам нужно начать с начальной точки и двигаться к конечной точке. Проблема в выборе пути.
Если мы обнаружим какой-либо тупик перед конечной точкой, нам придется вернуться назад и изменить направление. Направление движения — север, восток, запад и юг. Нам придется продолжать «двигаться и возвращаться», пока не достигнем финальной точки.
Ориентация 3-х упорядоченных точек
Концепция, используемая для определения направления поворота этих точек. Эта концепция имеет решающее значение для таких задач, как определение того, образует ли набор точек выпуклый или вогнутый многоугольник, или для понимания относительного расположения точек.
Ориентация упорядоченной тройки точек на плоскости может быть:
⁃ Против часовой стрелки: математически ориентация является против часовой стрелки, если векторное произведение векторов AB и BC положительно.
⁃ По часовой стрелке: математически ориентация по часовой стрелке, если векторное произведение векторов AB и BC отрицательно.
⁃ Коллинеарность: Если ориентация коллинеарна, это означает, что точки A, B и C находятся на одной прямой. Математически ориентация коллинеарна, если векторное произведение векторов AB и BC равно нулю.
Сложность определение ориентации точек:
Концепция, используемая для определения направления поворота этих точек. Эта концепция имеет решающее значение для таких задач, как определение того, образует ли набор точек выпуклый или вогнутый многоугольник, или для понимания относительного расположения точек.
Ориентация упорядоченной тройки точек на плоскости может быть:
⁃ Против часовой стрелки: математически ориентация является против часовой стрелки, если векторное произведение векторов AB и BC положительно.
⁃ По часовой стрелке: математически ориентация по часовой стрелке, если векторное произведение векторов AB и BC отрицательно.
⁃ Коллинеарность: Если ориентация коллинеарна, это означает, что точки A, B и C находятся на одной прямой. Математически ориентация коллинеарна, если векторное произведение векторов AB и BC равно нулю.
Сложность определение ориентации точек:
O(1)Z-алгоритм
Алгоритм находит все вхождения шаблона в тексте.
Идея состоит в том, чтобы объединить шаблон и текст и создать строку «
Сложность:
Алгоритм находит все вхождения шаблона в тексте.
Идея состоит в том, чтобы объединить шаблон и текст и создать строку «
P$T», где P — это шаблон, $ — специальный символ, который не должен присутствовать в шаблоне и тексте, а T — это текст. Создайте массив Z для объединенной строки. В массиве Z, если значение Z в любой точке равно длине шаблона, то шаблон присутствует в этой точке.Сложность:
O(m + n), где длина текста равна n, а шаблона — mХеширование
— это процесс генерации выходных данных фиксированного размера из входных данных переменного размера с использованием математических формул, известных как хэш-функции.
Каждый день объем данных в Интернете увеличивается экспоненциально, поэтому нам нужна такая структура данных , которая может хранить эти данные и осуществлять операции с ними таким образом, чтобы это было эффективно.
Для этого идеально подходит хеш-таблицы! Их важное свойство состоит в том, что, при некоторых разумных допущениях, все три операции (добавление, удаление, поиск элемента) выполняются за время O(1).
— это процесс генерации выходных данных фиксированного размера из входных данных переменного размера с использованием математических формул, известных как хэш-функции.
Каждый день объем данных в Интернете увеличивается экспоненциально, поэтому нам нужна такая структура данных , которая может хранить эти данные и осуществлять операции с ними таким образом, чтобы это было эффективно.
Для этого идеально подходит хеш-таблицы! Их важное свойство состоит в том, что, при некоторых разумных допущениях, все три операции (добавление, удаление, поиск элемента) выполняются за время O(1).
Компоненты хеширования
В основном существует три компонента хеширования:
1. Ключ:
Ключом может быть любая строка или целое число, которое подается в качестве входных данных в хеш-функцию — метод, который определяет индекс или место хранения элемента в структуре данных.
2. Хэш-функция:
Хеш-функция получает входной ключ и возвращает индекс элемента в массиве, называемом хеш-таблицей. Индекс известен как хеш-индекс.
3. Хэш-таблица:
Хэш-таблица — это структура данных, которая сопоставляет ключи со значениями с помощью специальной функции, называемой хэш-функцией. Хэш хранит данные ассоциативным образом в массиве, где каждое значение данных имеет свой собственный уникальный индекс.
В основном существует три компонента хеширования:
1. Ключ:
Ключом может быть любая строка или целое число, которое подается в качестве входных данных в хеш-функцию — метод, который определяет индекс или место хранения элемента в структуре данных.
2. Хэш-функция:
Хеш-функция получает входной ключ и возвращает индекс элемента в массиве, называемом хеш-таблицей. Индекс известен как хеш-индекс.
3. Хэш-таблица:
Хэш-таблица — это структура данных, которая сопоставляет ключи со значениями с помощью специальной функции, называемой хэш-функцией. Хэш хранит данные ассоциативным образом в массиве, где каждое значение данных имеет свой собственный уникальный индекс.
Хеш-функции, основанные на делении
Хэш-функция — это функция, которая преобразует заданный числовой или буквенно-цифровой ключ в небольшое практическое целочисленное значение. Сопоставленное целочисленное значение используется в качестве индекса в хеш-таблице.
Хеш-функции, основанные на делении, это самый простой и легкий метод генерации хеш-значения. Хэш-функция делит значение k на M, а затем использует полученный остаток.
Плюсы:
⁃ Этот метод вполне хорош для любого значения M.
⁃ Метод деления очень быстрый, поскольку требует всего одной операции деления.
Минусы:
⁃ Этот метод приводит к снижению производительности, поскольку последовательные ключи сопоставляются с последовательными значениями хеш-функции в хеш-таблице.
⁃ Иногда следует проявлять особую осторожность при выборе значения M.
Хэш-функция — это функция, которая преобразует заданный числовой или буквенно-цифровой ключ в небольшое практическое целочисленное значение. Сопоставленное целочисленное значение используется в качестве индекса в хеш-таблице.
Хеш-функции, основанные на делении, это самый простой и легкий метод генерации хеш-значения. Хэш-функция делит значение k на M, а затем использует полученный остаток.
Плюсы:
⁃ Этот метод вполне хорош для любого значения M.
⁃ Метод деления очень быстрый, поскольку требует всего одной операции деления.
Минусы:
⁃ Этот метод приводит к снижению производительности, поскольку последовательные ключи сопоставляются с последовательными значениями хеш-функции в хеш-таблице.
⁃ Иногда следует проявлять особую осторожность при выборе значения M.
Метод среднего квадрата для хеш-функции
Метод хеширования, который включает в себя два шага для вычисления хеш-значения:
1. Возведите в квадрат значение ключа k, т.е. k2.
2. Извлеките средние цифры r в качестве значения хеш-функции.
Плюсы:
⁃ Производительность этого метода хороша, поскольку в результат вносят вклад большинство или все цифры значения ключа. Это связано с тем, что все цифры в ключе способствуют созданию средних цифр квадрата результата.
⁃ На результат не влияет распределение верхней или нижней цифры исходного значения ключа.
Минусы:
⁃ Размер ключа является одним из ограничений этого метода, поскольку ключ большого размера, то его квадрат увеличит количество цифр вдвое.
⁃ Еще одним недостатком является то, что столкновения будут, но мы можем попытаться их уменьшить.
Метод хеширования, который включает в себя два шага для вычисления хеш-значения:
1. Возведите в квадрат значение ключа k, т.е. k2.
2. Извлеките средние цифры r в качестве значения хеш-функции.
Плюсы:
⁃ Производительность этого метода хороша, поскольку в результат вносят вклад большинство или все цифры значения ключа. Это связано с тем, что все цифры в ключе способствуют созданию средних цифр квадрата результата.
⁃ На результат не влияет распределение верхней или нижней цифры исходного значения ключа.
Минусы:
⁃ Размер ключа является одним из ограничений этого метода, поскольку ключ большого размера, то его квадрат увеличит количество цифр вдвое.
⁃ Еще одним недостатком является то, что столкновения будут, но мы можем попытаться их уменьшить.
Метод складывания цифр для хеш-функции
Этот метод включает в себя два этапа:
1. Разделите ключ-значение
2. Добавьте отдельные части. Хэш-значение получается путем игнорирования последнего переноса, если таковой имеется.
Примечание:
Количество цифр в каждой части варьируется в зависимости от размера хеш-таблицы. Предположим, например, что размер хеш-таблицы равен 100, тогда каждая часть должна содержать две цифры, за исключением последней части, которая может иметь меньшее количество цифр.
Этот метод включает в себя два этапа:
1. Разделите ключ-значение
k на несколько частей, то есть k1, k2, k3,….,kn, где каждая часть имеет одинаковое количество цифр, за исключением последней части, которая может иметь меньше цифр, чем другие части.2. Добавьте отдельные части. Хэш-значение получается путем игнорирования последнего переноса, если таковой имеется.
Примечание:
Количество цифр в каждой части варьируется в зависимости от размера хеш-таблицы. Предположим, например, что размер хеш-таблицы равен 100, тогда каждая часть должна содержать две цифры, за исключением последней части, которая может иметь меньшее количество цифр.
Метод обработки коллизий — метод цепочек
Идея отдельной цепочки заключается в реализации массива в виде связанного списка, называемого цепочкой.
Здесь все элементы, которые хешируются в одном и том же индексе слота, вставляются в связанный список.
Преимущества:
⁃ Просто реализовать.
⁃ Хэш-таблица никогда не заполняется, мы всегда можем добавить в цепочку больше элементов.
⁃ Менее чувствителен к хэш-функции или факторам нагрузки.
⁃ Чаще всего используется, когда неизвестно, сколько и как часто ключей можно вставлять или удалять.
Недостатки:
⁃ Некоторые части хеш-таблицы никогда не используются
⁃ Если цепочка становится длинной, то время поиска в худшем случае может стать O(n).
⁃ Использует дополнительное пространство для ссылок
Идея отдельной цепочки заключается в реализации массива в виде связанного списка, называемого цепочкой.
Здесь все элементы, которые хешируются в одном и том же индексе слота, вставляются в связанный список.
Преимущества:
⁃ Просто реализовать.
⁃ Хэш-таблица никогда не заполняется, мы всегда можем добавить в цепочку больше элементов.
⁃ Менее чувствителен к хэш-функции или факторам нагрузки.
⁃ Чаще всего используется, когда неизвестно, сколько и как часто ключей можно вставлять или удалять.
Недостатки:
⁃ Некоторые части хеш-таблицы никогда не используются
⁃ Если цепочка становится длинной, то время поиска в худшем случае может стать O(n).
⁃ Использует дополнительное пространство для ссылок
Количество диагоналей в n-стороннем выпуклом многоугольнике
Чтобы найти количество диагоналей в n-стороннем выпуклом многоугольнике, можно воспользоваться следующей формулой:
Количество диагоналей =
Эта формула выведена из того факта, что в выпуклом многоугольнике с n сторонами каждая вершина может быть соединена с любой другой вершиной диагональю, за исключением самой себя, соседних с ней вершин и двух соседних с ними вершин. В результате из каждой вершины можно провести
Чтобы найти количество диагоналей в n-стороннем выпуклом многоугольнике, можно воспользоваться следующей формулой:
Количество диагоналей =
(n * (n - 3)) / 2Эта формула выведена из того факта, что в выпуклом многоугольнике с n сторонами каждая вершина может быть соединена с любой другой вершиной диагональю, за исключением самой себя, соседних с ней вершин и двух соседних с ними вершин. В результате из каждой вершины можно провести
n — 3 диагонали. Однако вы должны разделить это на 2, чтобы не считать каждую диагональ дважды (поскольку, например, соединение вершины A с вершиной B — это то же самое, что соединение вершины B с вершиной A).Задача о ходе коня
Головоломка, в которой требуется найти маршрут хода коня на шахматной доске, проходящий через все клетки только один раз.
Алгоритм:
1. Создаем шахматную доску
2. Инициализируем текущую позицию коня на доске.
3. Помечаем текущую позицию как посещенную.
4. Проверяем, есть ли еще непосещенные клетки на доске:
- Если все клетки посещены, то задача решена, и мы можем вернуть найденный маршрут.
- Если не все клетки посещены, переходим к следующему шагу.
5. Находим все возможные ходы коня из текущей позиции:
- Проверяем, что следующий ход находится в пределах доски и не был посещен.
6. Для каждого возможного хода коня:
- Передвигаем коня на следующий ход.
- Рекурсивно вызываем алгоритм для новой позиции коня.
- Если рекурсивный вызов вернул true (маршрут найден), то возвращаем true.
- Если рекурсивный вызов вернул false, отменяем текущий ход и ищем другие возможные ходы.
Сложность:
Головоломка, в которой требуется найти маршрут хода коня на шахматной доске, проходящий через все клетки только один раз.
Алгоритм:
1. Создаем шахматную доску
n x n, где n - размерность доски.2. Инициализируем текущую позицию коня на доске.
3. Помечаем текущую позицию как посещенную.
4. Проверяем, есть ли еще непосещенные клетки на доске:
- Если все клетки посещены, то задача решена, и мы можем вернуть найденный маршрут.
- Если не все клетки посещены, переходим к следующему шагу.
5. Находим все возможные ходы коня из текущей позиции:
- Проверяем, что следующий ход находится в пределах доски и не был посещен.
6. Для каждого возможного хода коня:
- Передвигаем коня на следующий ход.
- Рекурсивно вызываем алгоритм для новой позиции коня.
- Если рекурсивный вызов вернул true (маршрут найден), то возвращаем true.
- Если рекурсивный вызов вернул false, отменяем текущий ход и ищем другие возможные ходы.
Сложность:
O(8^n), где n - размерность доски.Междугородние маршруты без интернета? Сделали!
В 2ГИС теперь можно строить маршруты между регионами офлайн.
Звучит просто, но за этим — куча инженерных решений... Например, чтобы всё это заработало, мы работаем с макрографом — он позволяет строить маршрут по крупным кускам, а потом достраивать начало и конец уже по детальному графу.
В статье — про архитектуру, организацию данных и предрасчёты. Для тех, кто любит алгоритмы и инженерные задачи 🕵️
\#2ГИС_алгоритмы
В 2ГИС теперь можно строить маршруты между регионами офлайн.
Звучит просто, но за этим — куча инженерных решений... Например, чтобы всё это заработало, мы работаем с макрографом — он позволяет строить маршрут по крупным кускам, а потом достраивать начало и конец уже по детальному графу.
В статье — про архитектуру, организацию данных и предрасчёты. Для тех, кто любит алгоритмы и инженерные задачи 🕵️
\#2ГИС_алгоритмы
Задача о сумме подмножеств
Задача заключается в нахождении (хотя бы одного) непустого подмножества некоторого набора чисел, чтобы сумма чисел этого подмножества равнялась нулю.
Для каждого элемента есть две возможности:
1. Включите текущий элемент в подмножество и повторите операцию для остальных элементов с оставшейся суммой.
2. Исключить текущий элемент из подмножества и повторить операцию для остальных элементов.
3. Наконец, если сумма становится равной
Сложность:
Задача заключается в нахождении (хотя бы одного) непустого подмножества некоторого набора чисел, чтобы сумма чисел этого подмножества равнялась нулю.
Для каждого элемента есть две возможности:
1. Включите текущий элемент в подмножество и повторите операцию для остальных элементов с оставшейся суммой.
2. Исключить текущий элемент из подмножества и повторить операцию для остальных элементов.
3. Наконец, если сумма становится равной
0, выведите элементы текущего подмножества. Сложность:
O(n^2)• Как переносили сотни миллионов записей без даунтайма и потерь;
• Почему отказались от распределённых транзакций и как обеспечили согласованность данных;
• Как выкатывали изменения поэтапно — с возможностью отката в любой момент.
Всё это — под высокой нагрузкой, без влияния на пользователей и с полной гарантией доступности сервиса.
Please open Telegram to view this post
VIEW IN TELEGRAM
Поменять местами два числа без использования временной переменной (Используя сложение и вычитание)
Пусть у нас есть два числа
Шаги для обмена местами:
Присвоим переменной
Вычтем из переменной
Присвоим переменной
Теперь переменная
Пусть у нас есть два числа
a и b, и мы хотим поменять их местами.Шаги для обмена местами:
Присвоим переменной
a новое значение, которое будет суммой a и b.Вычтем из переменной
b исходное значение переменной a (которое мы присвоили в шаге 1).Присвоим переменной
a новое значение, которое будет разностью между новым значением a и исходным значением b.Теперь переменная
a содержит исходное значение b, а переменная b содержит исходное значение a, и мы успешно поменяли местами значения двух переменных.Поменять местами два числа без использования временной переменной.
(Используя умножения и деления)
Пусть у нас есть два числа
Присвоим переменной
Присвоим переменной
Присвоим переменной
Теперь переменная
(Используя умножения и деления)
Пусть у нас есть два числа
a и b, и мы хотим поменять их местами.Присвоим переменной
a новое значение, которое будет произведением a на b.Присвоим переменной
b новое значение, которое будет результатом деления нового значения a на исходное значение b.Присвоим переменной
a новое значение, которое будет результатом деления нового значения a на новое значение b.Теперь переменная
a содержит исходное значение b, а переменная b содержит исходное значение a, и мы успешно поменяли местами значения двух переменных.⁉️Машинное обучение кажется чем-то сложным и недосягаемым? Всё проще, чем вы думаете!
Первый шаг — разобраться, как устроен ML-процесс и научиться работать в Jupyter Notebook — инструменте, с которого начинают все специалисты в Data Science.
На открытом уроке вы шаг за шагом поймёте, как строится путь от данных до модели. Научитесь запускать эксперименты в Jupyter Notebook и Google Colab, работать с виртуальными окружениями и не бояться “сломать” систему. Всё — в формате простых и наглядных примеров.
После урока вы сможете уверенно начать свой первый ML-проект и поймёте, какие инструменты нужны, чтобы перейти от теории к практике.
➡️ 13 ноября в 20:00 МСК. Открытый вебинар проходит в преддверии старта курса «Machine Learning. Basic». Регистрируйтесь и сделайте первый шаг в машинное обучение без страха и путаницы: https://otus.pw/jfhE/
Первый шаг — разобраться, как устроен ML-процесс и научиться работать в Jupyter Notebook — инструменте, с которого начинают все специалисты в Data Science.
На открытом уроке вы шаг за шагом поймёте, как строится путь от данных до модели. Научитесь запускать эксперименты в Jupyter Notebook и Google Colab, работать с виртуальными окружениями и не бояться “сломать” систему. Всё — в формате простых и наглядных примеров.
После урока вы сможете уверенно начать свой первый ML-проект и поймёте, какие инструменты нужны, чтобы перейти от теории к практике.
➡️ 13 ноября в 20:00 МСК. Открытый вебинар проходит в преддверии старта курса «Machine Learning. Basic». Регистрируйтесь и сделайте первый шаг в машинное обучение без страха и путаницы: https://otus.pw/jfhE/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576Поменять местами биты в заданном числе
Учитывая число X и две позиции (справа) в двоичном представлении X, можно поменять местами n бит в данных двух позициях. Кроме того, предусмотрим, что два набора битов не перекрываются.
Алгоритм:
1) Переместить все биты первого набора в крайнюю правую часть.
Здесь выражение
2) Переместить все биты второго набора в крайнюю правую сторону.
3) XOR двух наборов битов
4) Вернуть биты xor в исходное положение.
5) Выполнить XOR xor с исходным номером.
Учитывая число X и две позиции (справа) в двоичном представлении X, можно поменять местами n бит в данных двух позициях. Кроме того, предусмотрим, что два набора битов не перекрываются.
Алгоритм:
1) Переместить все биты первого набора в крайнюю правую часть.
set1 = (x >> p1) & ((1U << n) - 1)Здесь выражение
(1U << n) - 1 дает число, которое содержит последние n битов, а остальные биты равны 0. Проделываем операцию & с этим выражением, чтобы биты, отличные от последнего n бит стали 0.2) Переместить все биты второго набора в крайнюю правую сторону.
set2 = (x >> p2) & ((1U << n) - 1)3) XOR двух наборов битов
xor = (set1 ^ set2)4) Вернуть биты xor в исходное положение.
xor = (xor << p1) | (xor << p2)5) Выполнить XOR xor с исходным номером.
result = x ^ xorAI-Ops для PostgreSQL: нейросети против узких мест и деградации производительности
Как заставить PostgreSQL не только работать быстрее, но и самостоятельно объяснять, где и почему всё тормозит? На открытом вебинаре курса OTUS PostgreSQL. Advanced Дмитрий Золотов покажет, как применять AI и LLM-модели для анализа производительности, поиска узких мест и предотвращения деградации ещё до того, как она станет проблемой.
→ 2 декабря, 20:00
AI-Ops для PostgreSQL: нейросети против узких мест и деградации производительности
— применение AIOps-подхода для анализа метрик, логов и планов выполнения запросов
— автоматическая интерпретация EXPLAIN ANALYZE и рекомендации по оптимизации
— использование ML-моделей для прогнозирования деградации и роста нагрузки
— примеры внедрения AI-мониторинга в продакшн
Вебинар будет полезен DBA, DevOps-инженерам, архитекторам высоких нагрузок и разработчикам, которые ищут новые способы автоматизации и анализа систем.
→ Зарегистрируйтесь: https://otus.pw/vNj0/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как заставить PostgreSQL не только работать быстрее, но и самостоятельно объяснять, где и почему всё тормозит? На открытом вебинаре курса OTUS PostgreSQL. Advanced Дмитрий Золотов покажет, как применять AI и LLM-модели для анализа производительности, поиска узких мест и предотвращения деградации ещё до того, как она станет проблемой.
→ 2 декабря, 20:00
AI-Ops для PostgreSQL: нейросети против узких мест и деградации производительности
— применение AIOps-подхода для анализа метрик, логов и планов выполнения запросов
— автоматическая интерпретация EXPLAIN ANALYZE и рекомендации по оптимизации
— использование ML-моделей для прогнозирования деградации и роста нагрузки
— примеры внедрения AI-мониторинга в продакшн
Вебинар будет полезен DBA, DevOps-инженерам, архитекторам высоких нагрузок и разработчикам, которые ищут новые способы автоматизации и анализа систем.
→ Зарегистрируйтесь: https://otus.pw/vNj0/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576