Обновить
256K+

Алгоритмы *

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

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

Типизация документов без OCR и нейросетей: 99.79% точности за 3 мс

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

Когда пользователь загружает документ в систему, сначала нужно понять, что именно он прислал. Паспорт? Договор? Полис? Заявление? От этого зависит весь дальнейший сценарий обработки: какие поля искать, какие проверки выполнять и какой OCR использовать. Ошибка на этом этапе делает бессмысленной всю дальнейшую обработку. Мы покажем, что тип документа можно определить, вообще не читая его содержимое. Для этого не нужны OCR, нейронные сети или анализ текста – достаточно использовать геометрию документа.

Читать далее

Новости

Собирали по частям, теряли по-крупному: почему новый сборщик мусора откатили в Python 3.14.5

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

В Python 3.14.0 (октябрь 2025-го) разработчики заменили классический иерархический сборщик мусора на инкрементальный – обещали более короткие паузы на больших свалках. Но уже в 3.14.5 (май 2026-го) это решение полностью откатили.

Что пошло не так? И почему альтернативный сборщик даже не сделали переключаемой опцией, как в Java или Go?

Разбираемся на бенчмарках, запустив локально обе версии интерпретатора.

Читать далее

Нейросеть, которую почти не учат или что такое резервуарные вычисления

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

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

И это, как ни странно, работает.

Начнем, впрочем, говорить про проблему - иначе непонятно, зачем вообще идти на такой компромисс.

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

Обучают РНС через BPTT - метод обратного распространения ошибки по времени. Собственно, алгоритм раскрывает сеть во времени. Берет все T шагов, строит граф вычислений и считает градиент через него. На каждом шаге градиент проходит через матрицу весов W. Если W перемножать саму на себя T раз подряд - при собственных значениях меньше 1 произведение стремится к нулю экспоненциально. При больше 1 - к бесконечности.

Первое называется затуханием градиента, второе - взрывом градиента. И это, кстати, нюанс.

RNN плохо запоминает то, что было давно. Градиент от событий на шаге t=1 до шага t=100 затухает настолько, что сеть его просто не видит. LSTM частично решает это через систему гейтов, которые контролируют поток информации. Но LSTM тяжелее, медленнее, и проблему не убирает - немного смягчает.

Читать далее

Iron Core. Часть 5: Столкновение с птицей в Терминале №2

Время на прочтение10 мин
Охват и читатели8.6K

Публикуем перевод пятой части из серии статей (вот первая, вторая, третья и четвёртая), посвящённой информационным технологиям в авиаперевозках. Сегодня поговорим о задержанном стыковочном рейсе, об отстранённом от полётов Boeing 787-8, и о том, что сделала 60-летняя система после того, как в аэропорту Хитроу всё пошло наперекосяк.

Читать далее

99-й перцентиль за 20 мс: T-Digest и магия сжатых распределений

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели8.7K

Представим, что у вас есть сервер, который обрабатывает и анализирует 100.000 RPS. Вам нужно высчитать и показать на дашборде 99-й перцентиль задержки — значение, выше которого только 1% самых медленных запросов. Если вы сохраните все 100 000 чисел за секунду, через час это 360 миллионов чисел. Через день — 8.6 миллиардов. Каждый раз хранить, сортировать и высчитывать? Нереально долго и ресурсозатратно.

Но для этой задачи существует алгоритм T-Digest. Вместо того, чтобы хранить все числа, он группирует их в кластеры — центроиды. А все дело в том, что кластеры на краях распределения (там, где наши хвосты) он делает маленькими и точными, а в центре — большими и «приблизительными». В результате для 100 000 точек нам нужно всего ~100 центроидов вместо 100 000 чисел. Это в сотни раз меньше памяти. И притом что ошибка при вычислении 95-го перцентиля в среднем составляет всего 0.001–0.06% (в зависимости от параметра сжатия).

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

Читать далее

Стохастический клеточный автомат на системе типов

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

Давайте разберёмся, как алгорифмы Маркова и pattern matching в WL позволяют генерировать лабиринты, реки, падающий песок и другие клеточные автоматы с помощью системы типов

Читать далее

Эволюция поиска вакансий в Авито Работе: ML-оптимизации и инсайты из АБ-тестов

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели9.1K

Привет! Меня зовут Вадим Вахрушев, я старший DS-инженер в Авито, занимаюсь задачами поиска. В статье расскажу, как устроено ранжирование в Авито Работе: какие ML-модели помогают создавать выдачу вакансий, и какие инсайты мы вынесли из нескольких показательных АБ-тестов.

Думаю, статья будет в первую очередь интересна ML-инженерам, которым важно разобраться, как поисковое ранжирование адаптируется под конкретную бизнес-вертикаль. Если хочется узнать про поиск в Авито в целом, загляните в обзорную статью — «Как работает поисковое ранжирование для миллионов объявлений Авито». В этом материале я сфокусируюсь именно на специфике вакансий.

