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

Алгоритмы *

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

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

SQL HowTo: находим «елочку» с помощью центра масс (Advent of Code 2024, Day 14: Restroom Redoubt)

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

В этой челлендж-серии статей попробуем использовать PostgreSQL как среду для решения задач Advent of Code 2024.

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

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

Читать далее

Судоку: моя попытка в новый алгоритм решения. Часть 1 (надеюсь)…

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

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

Читать далее

Кодирование UTF-8 без ветвления

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

Можно ли кодировать UTF-8 без ветвлений?

Да.

Вопрос


Натан Голдбаум задал в чате Recurse вопрос:

Я знаю, как декодировать UTF-8 с помощью битовой математики и таблиц поиска (см. https://github.com/skeeto/branchless-utf8), но если я хочу преобразовать кодовую точку UTF-8, то можно ли сделать это без ветвлений?

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

Гессиан больше не нужен. Упрощаем оценку неопределенностей в машинном обучении

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

Привет. Меня зовут Макс, с недавнего времени я занимаюсь в AIRI вопросами ИИ для вычислительной химии и физики. А до того работал в научной группе Т‑Банка, где занимался проблемой неопределенности нейронных сетей. Недавно нашу статью «Identity Curvature Laplace Approximation for Improved Out‑of‑Distribution Detection» приняли на WACV 2025 — престижную конференцию по машинному зрению.

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

Подробнее о новом методе — в тексте ниже.

Читать далее

Что может описывать модель песчаной кучи

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

В 1987 году вышла дебютная научно-популярная книга Джеймса Глика «Хаос. Создание новой науки», впервые опубликованная на русском языке в переводе издательства «Амфора» и выложенная здесь. Эта книга оживила интерес к теории самоорганизующихся систем, сформулированной в середине XX века в работах Германа Хакена (1927-2024) из Штутгартского университета, посвящённых синергетике. Смежные исследования по физике неравновесных систем принадлежат Илье Романовичу Пригожину (1917 - 2003),  франко-американскому физику российского происхождения. В основе этих работ лежит идея о том, что существуют такие системы, нарастающая энтропия в которых постепенно выравнивается, и общая структура системы остаётся относительно неизменной, несмотря на то, что в отдельных частях системы энтропия продолжает нарастать. В том же 1987 году появилось удивительное исследование Пера Бака, Чао Танга и Курта Визенфельда, в котором они описали модель песчаной кучи.    

Феномен связан с изучением и моделированием самоорганизующихся систем и их устойчивости, а также смыкается с исследованием фракталов, степенных рядов и клеточных автоматов. В контексте фракталов эту тему рассматривал на Хабре уважаемый Андрей Заболотский @Browning в статье «Фракталы в песках или больше трёх не собираться». Если желаете вместо моего текста почитать строгое, но вполне популярное и увлекательное изложение данной темы — отсылаю вас к статье уважаемого Никиты Калинина «Песочная модель», размещённой на сайте МФТИ. Под катом я расскажу, как эта модель работает и какие неожиданные вопросы подбрасывает.

Читать далее

Как с помощью deep learning мы построили Геокодер, масштабируемый для разных стран

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

Давным‑давно, когда мир ML состоял из бустингов, линейных моделей и статистических подходов, перед нашей командой API Яндекс Карт стояла задача сделать качественный Геокодер. Это алгоритм, который конвертирует текстовые запросы пользователей в поисковой строке карт в координаты и обратно. Он нужен, когда люди вводят адреса с ошибками, опечатками или народными наименованиями, например «Мяснитская 8». Геокодер должен понять, что имелось в виду «улица Мясницкая, дом 8/2», и вернуть на карте отметку с точной локацией и координатами.

Разработанный для России Геокодер отлично справлялся, но мы хотели найти способ быстро адаптировать это решение к адресным системам других стран. Технологические ограничения не позволяли быстро адаптировать решение, поскольку для каждой страны требовалась разработка собственных правил геокодирования, которые бы учитывали различия и языковые особенности. Однако появление и развитие алгоритмов deep learning открыло новые горизонты: методы active learning, аугментации данных и contrastive learning позволяют значительно улучшить итоговое качество геокодирования и учитывать нюансы различных адресных систем.

В этой статье мы рассмотрим основные этапы и методы построения нового Геокодера, который быстро масштабируется на адресные системы разных стран. Расскажем, что у него под капотом, как именно использовались механизмы deep learning при его создании, с какими проблемами мы столкнулись и как научили его понимать адреса с ошибками и опечатками.

Читать далее

Внимание правильный ответ

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

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

Читать далее

FizzBuzz, который не помог мне найти работу

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

Fizzbuzz — это простой алгоритм, который когда-то был популярен в контексте технических собеседований.

Я знал, что это такое, но до прошлой недели меня ни разу не просили написать его.

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

Базовую реализацию fizzbuzz можно написать однострочником на Typescript:

const fizzbuzz = (n: number)=>`${n%3 ? '' : 'Fizz'}${n%5 ? '' : 'Buzz'}`;

Во время собеседования меня попросили написать fizzbuzz на любом близком мне языке; собеседующий даже сказал, что можно использовать эзотерические языки программирования, но рекомендовал не делать этого, потому что некоторые правила реализовать будет сложно. Этого вполне можно было ожидать, ведь собеседование могло длиться до 45 минут, а обсуждать простой fizzbuzz особого смысла не было. Менять язык программирования после начала собеседования тоже было запрещено.
Читать дальше →

Революция в математическом мышлении малых языковых моделей с rStar-Math

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

В данной статье представлен метод rStar-Math, демонстрирующий способность малых языковых моделей (SLM) достигать конкурентоспособных результатов, сопоставимых и даже превосходящих показатели модели OpenAI o1 в задачах математического рассуждения, без использования дистилляции знаний из более крупных моделей. Ключевой особенностью rStar-Math является применение "глубокого мышления" посредством поиска по дереву Монте-Карло (MCTS), где SLM выступает в роли модели политики, генерируя последовательность шагов решения, а другая SLM оценивает их, действуя как модель вознаграждения за процесс. Представлены три ключевые инновации: метод синтеза данных CoT с расширением кода, новый подход к обучению модели предпочтения процессов (PPM) и стратегия саморазвития. Экспериментальные результаты показывают значительное улучшение математических способностей SLM, подтверждая эффективность предложенного подхода.

Читать далее

Современные техники оптимизации производительности в C++. Кэш-локальность, аллокаторы и параллелизм

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

Как создать быстрый код на C++? Мы будем разбираться в современных техниках оптимизации: кэш-локальности, кастомных аллокаторах и многопоточности. Практические примеры и результаты тестов.

Читать далее

Американские горки — поиск наибольшего паросочетания в двудольном графе

Время на прочтение4 мин
Количество просмотров1.7K
Привет, Хаброжители!

У нас есть три гипотезы:

  • Алгоритмы не должны быть чрезвычайно сложными для понимания!
  • Алгоритмы не скучны и не бесполезны!
  • Интересные книги про алгоритмы могут быть и с примерами кода на Си!

И «Алгоритмы? Аха!» подтверждает наши предположения на своём примере. Увлекательная книга, которая доступно и на ярких примерах объясняет самые актуальные алгоритмы, а примеры написаны на Си, но пусть вас это не пугает.

Посмотрите сами как выглядит страшный «Поиск наибольшего паросочетания в двудольном графе»
image

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

Промпт-инжиниринг: как разговаривать с нейросетью на одном языке

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

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

Никита Грибанов — Data Scientist из компании RAFT, занимается исследованием безопасности. На закрытом эфире для комьюнити Skillbox Code Experts рассказал, что такое LLM и как с ними общаться. Изложили основные мысли в статье.

Читать далее

Отчет о проекте эффективного приоритетного дерева SAPT

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

Отчет о, написанном мною, алгоритмическом статичном двунаправленном дереве, имеющим сложность O(1) по всем параметрам. Не считаю эту статью чем-то выдающимся, никуда не претендую, это всего лишь отчет моей работы. Если вам понравится можете свободно пользоваться.

В качестве небольшого предисловия:
Зачем я спроектировал дерево?

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

Пример профилей поведения будет в конце статьи.

Читать отчет

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

SQL HowTo: пошагово решаем СЛУ (Advent of Code 2024, Day 13: Claw Contraption)

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

В этой челлендж-серии статей попробуем использовать PostgreSQL как среду для решения задач Advent of Code 2024.

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

В этой части совсем простая идея по одновременному решению систем линейных уравнений "пачками".

Читать далее

Идеи о системе ИИ: Система команд. Часть 1

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

Всем привет. Меня зовут Алмаз Хуснутдинов. Я делаю материалы, связанные с созданием ИИ. В этой статье я начну рассказывать про идею о некой системе команд, в основе которой лежит идея о детерминированности работы любой системы.

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

Читать далее

Немного поупражнялся с градиентами

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

Мысль о переходах цветов пришла мне на пробежке.

Я думал о том, что если есть шкала оценок приятия-неприятия по десятибальной шкале, можно сказать — мне нравится что-то от 0 до 10 баллов или мне что-то не нравится от 0 до 10 баллов. Неплохо было бы разукрасить это цветами от зеленого (нравится) до красного (не нравится), посередине желтым.

За 15 минут набросал код первого градиента.

Читать далее

Порталы: как устроен расчёт видимости в Quake

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

Вы когда-нибудь хотели узнать, как работала предварительно вычисленная видимость в Quake? Я хотел, поэтому написал программу vis.py, воссоздающую этот алгоритм на Python. В этой статье представлена вся информация, необходимая для понимания vis, — инструмента, применявшегося в Quake, Half-Life и играх на Source Engine.

В процессе разработки Quake возникла проблема перерисовки (overdraw), то есть многократной записи одного и того же пикселя во время рендеринга кадра. Видимым остаётся лишь последний цвет, а все предыдущие записи оказываются лишней тратой ресурсов. Это плохо, если в вашей игре используется программный рендеринг, и так выжимающий последние соки из компьютера середины 90-х годов.

Как снизить объём перерисовки? Давайте начнём с высокоуровневого обзора возможных решений.

Читать далее

Рекурсия

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

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

Что такое рекурсия?

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

Читать далее

Горизонтальное масштабирование базы данных. Репликация. Партицирование. Шардирование

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

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

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

Читать далее

Один тест, чтобы покрыть весь код, или краткий ликбез о точности библиотек математических функций

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

Привет, Хабр! Эта статья посвящена тестированию точности библиотек математических функций (libm). Мы обсудим, где эти библиотеки используются, почему они должны быть не только высокопроизводительными, но и высокоточными. Поймем, откуда в корректных, на первый взгляд, вычислениях берутся ошибки и как их избежать. Узнаем, как устроено большинство тестов в стандартных математических библиотеках и почему они не всегда работают. И наконец, ответим на вопрос, как одним тестом полностью покрыть код математической функции. Без воды, регистрации и громоздких формул.

Читать далее

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