Как стать автором
Обновить
319.04

Алгоритмы *

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

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

Об одном красивом неизвестном решении одной известной задачи

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

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

Дональд Кнут (с)

Как известно, на машине Тьюринга (далее МТ) запрограммировать можно всё, что мы вообще считаем программируемым, но в реальности программы на МТ настолько громоздкие, что МТ редко используется даже в академических примерах. И тем не менее в некоторых отдельных случаях с помощью МТ получается написать небольшую программу, на КДПВ изображена программа из 5 состояний на алфавите из 3 символом. Если вы изучали программирование, то задачу, которую решает эта программа, вы скорее всего встречали. Если я сумел вас заинтересовать, то приглашаю в небольшое приключение по реверс инженирингу МТ.

Материал статьи предоставлен Владимиром Пинаевым

Читать далее

Новости

Как работать с моделью числа II

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

Содержание текста статьи у некоторых читателей Хабра вызвало определенный интерес (судя по комментариям). Что в общем-то не удивительно, так как тема статьи весьма актуальная для современного общества – информационная безопасность. Специалисты проявляют интерес и активно разрабатывают тему с момента открытия двухключевой криптографии и односторонних функций (около 50 лет).

На самом деле проблема гораздо шире границ предметной области – информационная безопасность, что можно понять уже из рассмотрения частной задачи – факторизации числа. Математики в разных частях и странах мира на протяжении многих тысячелетий пытаются решить задачу разложения большого числа (ЗРБЧ) на множители – найти операцию обратную умножению, но до сих пор без особого успеха. Числа с разрядностью нескольких сотен пока разложить на множители не удается. 

Известно несколько подходов к решению проблемы (алгоритм Ферма, числовое решето, эллиптические кривые, CFRAC, CLASNO, SQUFOF, Вильямса, Шенкса и др.), которые критикуются и не кажутся перспективными и которые даже не претендуют на универсальность. Автором публикации предлагается оригинальный подход к решению проблемы с претензией на универсальность, т.е. без каких либо ограничений на факторизуемые числа, в частности, ограничений на разрядность чисел.

Появилась уверенность, что по крайней мере читатели domix 32; wataru; Naf2000 понимают, что в моих статьях идет речь о модели, так как вопросы задаются осмысленные.
Здесь важно понимать в рамках какой модели числа разрабатывается алгоритм поиска делителей (сомножителей) заданного составного числа, допущения, ограничения, требования и другие условия модели. Понимать какое влияние они оказывают на характеристики, в частности, на длительность процесса поиска решения.

Известные в настоящее время подходы и алгоритмы не обеспечивают с приемлемыми временными характеристиками получение решения.
В настоящее время ситуация с моделированием чисел и факторизацией как пишут Манин и Панчишкин близка к тупику или уже в тупике.

Читать далее

Генетический алгоритм в помощь Adam — супер, но есть нюанс

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

Хабр привет!

Это моя первая статья и я хотел бы начать ее с такого интересного эксперимента как "сбор гибрида для обучения нейронных сетей с помощью генетического алгоритма" и дополнительно рассказать про библиотеку Deap.

Давайте определим из чего у нас будет состоять наш гибрид (как можно понять из названия) - это:

1) Обычный проход градиентного спуска ...

Читать далее

Ядро, которое понимает: как я построил обучаемый механизм атак с нейросетью, эволюцией и квантовой логикой

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

Я больше не мог смотреть на то, как сканеры уязвимостей просто генерируют атаки из словарей и кидают в стену тысячи запросов. Это напоминало мне детский рисунок, где ребёнок мечется кистью по холсту, надеясь случайно изобразить Ван Гога.

Я хотел сканер, который понимает. Сканер, который учится. Сканер, который адаптируется.

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

Читать далее

Быстрый алгоритм fulltext-поиска без токенизации

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

Меня зовут Дмитрий Ольшанский, я ведущий инженер Т-Банка. Расскажу о новом (насколько мне известно) алгоритме поиска текста по шаблону. Такая задача возникла в рамках проекта Sage — observability-платформы от Т-Банка, для которой мы строим новый бэкэнд для структурированных логов, SageDB. 

Читать далее

Дискретные тригонометрические функции, машинный эпсилон и автоматическое дифференцирование

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

Попалась мне недавно статья Синус, косинус, квадратный корень FixedPoint. Автор размышляет как можно не затратно рассчитывать координаты и углы в микроконтроллере. Попробовал я подсказать автору пару аппроксимаций, но он оказался разговорчив только на тему "упадка автоматизации в РФ", а по делу как то не сложился диалог. Посмотрел, такие статьи не редкость. Например, очень хорошая статья Как посчитать синус быстрее всех на Xабре. В общем разгрузил себе голову на майских праздниках от главного хобби - геометрической алгебры.

