Обновить
274.5

Алгоритмы *

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

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

Кольца Барромео и один забавный алгоритмический баг

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

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

Читать далее

Непостижимая эффективность современных алгоритмов сортировки

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

Предупреждение о возможном конфликте интересов: автор этого документа также является соавтором реализаций ipnsort и driftsort, используемых в стандартной библиотеке Rust.

Сценарий

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

Читать далее

Прокачиваем RAG: тестируем техники и считаем их эффективность. Часть 1

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

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

В данной статье мы разберём основные RAG техники, посмотрим их сильные и слабые стороны, сферы применения, а также немного поэкспериментируем. В следующей части статьи мы проведём тестирование этих техник на реальных пользовательских запросах из датасета Natural Questions и оценим качество работы с помощью RAGAS и BertScore, посмотрим на графики и разойдёмся, чтобы обдумать всё написанное. Поэтому предлагаю начать!

Читать далее

Запуск Computer Science Space

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

Приветствуем любителей компьютерных наук! Хотим рассказать про новую инициативу: 1 марта в Санкт-Петербурге запустился Computer Science Space — открытый научно-технологический клуб для всех заинтересованных в современных и классических областях CS.

Читать далее

Осваиваем LLM: подробное знакомство с книгой Себастьяна Рашки «Строим LLM с нуля»

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

Недавно у меня появилась возможность прочитать книгу Себастьяна Рашки «Строим LLM с нуля», и, начав читать, я просто не мог её отложить.

Эта книга увлекательно сочетает исчерпывающую теорию, практическую реализацию кода и прекрасно и доходчиво объясняет одну из самых актуальных тем в области современного искусственного интеллекта: большие языковые модели (LLM). Как человек, который любит разбираться в тонкостях моделей ИИ, я считаю эту книгу настоящей жемчужиной. Ее обязательно нужно прочитать всем, кто серьезно интересуется LLM. Хочу отметить, что я никак не связан с автором или издателем; эта рецензия является исключительно отражением моего восхищения содержанием книги.

Читать далее

Алгоритмы в повседневной жизни

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

Вы когда-нибудь задумывались, что поиск футболки в шкафу — это O(N), а приготовление ужина — многопоточный процесс с I/O blocking?

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

Станьте архитектором не только кода, но и своей жизни!

Не кликайте, если любите хаос

Создание интерактивного макета. Задача упаковки кругов в круг. Метод отжига

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

Я разработала интерактивный макет для создания композиций цветов. Проблема свелась к задаче упаковки кругов в круг и её автоматизированному решению методом отжига. Расскажу теорию и математически обосную практику с визуальными пояснениями.

Читать далее

Big O

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

Нотация Big O («О» большое) — это способ описания производительности функции без измерения времени ее выполнения. Вместо того, чтобы засекать, сколько секунд выполняется функция от начала до конца, Big O показывает, как меняется время ее выполнения по мере увеличения размера входных данных. Этот подход помогает понять, как программа будет вести себя при разных объемах входящей информации.

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

Читать далее

Как мы ищем рестораны на карте: геоиндекс в Яндекс Еде

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

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

Привет! Меня зовут Серёжа Синягин, я старший разработчик в Яндекс Еде и пишу на C++. В этой статье расскажу о задаче, с которой столкнулся в работе: как мы определяем, какие рестораны доступны пользователю для заказа. По пути заглянем во внутреннюю кухню, обсудим библиотеку H3 от Uber и разберём, как устроены R‑деревья и как мы используем их у себя.

Читать далее

Медианный фильтр на двух бинарных кучах

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

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

В этом тексте я произвел разбор решения LeetCode задачи 480. Sliding Window Median в контексте реализации на языке программирования Си.

Читать далее

Разбираем условия Каруша–Куна–Таккера. Решаем сложно простую задачу

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