Читать далее

Как выбрать OCR в 2026-м: тестируем девять моделей на трех движках инференса на рукописном русском

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

Вам нужен OCR. В техобзорах рекомендуют Tesseract, на Хабре все пишут про VLM, идете на Hugging Face — там PaddleOCR-VL, DeepSeek-OCR, Dots.OCR, Qwen2.5-VL, и каждая называет себя SOTA. Прибавим к этому vLLM, SGLang, TGI, Native HF Transformers, и вот вы зависли между десятками комбинаций. Мы протестировали девять моделей на трех движках инференса на рукописном русском и отразили в таблице, какая модель под какую задачу лучше подходит.

Велком под кат за таблицей и историей ее создания

Читать далее

Реверс алгоритма из прошивки устройства на базе ARM-процессора

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

Есть устройство, работает с чипами ss02-1, умеет в них писать и читать. Для этого в себе содержит алгоритмы генерации паролей на авторизацию и запись, мы хотим получить эти данные сами. Что имеем - прошивку устройства, серийный номер чипа, на основание которого генерируются пароли. Попробуем восстановить алгоритм, используя инструменты дизассемблирования и эмуляции.

Читать далее

Рефлексия в C++26 на примере сериализации и десериализации JSON

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

Всем привет! Меня зовут Тимур, я работаю в YADRO, и уже больше двух месяцев мой системный компилятор — gcc16. В новом стандарте добавили очень много, и сегодня я расскажу вам о некоторых обновлениях. В основном о рефлексии, но также будет немного и о контрактах.

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

Читать далее

Доверьтесь компилятору: C++23 против трюков из 90-х

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

Как часто вы слышали: «Не доверяй компилятору, пиши вручную»? Похоже, эту идеологию пора сдавать в архив.

Автор специально собрал примеры, в которых «умный» код современного C++ либо проигрывает наивному, либо не даёт выигрыша, но при этом ухудшает читаемость и мешает оптимизатору. Тут и легендарный Q_rsqrt, и бит-хаки для подсчёта единичек, и вездесущие const&, и даже опасные фокусы с фильтрацией диапазонов. Всё с воспроизводимыми бенчмарками на Clang 21 и Ryzen 9. Если вы готовы пересмотреть багаж старых привычек – просим под кат.

Читать далее

Языковая Модель без магии: Крошечная Language Model на чистом Node.js

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

Мы создаем крошечную языковую модель с нуля на чистом Node.js без использования TensorFlow или PyTorch, реализуя нейроны, автоград, эмбеддинги, механизм самовнимания (self-attention), полносвязную сеть (FFN), обратное распространение ошибки и SFT, одновременно наблюдая за тем, как отдельные веса и целые матрицы изменяются в процессе обучения

Это не новая GPT и не прод ML...

Iron Core. Часть 4: Путь от GDS до выхода на посадку

Время на прочтение11 мин
Охват и читатели8.8K

Перед вами четвёртый материал (вот первый, второй и третий) из серии статей, посвящённых информационным технологиям в авиаперевозках. Наша сегодняшняя тема — DCS (Departure Control System, система контроля отправки пассажиров).

Что произошло в 05:30, когда я вошёл в аэропорт Нагпура и GDS выбыла из игры?

Читать далее

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

Как у алгоритмов снижения размерности получается вас обмануть. Что происходит внутри PCA, t‑SNE и UMAP

Время на прочтение17 мин
Охват и читатели17K

Сколько глаз у человека? Два.

А в сфере машинного обучения модели умеют видеть любую сразу тысячей или миллионами глаз. Мы живем в 3-х мерном пространстве(3D), и видим 2-х мерную картину мира. Модель, в свою очередь, обитает в цифровом пространстве. Она может видеть ваши 2D фото, 3D модель в Blender сразу со всех сторон и спокойно построить параллелепипед в 15D. 

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

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

Для этой задачи разработаны специальные алгоритмы. Самыми известными из них сегодня стали PCAt-SNE и UMAP. Несмотря на схожий результат в виде разноцветной двумерной карты, внутри они основаны на разных математических идеях.  И сегодня мы узнаем на каких

Читать далее

Проектируем с нуля калькулятор на FPGA. Часть 9: погоня за последним разрядом

Время на прочтение14 мин
Охват и читатели8.4K

← Восьмая часть

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

Но «большинство» это не «все», а «примерно 12» — это не 15-16 разрядов, которые может и должна обеспечивать 16-разрядная BCD-машина. Существовали пограничные случаи, в которых результаты оказывались совершенно неверными. Имелись итеративные алгоритмы с точностью приемлемой, но не такой, какой она могла быть. Кроме того, в процессе тестирования я обнаружил ошибки, при отладке которых обнаружились фундаментальные баги в коде прототипа на C++. Это привело меня в смятение, ведь для их устранения мне бы пришлось переделать заново код прототипа. В конечном итоге, так я и поступил. Старый код я оставил в репозитории (Pathfinding/Methods) и с нуля разработал совершенно новую версию (Pathfinding/Proof). Я пообещал себе, что занимаюсь этим последний раз в жизни, поэтому стремился делать всё идеально.

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

