Все потоки
Поиск
Написать публикацию
Обновить
161.33

Алгоритмы *

Все об алгоритмах

Сначала показывать
Порог рейтинга
Уровень сложности

Внезапно сложная задача на литкоде: Варианты покупки двух товаров

Уровень сложностиСложный
Время на прочтение6 мин
Количество просмотров13K

Есть вот такая, вроде бы, простая задача на литкоде: Дано три числа total - сколько у вас есть денег, cost1, cost2 - цены двух товаров. Надо подсчитать, сколько всего существует различных способов купить сколько-то этих двух товаров, не выходя из бюджета (значение имеет только общее количество покупок). Иными словами, сколько существет целых неотрицательных пар (x, y), таких что x*cost1+y*cost2 <= total . Например, имея товары ценами {5, 10} и 20 денег на руках, есть 9 способов потратить деньги: 0, 5, 5+5, 5+5+5, 5+5+5+5, 10, 10+5, 10+5+5, 10+10.

Она там даже помечена как medium и вообще в одну строчку решается, но это если допускать безумно медленное решение за O(total / max(cost1, cost2)) , т.е линейное от входных чисел. А сможете ли вы решить ее сильно быстрее - за O(log(max(cost1, cost2))) ? В этом случае задачка становится вполне себе hard и требует много математики и аккуратности. Если интересно решение - добро пожаловать под кат. Буду рад любым альтернативным решениям. Может кто-то сможет додуматься до похожего решения проще.

Читать далее

Разделяй и властвуй. Повышение эффективности алгоритмов. Часть 3

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров2.5K

В прошлой части мы рассмотрели общий подход к расчету эффективности алгоритмов с принципом "разделяй и властвуй", а также применение принципа к различным базовым алгоритмам.
Сегодня поговорим о следующем приеме. Как известно, составная часть принципа, это поделить задачу на подзадачи. Мы ни разу не касались, как именно делить. Просто делили на равные части. Но тут вот и есть нюанс, если поделить не абы как, а используя какую-то стратегию, то можно добиться применения принципа там, где это даже не очевидно. И именно эта тема станет предметом данной статьи на примере задачи умножения полиномов.
Как и в предыдущих частях, я упрощаю математическую часть, опуская различные нюансы и частные случаи, с целью сохранить научно-популярный характер публикации. При этом я пытаюсь сохранить основные элементы алгоритмов и математических основ. Я хочу подать информацию в кратком доступном виде, в виде математического пересказа, и если у кого-либо возникнет интерес, тот может легко найти полные и строгие математические выкладки по данной теме.

Читать далее

Балансировка нагрузки: простыми словами о всей мощи двух случайных вариантов

Время на прочтение7 мин
Количество просмотров7.1K
image

В мире динамического выделения ресурсов и балансировки нагрузки есть много интересных алгоритмов, но один из самых известных и занимательных – так называемый «метод двух случайных выборов». Он привносит очень простое изменение в процедуру случайного выделения ресурсов, а качество результатов от этого улучшается экспоненциально. Мне посчастливилось реализовать именно эту технику в гигантском масштабе, чтобы оптимизировать использование ресурсов в AWS Lambda, но мне всё равно долго не удавалось «прочувствовать» этот метод интуитивно. В этом посте хочу познакомить вас с той метафорической картиной этого алгоритма, которую я для себя составил, и которая очень удобна для понимания других продвинутых техник в этой области.
Читать дальше →

Поиск минимальной стоимости корректировки массива

Время на прочтение5 мин
Количество просмотров2.2K

Имея массив целых положительных чисел, нужно заменить каждый элемент так, чтобы разница между соседними элементами массива была меньше или равна заданному целевому значению (target). Нам необходимо минимизировать стоимость корректировки, то есть суммарную разницу между новыми и старыми значениями. По сути, нам нужно минимизировать ∑|A[i] — Anew[i]|, где 0 ≤ i ≤ n-1, n — размер A[], а Anew[] — массив с разницей между соседними элементами меньше или равной заданной. Предположим, что все элементы массива меньше константы M = 100.

Читать далее

Квантомания и криптография))

Уровень сложностиПростой
Время на прочтение12 мин
Количество просмотров2.5K