В процессе изучения всего этого, возник у меня вопрос - а зачем вообще нужно аппроксимировать sin,cos, arctan и еще и в привязке к числу в двоичной системе, если есть декартовы координаты?

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

Автоматическим дифференцированием можно назвать любую конечную разность, например dy=(y(x+ε)-y(x-ε))/(2*ε). Разность взята центральная, так как она дает меньшую погрешность.

 ε это машинный ноль. За счет округления до младшего бита его главное свойство: ε^2=0.

Эта статья по сути не более, чем описание основных моментов идеи. И если у кого то появится желание поставить эту идею на строгие математические рельсы, с удовольствием готов поучаствовать. Кто в этом случае опубликует финальную версию мне искренне не важно.

Читать далее

I-CON: Периодическая таблица машинного обучения

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

Исследователи из МiT, Microsoft и Goggle создали фреймворк, который может изменить подход к разработке алгоритмов машинного обучения - I-Con (Information Contrastive Learning).

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

Читать далее

Путь самурая к заветной 1К на LeetCode [личный опыт]

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

В этой статье я собрал подборку ресурсов по изучению алгоритмов и структур данных — именно так бы я начал свой путь, если бы учился с нуля сегодня. Материал также будет полезен тем, кто готовится к алгоритмическим собеседованиям в FAANG и не только.

Читать далее

CLIP или SigLIP. База по Computer vision собеседованиям. Middle/Senior

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

Вопросы о CLIP-моделях встречаются почти на каждом техническом собеседовании.
Неважно, занимаетесь ли вы видеоаналитикой, создаёте генеративные модели или работаете над поиском по изображениям — CLIP и его потомки (BLIP , SigLIP ) стали стандартом де-факто в задачах связи визуальных и текстовых данных. Почему? Потому что они позволяют решать задачи, которые ранее требовали значительных усилий

Читать далее

Триангуляция по косточкам

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

Всё началось невинно. Шёл 2009 год, и я просто хотел портировать Earcut на Flash - для своей мини-игры. Тогда это сработало, но с годами стало понятно: простые решения перестают работать, как только хочешь выжать из них максимум.

Триангулировать

Всё, что вам не рассказали про Shunting Yard

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

Алгоритм сортировочной станции (Shunting Yard) был предложен Дейкстрой ещё в 1961 году и служит для преобразования математических выражений из привычной всем инфиксной записи (где операторы стоят между операндами, как в 1 + 2 * 3) в постфиксную (обратную польскую нотацию, 1 2 3 * +), удобную для дальнейшего вычисления. Однако есть один важный момент, который почти всегда упускается или замалчивается: алгоритм предполагает, что входное выражение уже синтаксически корректно.

Ни в Википедии, ни в большинстве обучающих статей вы не встретите слов о том, что выражения вроде + (1 2, 3 * 4 + ) или sin(+) должны вызывать ошибку. В лучшем случае они просто не вычисляются (что будет понятно лишь на этапе обработки в обратной польской записи), в худшем – дают бессмысленный результат. Алгоритм продолжает работать, даже если выражение изначально некорректно – и мало кто задумывается, почему это плохо.

Эта статья – попытка исправить эту несправедливую ситуацию, в которой мы не только реализуем алгоритм сортировочной станции «на максималках» с поддержкой констант, переменных, функций, унарных операторов, приоритетов и ассоциативности, но и добавим полноценную проверку корректности выражения по ходу разбора.

Читать далее

DI в Python, Easy-DI: спаситель в сложном мире зависимостей

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

Привет, Хабр! Сегодня я бы хотел вместе с вами погрузится в увлекательный мир зависимостей, а точнее их внедрение.

И так, давайте сначала разберемся что же такое зависимость?

Зависимость - это объект (или функция, в Python все - это объект), который нужен другому объекту или функции для их нормальной работы. Почти в каждого объекта есть одна или несколько зависимостей. Существует 2 основных метода их получение: создание зависимости непосредственно внутри функции либо же инъекция (внедрение).

Читать далее

Псевдослучайный рандом в Python

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

В этой статье хочу рассказать про нерандомность модуля random в стандартной библиотеке Python. С точки зрения криптографии и математики числа, генерируемые этим модулем, случайные лишь на вид — они порождаются детерминированным алгоритмом, что делает их псевдослучайными. Рассмотрим, как устроен генератор на основе алгоритма Mersenne Twister (MT19937), почему его выходы «нерандомны» в формальном смысле и какие практические следствия это имеет.

написано для новичков и плохо посвященных в тему людей…

Читать далее

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

Как Duolingo юзает машинное обучение для прокачки английского: кратко и по делу

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

Теперь всё, что раньше делали люди — создание курсов, проверку ответов, адаптацию персонализированных заданий — почти полностью взял на себя ИИ.