Читать далее

Почему нельзя идеально оптимизировать светофоры: дело не в алгоритмах

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

Каждый айтишник, который хоть раз стоял «на красном» на пустом перекрестке в три часа ночи, думал одно и то же: «Да я бы это за выходные пофиксил».

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

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

Читать далее

Как добавить в умную колонку новые команды и ничего не сломать

Время на прочтение7 мин
Охват и читатели17K

Чтобы дать команду умной колонке, не обязательно говорить активационное слово «Алиса»: есть быстрые команды — короткие фразы, с помощью которых можно управлять музыкой, громкостью или умным домом. Например, чтобы переключить трек, достаточно просто сказать «дальше», а чтобы убавить звук — «тише». Весь список команд можно посмотреть в настройках вашего аккаунта в приложении «Дом с Алисой».

Быстрые команды удобнее не только пользователям, но и системе: запросы через слово «Алиса» требуют обращения к модели распознавания речи ASR, которой из‑за её размеров необходимы серверные вычислительные ресурсы, а модель быстрых команд устроена гораздо компактнее. Она работает прямо на устройстве, а значит, ограничена вычислительными ресурсами самой колонки — её CPU и оперативной памятью. Из‑за этого модель нельзя сильно увеличить: ей приходится оставаться компактной, зато запрос обрабатывается быстрее. 

За распознавание быстрых команд отвечает нейросеть. Её архитектура почти полностью совпадает с решением для наушников Яндекс Дропс, которое подробно описал в своей статье Григорий Афанасенко. Разница в основном в масштабе: наша модель весит всего от 0,5 до 1,5 МБ в зависимости от железа конкретного устройства.

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

Читать далее

Как я склеиваю 23 тысячи событий из пяти афиш — и почему дедуп нельзя делать необратимым

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

Зашёл тут на карту и вижу странную картину. На Чистых прудах висят три пина ровно друг на друге. Тыкаю, а там один и тот же «Вишнёвый сад» в Ленкоме. Совпадает всё, вплоть до времени и зала. Просто данные прилетели из трёх разных мест. Где-то площадка записана просто как Ленком, где-то полностью с именем Марка Захарова, а в третьем случае вообще пусто. Для пользователя это три разных события на карте, хотя спектакль на самом деле один.

У меня сейчас Окрест тянет афиши по шестнадцати городам из Яндекс Афиши, Afisha.ru, Timepad, KudaGo и телеграм-каналов самих площадок. Сейчас в базе 23 097 активных событий, и пересечений между источниками много. 8260 событий приходят из двух источников, 533 из трёх, десять встречаются сразу в четырёх. На карте всё это должно превращаться в одну точку, а не в гирлянду пинов.

Читать далее

Плодитесь и размножайтесь. Эволюция как основа геймплея в компьютерных играх

Время на прочтение12 мин
Охват и читатели16K

Думаю, один из самых завораживающих и интересных феноменов, о котором я узнал именно с Хабра — это клеточные автоматы. О Джоне Конвее и его игре «Жизнь» я впервые прочитал в переводной статье уважаемого @SLY_G «Джон Хортон Конвей: Жизнь, как игра», а среди авторских материалов мне запомнились «Наша Вселенная — симуляция на основе большого клеточного автомата?», которую мне довелось прочитать, будучи в жюри конкурса «Технотекст», «Простейшие клеточные автоматы и их практическое применение» уважаемого @oshibka404 и, наконец, блестяще иллюстрированная алгоритмическая работа «Эволюционирующие клеточные автоматы» уважаемого @xcont. Эти статьи натолкнули меня на размышления о том, почему биологическая (дарвиновская) эволюция не слишком популярна в качестве источника сюжетов для компьютерных игр. Если как следует поискать, такие игры всё-таки существуют (пусть многие из них и напоминают образовательные пет-проекты), но мейнстримом они определённо не стали. Под катом попробую рассмотреть, так ли интересно играть в эволюцию и не слишком ли фаталистична и сложна эта тема в качестве развлекательной.

Читать далее

Ленивый LINQ: разбираем yield и ленивые вычисления по кирпичикам

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

Каждый C#‑разработчик писал numbers.Where(x => x > 10).Select(x => x * 2) — и удивлялся, узнав, что эта строчка ничего не вычисляет. Цепочка спит, пока мы не начнём перебирать результат.

За этим стоит конкретный механизм — отложенные вычисления, а в его основе лежит обычная фича языка: yield. Разбираем, как устроены ленивые методы LINQ изнутри — от ручной реализации Where без yield до того, во что этот yield разворачивается компилятором.

А вы точно знаете, что происходит под капотом каждый раз, когда пишете .Where(...).Select(...)?

К статье приложен репозиторий с полной реализацией.

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