Если Вы когда‑то учились в вузе на технической специальности или учитесь сейчас (иначе, зачем бы Вам эта статья), у Вас наверняка есть предмет, который назывался примерно так — «Методы оптимизации» / «Введение в оптимизацию» или что‑то похожее. Задачки там примерно такие: «завод производит продукцию k типов, как бы произвести n_1 деталей первого типа,..., n_k деталей k‑го и как можно дешевле». Потом рассказывалось про симплекс‑метод для задач линейного программирования и про метод Лагранжа для задач нелинейного. Про указанные выше условия где‑то упоминается, но без примеров, где‑то сразу абстрактные примеры с матрицами, а может быть Ваш препод и вовсе написал в своей методичке, мол, это выходит за рамки курса. В этой статье предлагаю аккуратно разжевать на простом примере, что такое условия ККТ.

Что нам позволяют найти условия Каруша‑Куна‑Таккера (ККТ)

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

Читать далее

Альтернативные подходы к решению «Парадокса двух детей»

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

Как‑то раз, просматривая новостную ленту перед работой, я наткнулся на почти ничем не примечательную статью на нашем любимом Хабре. Статья эта очень близко пересказывает страницу из Википедии, которая называется «Парадокс мальчика и девочки». Примечательна эта статья на Хабре лишь тем, что под стандартным и общепринятым решением этой несложной задачи разразился почти что холивар на тему правильности решения/формулировки задачи и адекватности автора.

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

Читать далее

Жадные алгоритмы: когда локальное решение ведёт к глобальной победе

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

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

Что такое жадный алгоритм?

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

Читать далее

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

Как спроектировать кэш-библиотеку нового поколения и не умереть?

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

Всем привет! Меня зовут Алексей Майшев, я работаю Go-инженером в Авито. В этой статье рассказываю, как мы проектировали и разрабатывали кэш-библиотеку следующего поколения для Go — otter

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

Читать далее

Генерация синтетических данных для LLM. Часть 4: теоремы

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

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

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

Читать далее

«Парадокс сестёр», который только кажется простым, и его неожиданное решение

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

В теории вероятностей имеется несколько известных задач, решение которых противоречит здравому смыслу. Одна из таких задач — «Парадокс сестёр». Сейчас я изложу условие задачи, дам вам возможность подумать над ответом, а потом расскажу о том, как её решать.

Читать далее

Мультиплеер в Цивилизации 5

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

Некоторое время назад я участвовал в разработке поддержки мультиплеера для одной глобальной модификации Цивилизации 5 и сегодня хотел бы поделиться здесь некоторыми подробностями о том, как устроена сетевая игра, как всё-таки запустить ее с модами, что с ней вообще не так, и как мы это фиксили.

Читать далее

Программист embedded лезет в FPGA (часть 2, передышка на семисегментниках)

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

В предыдущей статье мы поморгали диодом. Большое дело, вообще‑то. После удобных сред разработки, вроде VSCode, CubeIDE, или продуктов JetBrains (поклонники Vim вышли из чата), Квартус не кажется очень уж дружелюбным. Плюс смена подхода к разработке: от программы к схеме. Но ничего, вроде, справились. Получается, мы погрузились в тему, наверное, на уровне «намочить ноги». Теперь, неспеша, зайдём по щиколотку.

Читать далее

SONAR-LLM — учим нейросети думать предложениями вместо слов

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

Привет, Хабр. Меня зовут Никита Драгунов, я из команды «Интерпретируемый ИИ» лаборатории FusionBrain AIRI. У себя в группе мы активно пытаемся понять, почему большие языковые модели и другие архитектуры ведут себя так или иначе, и разрабатываем инструменты, которые помогают нам в этом разобраться.

Среди прочего нас очень заинтересовал сравнительно свежий подход, в котором предлагается перейти от генерации токенов к генерации целых предложений — Large Concept Models, LCMs. Мы углубились в эту тему и смогли предложить новый способ, как использовать идею LCM эффективнее.

О том, что мы сделали — в статье ниже.

Читать далее

Книга: «Алгоритмы и структуры данных для тех, кто ненавидит читать лонгриды»

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

Привет, Хаброжители! Алгоритмы — это сердце программирования. От их правильного выбора зависит, будет ли программа работать мгновенно или заставит вас ждать вечность. Но как разобраться во всем этом, если вы только в начале пути?

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

Читать далее

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