Как стать автором
Поиск
Написать публикацию
Обновить
194.24

Алгоритмы *

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

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

Эволюция внимания в LLM: от квадратичной сложности к эффективным оптимизациям

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

Мы живём в эпоху больших языковых моделей — инструментов вроде ChatGPT, Gemini, Claude, которые поражают своими способностями: они пишут тексты, отвечают на сложные вопросы, генерируют код и даже ведут осмысленные диалоги. Но задумывались ли вы, как им удаётся не просто понимать отдельные фразы, но и удерживать смысл длинных документов, многочасовых бесед или даже целых книг?

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

Читать далее

Новости

Часть 4. Алгоритмы: как превратить сырые данные в координаты

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

После выбора аппаратной базы (двойной STM32, каскад датчиков WT901 + LSM6DSV16X + LIS2DW12) наступает этап, который инженеры любят и ненавидят одновременно: программная реализация навигационного алгоритма. Эта часть посвящена математике, фильтрам и тому, как не сойти с ума, интегрируя шумные измерения в реальные координаты. Текст ориентирован на специалистов, поэтому скучноватые места будут разбавлены самоиронией и примерами из практики.

Читать далее

Как ломается RSA512 за 3.5 часа на одном ядре старого ноутбука

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

Сразу оговорюсь, что обычно я не занимаюсь компьютерной безопасностью и не интересуюсь, а занимаюсь алгоритмами и структурами данных - в прикладном применении это оптимизация быстродействия, высокопроизводительные вычисления типа CUDA, AVX512, многопоточность, что применяется например для майнеров криптовалют. Так я влез в криптанализ, ибо области, получается, соприкасаются. Был у меня заказ от человека, который хотел очень быстро на видеокартах перемножать 256-битные числа в 512-битные произведения. Я конечно сделал как он хотел, но вот пришла идея: так а зачем перемножать безчисленное количество чисел, если в принципе можно разложить на множители 512-битное число имея текущие технологии? Об этом дальше и речь.

Дано:

Читать далее

Сложность алгоритмов, или почему O(n) лучше O(2^n)

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

Предлагаю разобраться, как правильно оценить код с точки зрения его скорости выполнения.

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

Давайте рассмотрим, что же такое «хороший» и «плохой» алгоритм, на примере простой задачи с leetcode. 

Читать далее

GIMP Script-Fu ООП. Встраиваем векторы в систему классов Фигур и все Фигуры в язык Функциональной геометрии

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

Библиотека функций к Script-fu

В предыдущей статье мы рассмотрели имеющиеся в GIMP возможности векторной графики. Здесь мы рассмотрим как эти возможности использовать при построении графических примитивов — Фигур. Для построения абстракций фигур мы уже написали несколько классов: Фигуры рисуемых по контуру Кистью и Карандашом, Фигур заполняемых определённым цветом, Комбинированных Фигур, Фигур использующих Изображения и Фигур использующих Текст. Здесь я продемонстрирую, как легко и непринуждённо мы можем встроить новые абстракции в существующую иерархию классов. А заодно рассмотрим как вся эта иерархия классов может использоваться в языке функциональной геометрии, рассмотренном в предыдущем цикле статей.

Читать далее

Создаем простого грид-бота для Московской биржи через QUIK и Python

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

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

Читать далее

Как написать bzip2-архиватор на Python: разбираем преобразование Барроуза-Уилера

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

Привет! Я Рома, бэкендер-питонист в KTS.

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

Читать далее

Продвинутые техники RAG в действии

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

Всем привет! Представьте таблицу с сотнями или даже тысячами атрибутов. Как в условиях высокой размерности найти релевантные данные по запросу на естественном языке? Классические методы часто не справляются, нужны новые подходы.

Именно за эту сложную задачу взялась команда Департамента управления данными (SberData) в рамках эффективной интеграции ИИ‑агентов в Корпоративную аналитическую платформу Сбера (КАП), которая объединяет современные инструменты для работы с данными: хранение, интеграция, аналитика, моделирование и контроль качества данных. Наличие таких технологий, как продвинутые LLM (например, GigaChat), и большие объёмы данных делают исследование подобных задач актуальным для рынка больших данных.

В статье мы сравним эффективность векторного поиска, гибридных методов и подхода Retrieval‑Augmented Generation (RAG), оценим их влияние на точность результатов и обсудим практические ограничения.

Читать далее

Структуры данных для frontend-разработчиков с реальными примерами

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

В мире frontend есть проблема: многие разработчики плохо ориентируются в структурах данных и не умеют их грамотно применять, чтобы получать эффективные и производительные решения своих задач.

Мы, Тимофей Соломенников и Руслан Мирзоев, разработчики онлайн-кинотеатра PREMIER, хотим поделиться своим опытом и на реальных примерах показать, что даёт правильное использование структур данных.

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

Читать далее

Вычисление периода записи дробной части числа в позиционных системах счисления

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

Всякое рациональное число в позиционной системе счисления имеет либо конечную запись дробной части, либо бесконечную периодическую запись. Как вычислить соответствующий период для произвольного числа вида 1/α? В статье выведем универсальную формулу и рассмотрим конкретный и «быстрый» пример с большим периодом, но в шестнадцатеричной системе счисления, который можно проверить на калькуляторе.