Duolingo — это уже давно не просто приложение с разноцветными совами и скучными заданиями. В 2025-м генеративный ИИ позволил Duolingo быстро создавать новые курсы, и за год почти удвоить число языковых курсов! Как им это удалось и что это значит лично для тебя — рассказываем подробнее...

Читать далее

Как проверить в C, является ли выражение константой

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

Вот вам маленькая задачка на программирование: реализуйте такой макрос, который принимает в качестве аргумента числовое выражение (числа могут быть целыми или с плавающей точкой) и:

Читать далее

Пример забытого «наивного» алгоритма

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

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

Разработчики зачастую пишут код (скелет), используя наивные алгоритмы и не используя валидаторы (предполагая изменить код позже либо ошибочно предположив что объем данных будет небольшим).

Не так давно попался один тикет с жалобой на зависание in-house приложения которое обрабатывает adobe pdf документы (печатает в png изображение для web клиентов).

Приложение использует библиотеку apache pdfbox.

Запустил тест с проблемным pdf документом в котором использовались формы – компьютер “пошел на взлет”. Похоже на длинный цикл, хорошо пошел.

Жду пару минут, стало интересно.

Начался тротлинг CPU (перегрев, рабочая коробочка у меня небольшая, мобильная, с воздушным охлаждением и быстро нагревается при большой длительной нагрузке).

Читать далее

JavaScript: структуры данных и алгоритмы. Часть 11

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


Привет, друзья!


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


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


Код, представленный в этой и других статьях серии, можно найти в этом репозитории.


Интересно? Тогда прошу под кат.

Читать дальше →

Сопоставление с образцом на C#: объяснение и примеры

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

За годы своего развития C# существенно эволюционировал; одна из самых мощных фич языка — это сопоставление с образцом (pattern matching).

Работая недавно над небольшим хобби-проектом, я наткнулся на такую прекрасную строку кода C#.

if (person is not null and { Age: > 18 })

{}

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

Годами я писал проверки на null и свойства-аксессоры классическим образом:

if (person != null && person.Age > 18)

{}

Функционально? Да. Удобочитаемо? Не особо. Безопасно? Спорно, особенно когда код становится сложнее.

Я решил создать шорт YouTube об этом современном синтаксисе. Это небольшое забавное напоминание о том, что C# позволяет при помощи сопоставления с образцом комбинировать проверки на null и обращение к свойству в одно условие.

Я понятия не имел, что это короткое видео приведёт к гораздо более глубокому исследованию, и покажет мне, насколько полезно и универсально сопоставление с образцом в современном C#.

Эта фича повышает читаемость, уменьшает объём бойлерплейта и обеспечивает более выразительную обработку логики.

В этой статье мы изучим различные типы образцов, поддерживаемых в C#, их работу и поймём, когда их использовать, на понятных примерах из реального мира.

Читать далее

Как работать с моделью числа I

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

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

История науки содержит массу примеров такой фразы «отсюда с очевидностью следует» или «легко получить», после которой пишется про как-то полученный результат. Эти фразы сбивают с толку читателя. Приятное исключение представляют работы Ньютона и Эйлера, с оригиналами которых мне довелось познакомиться. Если они демонстрируют вывод формулы, то не опускают даже, казалось бы, очевидных вещей все излагается последовательно без пропусков, подробно комментируется. На память приходит случай с Лапласом, где он получил урок

Один школьный из провинции учитель Франции последовательно повторял за Лапласом все опубликованные им результаты, пока не споткнулся на одном из них. Желая прояснить вопрос, он из провинции прибыл в Париж и обратился к самому Лапласу. Тот не отвернулся от учителя, хотя и был удивлен, что нашелся кто-то, кто повторял за ним все его результаты, как бы проверяя их работоспособность и правильность.

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

Лаплас пригласил учителя стать своим помощником-вычислителем, на что учитель согласился. Лаплас (возможно в отместку) усадил учителя за расчеты астрономических таблиц (рутинный труд). Учитель посвятил таблицам более 20 лет и свой жизненный путь так за их расчетом и закончил.

Для лучшего понимания текста читателю желательно иметь распечатку СМ-модели перед собой, а еще лучше написать программу СМ-модели и поработать с ней. Такая программа позволит задавать на вход различные модули (числа N) сравнения для числовых колец.

Читать далее

Эволюция одноразовых кодов: от TAN к Passkeys

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

От TAN-листов и SMS-кодов до Passkeys и FIDO2 — за 20 лет одноразовые коды прошли путь от бумажек до криптографии.

Почему TOTP стал стандартом? Чем push-уведомления лучше? И правда ли, что будущее — без паролей?

В статье — краткий и наглядный разбор всей эволюции OTP: алгоритмы, уязвимости, UX и рекомендации для современных систем.

Читать далее
1
23 ...