Несмотря на то, что исследования в области постквантовой криптографии с каждым днём набирают обороты, практическое приложение полученных результатов очень лениво внедряется в реальные продукты. Во многом это связано с небезосновательными опасениями по поводу своевременности и практичности этого. Многие специалисты считают этот процесс преждевременным. Однако учёные настойчиво разрабатывают различные постквантовые приложения. Как знатный параноик и перестраховщик, я, скорее, нахожусь на стороне вторых, поскольку отчётливо представляю себе тот день, когда произойдёт технологический прорыв и в то же мгновение большинство криптографических схем прикажут долго жить, накрывшись респектабельным медным тазиком реализаций алгоритма Шора. Массовой истерии не избежать, например, как сейчас с генеративным ИИ. В отличие от тех же проблем с внезапно слишком умным ИИ, практическое приложение которого ещё не до конца осознано и варится в котле общественных мнений с явными попытками ограничения неконтролируемого развития, со скачком в квантовых вычислениях подобный номер вряд ли пройдёт. Всё, что может быть взломано, будет взломано, и мир погрузится в хаос...

Возможно, всё не так страшно, но бережёного бог бережёт, поэтому чем раньше начнут внедряться постквантовые системы, тем вероятнее шанс избежать неприятных последствий этого технологического рывка. Сегодня существует несколько подходов к реализации такой защиты. Хотя, пожалуй, самый реалистичный в ближайшем будущем подход будет основываться на криптографии на основе хэшей. Примером такой системы является схема с открытым ключом в виде хэш-дерева Меркла, разработанная ещё в 1979 году и основанная на идеях Лэмпорта и Диффи.

Квантуем, сегодня мы с тобой квантуем!!!

Удивительные клеточные автоматы: клетки-киллеры, BSFK[L]

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров3.8K


?, Хабр!

После небольшого перерыва продолжим нашу экскурсию по различным вариациям классической конфигурации клеточных автоматов. Сегодня мы рассмотрим правила с «деструктивными клетками». Первоначальный вид подобной модификации, известной как BSFK, предложил энтузиаст под ником c0b0p0, всего 9 лет назад, спустя более чем 40 лет, после первого описания «Жизни» Джона Конвея.
Что здесь происходит (для новых читателей серии)
В этой серии мы разбираем клеточные автоматы – дискретную модель, основой которой является сетка из ячеек-клеток, которые изменяют (или не изменяют) своё состояние в зависимости от количества соседей.
Учёт соседей определяется правилами, которые устанавливаются нами. Вариаций правил существует бесчисленное множество, и они были систематизированы в определённые конфигурации.
Самая популярная конфигурация – «B/S», или «life-like», по названию крайне широко известного клеточного автомата «Game of Life», где B/S обозначает, что в нашем правиле мы описываем всего два параметра – количество соседей необходимых для рождения новой клетки в пустой ячейке, и количество соседей для выживания существующей клетки.
В каждой статье серии мы углубляемся в данную конфигурацию, добавляя новые параметры, либо дополняя существующие. Иногда заглядываем и в прочие конфигурации.
Начало серии здесь, если желаете ознакомиться последовательно.
Рассматриваемая модификация предполагает три состояния клеток – мёртвые, живые и деструктивные, и добавляет два числовых параметра в наше правило – F и K. Переходы говорят, что если у живой клетки есть как минимум K деструктивных соседей («киллеров»), она умирает. Если это условие не выполняется, то, как и в прошлых конфигурациях, происходит проверка на вхождение в множество S, но с тем отличием, что при отсутствии вхождения такая клетка не умирает, а сама превращается в киллера. Киллеры же умирают, если у них есть как минимум один живой сосед.

К условию зарождения жизни на пустых (мёртвых) клетках по числу живых соседей B добавляется «и количество соседей-киллеров не больше F».
Читать дальше →

Тестируем алгоритм обработки данных в Excel на Visual Basic for Application и тёплые ламповые чётные гармоники

Время на прочтение2 мин
Количество просмотров2.5K