Читать далее

Прием и парсинг NMEA-данных от GPS-приемника

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

Прием и парсинг NMEA-данных от GPS-приемника, а также, рассмотрение работы разных типов GPS (UART и RS-232): как правильно подключить модуль к микроконтроллеру STM32.

Читать далее

Expression Templates

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

«Лень‑матушка вперёд нас родилась»

В этой статье я хочу рассказать о технике «Expression Templates» и её применении в библиотеке simstr.

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

Вот, к примеру, давайте рассмотрим такой простенький код.

Читать далее

Расширение известного трюка с XOR на миллиарды строк: введение в обратимые фильтры Блума

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

Можно ли применить известный трюк с операцией XOR, используемый для поиска в списках одного или двух пропущенных чисел, сделав так, чтобы он подошёл бы для поиска тысяч отсутствующих идентификаторов в таблицах, содержащих миллионы строк?

Читать далее

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

Часть 3. Аппаратная часть: от микросхемы до дисплея

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

Идея собрать инерциальный навигатор пришла в голову быстро, но подобрать подходящие компоненты было сложнее. Главный микроконтроллер должен иметь достаточную вычислительную мощность для интегрирования уравнений движения и работы пользовательского интерфейса, при этом потреблять минимум энергии. Я выбрал контроллер семейства STM32 от STMicroelectronics, основанный на ядре ARM Cortex‑M. Этот чип обладает богатым набором периферии (I²C, SPI, UART, SDIO) и аппаратным блоком плавающей точки. К тому же компания ST поставляет готовые программные библиотеки для работы с MEMS‑датчиками.

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

Интегральный датчик инерции — сердце устройства. За основу взял 9‑осевой MEMS‑IMU WitMotion WT901, сочетающий три акселерометра и три гироскопа и электронный компас, что соответствует классическому INS. Этот модуль имеет низкий шум ускорений (~0,03 m/s²) и угловых скоростей (~0,02°/s) и выдает данные по интерфейсу SPI. Для обеспечения работы в широком температурном диапазоне датчик снабжён встроенным термодатчиком, данные которого учитываются при калибровке.

Читать далее

Binary Heap на примере PriorityQueue в JAVA

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

Двоичная куча (binary heap) — это структура данных, которая представляет собой бинарное дерево, удовлетворяющее определённым условиям:

Читать далее

GIMP Script-Fu ООП. Обобщённые функции и примитивные типы данных

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

Библиотека функций к Script-fu

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

Читать далее

Составное число и его факторизация

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

В комментариях к моим статьям регулярно встречаются возражения по поводу понятия «модель числа» – это какой-то оксюморон, фантазии автора и др.
В ответ могу только заметить, что в математике имеют дело с натуральными (N), целыми (Z), рациональными (Q), вещественными (R) и комплексными (С) числами. Приведенные термины по существу называют модели чисел с четко различимыми свойствами и допустимыми операциями в каждом из множеств названных чисел. Соотношения между этими моделями задается  включением левого (меньшего) в правое (большее) множество чисел N ⸦ Z ⸦ Q ⸦ R ⸦ C.
Главными операциями над множествами чисел в таких моделях являются сложение (+) и умножение (×), обратными к которым являются операции вычитания (–) и факторизация (×-1).

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

Когда мы представляем число из некоторого множества суммой слагаемых а + b, то, изменяя значения а и b так, чтобы сумма их оставалась постоянной, мы задаем аддитивное представление конкретного числа или его аддитивную (линейную) модель. Такая списочная многострочная модель (СММ) допустима во всех известных множествах. Совокупность сумм для N = х + у, где х и у – переменные модели, с накладываемыми на них ограничениями, задает модель числа N. А распределение делителей числа в натуральном ряде задается законом распределения делителей (ЗРД) числа.

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

Читать далее

Наивное введение в CRDT-типы

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

Привет, Хабр! Меня зовут Георгий Семёнов, в VK я занимаюсь разработкой в команде инфраструктуры рекомендательных систем, а в Университете ИТМО начинаю свой аспирантский путь в области децентрализованных коллаборативных сред.

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

Читать далее

Как научиться программированию разрабатывая игры

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

Если вы учились программировать в конце 80x-начале 90х, то наверняка делали это на ZX Spectrum, БК-0010 или MSX. Во всех этих компьютерах был встроенный язык програмирования. Кто-то начинал сразу с машинных кодов Радио-86РК. В любом случае первыми программами скорее всего были игры.

Но любительское программирование началось задолго до 90х. Посмотрим, какие игры предлагались раньше для начинающих программистов и что из этого мы могли бы извлечь для себя сегодня.

Читать далее

simstr — ещё одна строковая библиотека

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

Работа со строками в С++ - зачастую больная боль.

Однако за 25 лет я сумел найти лекарство от этой боли и после 13 лет разработки и испытаний готов поделиться им со всеми страждущими.

simstr — библиотека для использования строк в C++, в которой пишется легко и удобно, а выполняется быстро и оптимально.

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

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