В первом приближении надо загрузить wav или mp3 файл с музыкой в Excel, провести над загруженными данными Digital Signal Processing (DSP) или Цифровую Обработку Сигнала (ЦОС) по определенному алгоритму на Visual Basic for Application (VBA) ), сохранить результат в wav файл и прослушать его. Сравнительный пример звуков после обработки и до обработки https://disk.yandex.ru/d/y18kiOIMN7CLCA

Читать далее

Алгоритм backtracking

Время на прочтение10 мин
Количество просмотров34K

Автор статьи: Артем Михайлов

В наши дни большое количество задач требует нахождение всех возможных комбинаций в наборе данных. Подобные ситуации могут возникнуть в различных областях, начиная от программирования и машинного обучения до игровой индустрии и задач комбинаторики. В таких случаях использование алгоритма backtracking — метода рекурсивного перебора всех возможных вариантов — может быть наиболее эффективным подходом.

Читать далее

Бинарное дерево поиска в Swift

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров4.4K

Вы когда‑нибудь задумывались, почему результаты поиска файлов появляются так быстро? В этой статье мы рассмотрим удивительную структуру данных, известную как двоичное дерево (бинарное дерево), и узнаем, как именно она позволяет достичь такой быстрой обработки и поиска.

Читать далее

Преобразование Хафа

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров10K

Автор статьи: Рустем Галиев

Сегодня мы рассмотрим преобразование Хафа — популярный метод обнаружения фигур среди граней и границ. Поговорим про использование преобразования Хафа для обнаружения линий и кругов.

Читать далее

Архитектура кеша DragonflyDB

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров5.9K

DragonflyDB - молодая in-memory база данных, написанная на C++ и совместимая с Redis (не форк). Под капотом используется многопоточная архитектура (в отличии от однопоточного Redis) для лучшей утилизации современных процессоров и более простого вертикального масштабирования.

Особое внимание в DragonflyDB привлекает устройство кеша и его очистки, которая должна превосходить известные LRU и LFU политики.

Читать далее

Алгоритмы компрессии данных: принципы и эффективность

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров28K


Автор статьи: Артем Михайлов

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

Компрессия данных — это процесс сокращения объема данных без потерь или с минимальной потерей информации. Путем применения алгоритмов и методов компрессии, мы можем существенно уменьшить размер данных, сохраняя при этом их суть и основные характеристики. Это может быть полезно во множестве ситуаций, начиная от экономии места на хранилище и ускорения передачи данных до минимизации затрат на интернет-трафик и повышения производительности систем обработки и анализа информации.
Читать дальше →

Развлечения с хеш-коллизиями

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров5.1K

Мой друг и коллега по цеху, блоггер Сэм, недавно опубликовал своё третье иллюстрированное руководство, темой которого стало хеширование. Нет острой необходимости читать его руководство перед прочтением моей статьи, но я очень рекомендую вам это сделать. Хотя бы ради того, чтобы посмотреть на восхитительные анимации, от которых невозможно оторваться. Честно — они просто потрясающие. Тут, к сожалению, анимаций вы не найдёте, поэтому насмотритесь на них в той статье, а потом возвращайтесь сюда. Здесь вы сможете немного позабавиться поиском коллизий алгоритма хеширования MurmurHash3.

Сразу хочу отметить, что этот материал я писал исключительно ради развлечения. Ничто из того, что я тут покажу, не предназначено для продакшн-кода. И вот, как всегда, ссылка на GitHub-репозиторий, в котором можно найти код к этой статье.

Идея этого поста возникла после того, как меня попросили помочь с поиском коллизий. Тогда меня охватило непреодолимое желание узнать о том, сколько хешей в секунду я смогу выжать из доступного мне железа. Собственно, тут я расскажу о поиске хеш-коллизий MurmurHash3 на скорости 200 гигахешей в секунду.

Читать далее

Ближайшие события

Кодеки новой эпохи: HEVC, AV1, VVC и нейросети

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров29K
Сжатие с учётом контекста, источник: WaveOne (сайт удалён)

Хотя новые стандарты кодеков появляются каждые десять лет, все они основаны на пиксельной математике — манипулировании значениями отдельных пикселей в видеокадре для удаления информации, не важной для восприятия. Другие математические операции уменьшают объём данных после первоначального кодирования.

В новом поколении кодеков алгоритмы машинного обучения используются для анализа и понимания визуального содержания видео, выявления избыточных данных и более эффективного сжатия. Вместо написанных вручную алгоритмов, тут применяют методы Software 2.0, основанные на обучении. Данная область развивается на протяжении десятилетий, но в последние годы получила сильный толчок. Все знают, что в 2017 году произошёл прорыв в разработке ИИ благодаря изобретению трансформеров. В свою очередь, они основаны на концепции внимания, которую придумали в 90-е. Эта техника впервые позволила соотносить друг с другом отдельные части текста или видеокадра.
Читать дальше →

Одна задачка на литкоде

Время на прочтение2 мин
Количество просмотров9.2K

Иногда хочется решить задачу просто потому что решение легко проверить, прям сразу для множество вариантов. Взяли список из 25 элементов, отсортировали его, и применили искомую функцию 25 раз, профит. Плюс задачка напоминает обложку тетрадки по арифметике за пятый класс, там где табличка произведений, ну та где находим пятый столбец и седьмой ряд и на пересечений их будет произведение. Там же в табличке видно что 6x6 - это квадрат, а 9x4 это совсем не квадрат (скорее ближе к прямоугольнику) хотя площадь у них равная. Так вот, "литкод" хочет чтобы мы нашли n-ый элемент в данной табличке по возрастанию.

Читать далее

Генерация и валидация чисел по алгоритму Луна

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров24K

Алгоритм Луна (Luhn algorithm) - это процесс вычисления контрольной цифры для числа в соответствии со стандартом ISO/IEC 7812. Процесс предназначен, в первую очередь, для выявления ошибок, вызванных с непреднамеренным искажением данных. Например, при ручном вводе номера карты или любого другого числа.

Разберём как он работает и рассмотрим инструмент для формирования номеров по алгоритму.

Читать далее

Волновой алгоритм

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров22K

Волновой алгоритм — алгоритм поиска пути, алгоритм поиска кратчайшего пути. Принадлежит к алгоритмам, основанным на методах поиска в ширину.

Читать далее

Вычислительная сложность некоторых игр и головоломок (часть 2)

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров3.8K

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

В первой статье и правда по справедливому замечанию avsmal «не хватает каких-то более строгих и конкретных утверждений», но не стоит забывать, что любой даже самый нудный материал нужно стараться подать интересно. В прошлый раз я пожертвовал структурой и конкретностью в пользу читабельности и привлечения интереса к теме. Сильно «душные» статьи заходят с большим скрипом и больше отпугивают читателя.

Прежде всего, нужно отметить, что теория вычислительной сложности анализирует сложность различных алгоритмических задач, а теория вычислимости — какие проблемы могут быть решены с помощью алгоритмов. Теория сложности рассматривает проблемы, которые в принципе могут быть решены алгоритмически, и пытается установить экстремумы ресурсов, необходимых для их решения. Это важно, потому что некоторые проблемы в принципе могут быть решаемы, но требовать неосуществимого количества ресурсов.

Читать далее

Разработка — всё? Действительно ли нас всех заменят роботы

Уровень сложностиПростой
Время на прочтение12 мин
Количество просмотров12K

Александр Пряхин, руководитель разработки юнита в Авито Работа, рассказал, так ли мрачно выглядит будущее для разработчиков «из плоти и крови» на фоне активного развития No Code, Low Code и нейросетей.

Читать далее

Каково расстояние между «Будапештом» и «Бухарестом» или об отождествлении слов с помощью расстояния Левенштейна

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров3.6K

Каждый из нас из школы помнит определение Евклидова расстояния между двумя точками на плоскости. С помощью расстояния Евклида можно вычислить расстояние между двумя точками на карте, например, между вашим местоположением и станцией метро. Но для пешехода в Нью-Йорке расстояние между двумя точками в городе будет отличаться от расстояния Евклида между двумя точками из-за невозможности передвигаться иначе, как по проезжим улицам, пересекающимся под прямыми углами. Такое расстояние так и называется: "расстояние городских кварталов" или манхэттенское расстояние. При любом способе расстояние характеризует меру близости точек. В сегодняшней статье мы расскажем о способах вычисления расстояния между двумя словами.

Читать далее

Вклад авторов