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

Алгоритмы *

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

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

Недистрибутивность деления, или Как я считал среднюю величину

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


Казалось бы: сложно отыскать формулу проще, чем нахождение среднего арифметического. Однако код — не формула, вдобавок, если вы пишете на С++, то разного (и в основном неприятного) рода сюрпризы могут ожидать вас где угодно.

Постановка задачи: реализовать функцию uint32_t average(uint32_t a, uint32_t b), не используя типов шире, чем uint32_t, и затем обобщить этот подход на произвольное количество аргументов.
Посмотреть, что из этого вышло

Как мы создали новую технологию маршрутизации для пешеходов и велосипедистов

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

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

Меня зовут Антон Овчинкин, я руководитель разработки пешеходной и транспортной навигации в Картах. Я расскажу, как мы научили алгоритмы обходить промзоны, создали ML‑модель расчёта времени в пути с учётом светофоров и подъёмов, а ещё — как связана пешеходная маршрутизация и подсчёт калорий.

Читать далее

Архитектурный паттерн для централизованной обработки ошибок в хендлерах на Go

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

В данной статье представлен авторский подход к унификации и централизации механизма обработки ошибок в HTTP-обработчиках веб-сервисов, разработанных на языке Go. Статья подробно рассматривает ограничения традиционных методов обработки ошибок, ведущие к дублированию кода и снижению поддерживаемости. Предлагается новый архитектурный паттерн, включающий использование специализированной сигнатуры функций-обработчиков, кастомного типа ошибки HTTPError для инкапсуляции статуса ответа, сообщения для клиента и внутренней ошибки для логирования, а также Middleware-адаптера для интеграции с фреймворками net/http и Gin. Данный подход демонстрирует повышение читаемости кода, упрощение отладки и обеспечение консистентности ответов API, что представляет собой значимый вклад в практику разработки бэкенд-сервисов на Go.

Читать далее

Работа с семантическими сетями с помощью пакета AabSemantics

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

AabSemantics - простой, но функциональный движок для работы с семантическими сетями, написанный под .NET. Под катом - описание проекта и его базовых механик.

Читать далее

Как одной математической формулой определить цвет ячейки на рулетке?

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

Однажды моя девушка проходила курс по основам python. Она показала мне небольшую задачку на использование if-else: "по номеру кармана (ячейки) на рулетке определите его цвет".

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

Читать далее

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

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

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

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

Читать далее

Постквантовые криптостандарты США на алгоритмы электронной подписи на основе хеш-функций с сохранением состояния

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

Приветствую, Хабр! В моей предыдущей статье были описаны принятые в прошлом году стандарты США FIPS (Federal Information Processing Standard — Федеральный стандарт обработки информации — аналог стандартов ГОСТ Р в России) на постквантовые алгоритмы электронной подписи (FIPS 204 и FIPS 205) и инкапсуляции ключей (FIPS 203). Данные криптостандарты были приняты в результате тщательного анализа и отбора алгоритмов в рамках открытого конкурса, проводимого Институтом стандартов и технологий США NIST; данный конкурс также был описан в предыдущей статье.

Стандарты FIPS 203 [1] и FIPS 204 [2] описывают алгоритмы, основанные на применении структурированных алгебраических решеток, тогда как алгоритм, стандартизованный в FIPS 205 [3], базируется на стойкости нижележащих хеш‑функций; данный алгоритм называется Stateless Hash‑Based Digital Signature Algorithm (SLH‑DSA) — алгоритм электронной подписи на основе хеширования без сохранения состояния. Стоит сказать, что данные алгоритмы стали не первыми постквантовыми криптоалгоритмами, стандартизованными в США, — еще в 2020 году в США был издана «специальная публикация» (SP — Special Publication — аналог рекомендаций по стандартизации в России) NIST SP 800–208 [4], описывающая несколько алгоритмов электронной подписи с сохранением состояния, также основанных на хеш‑функциях.

Далее в статье — описание и схемы алгоритмов, описанных в NIST SP 800–208, а также небольшой анализ особенностей алгоритмов данного класса.

Читать далее

Вычислить VS запомнить — простой и экономичный пример организации обработки потока и данных для физической симуляции

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

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

Читать далее

Сложение точек эллиптической кривой в числах, как на калькуляторе

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

Принципы реализации математических концепций прикладной криптографии полезно рассматривать в числах. Эллиптические кривые представляют собой один из важнейших элементов криптографии (и современной теоретической математики тоже). На всякой эллиптической кривой можно складывать точки. Эта операция составляет основу многих криптосистем. Например, ECDH. В этой статье мы возьмём конкретное, - но обозримое, - уравнение кривой, посмотрим на формулы и проведём прямые вычисления, чтобы убедиться, что всё работает так, как предполагалось. В статье много чисел и есть пример на Rust.

Читать далее

Как алгоритм Recovering Difference Softmax (RDS) делает рекомендации и уведомления точнее и эффективнее

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

Алгоритм Recovering Difference Softmax (RDS) — полноценный подход к оптимизации уведомлений и контента для повышения вовлеченности пользователей. Алгоритм выбирает единственно лучший вариант, удерживая пользователей дольше и возвращая их чаще.

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

Как RDS превращает простые сигналы в рост вовлечённости? Разбираемся в статье!

Читать далее

Что не так? Три парадокса теории вероятностей

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

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

Казалось бы, детская задачка, где нужно просто “вспомнить формулу”, но всё не так однозначно. Если задать этот вопрос прохожему, он, скорее всего, скажет ½. Преподаватель математики, возможно, ответит ⅓. Кто из них прав?

В каком-то смысле, правы оба. Просто каждый представляют себе свой способ, как была получена информация о ребёнке. На самом деле это и есть условие задачи. Только скрытое. 

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

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

В этой статье — три таких истории. В первой один и тот же факт даёт разные вероятности, если по-разному устроено наблюдение. Во второй один и тот же объект может быть “случайным” множеством способов. А в третьей невозможно придумать, как сделать задачу математически строгой.

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

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

Читать далее

Повышаем эффективность хранения данных до 300 раз с помощью таблиц SCD-2

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

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

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

Разберем, что из себя представляют Slowly Changing Dimensions-2 (далее SCD-2) таблицы и самостоятельно реализуем на PySpark алгоритм сохранения данных в них. Попутно поговорим о том, как находить изменения в любой таблице, даже если отсутствуют поля для выбора изменившихся записей, и научимся получать из созданной SCD-2 таблицы срезы на требуемую дату в прошлом.

Читать далее

Еще чуть-чуть быстрее ищем кратчайший путь на Python

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

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

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

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

Читать далее

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

Поднимайте If вверх, опускайте For вниз

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

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

Поднимайте If вверх

Если внутри функции есть условие if, то подумайте, нельзя ли его переместить в вызывающую сторону:

// ХОРОШО

fn frobnicate(walrus: Walrus) {

... }

// ПЛОХО

fn frobnicate(walrus: Option<Walrus>) {

let walrus = match walrus {

Some(it) => it,

None => return,

};

...

}

В подобных примерах часто существуют предварительные условия: функция может проверять предусловие внутри и «ничего не делать», если оно не выполняется, или же может передать задачу проверки предварительного условия вызывающей её стороне, а при помощи типов (или assert) принудительно удовлетворить этому условию. Подъём проверок вверх, особенно в случае предварительных условий, может иметь лавинообразный эффект и привести к уменьшению общего количества проверок. Именно поэтому и возникло это правило.

Читать далее

NEAT. Основы

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

Сегодня изучим "теорию" NEAT, который появился в далёком 2004-м году, но при этом остается мейнстримом среди нейроэволюционных алгоритмов. Мы разберём классический вариант, так как это основа и все остальные варианты(CoDeepNEAT, HyperNEAT и т.д.) будут намного сложнее в имплементации, то есть шанс применить за разумное время обычному человеку стремится к нулю и понять их без изначального варианта представляется почти невозможным.

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

Читать далее

Задача с эмодзи

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

Сложность текста: 2-3/5

Необходимые знания: должно быть достаточно основ теории многочленов, например, формул Виета

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

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

Естественно, настоящим математикам это надоело. В начале 2017 года на Reddit появился пост с заголовком «Меня утомила вся эта фейсбучная фруктовая математика. Хочет кто-нибудь придумать действительно сложную математическую задачу, чтобы побороться с этим явлением?».

Читать далее

Решето дельт — простой способ раскладывать числа на множители, о котором вам не рассказывали

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

Что вы скажете, если я расскажу вам, что знаю метод разложения чисел на множители, который не так сложен, как алгоритмы QS и GNFS, основывается не на магии, а на логике и простых арифметических принципах, легко реализуется, его легко распараллелить для ускорения вычислений, он не требует много памяти и при этом зачастую в разы эффективнее метода Ферма́? Заинтересовало?

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

Примеры, объяснения, таблицы — всё на месте. Даже если вы забыли, что такое \bmod, вы всё равно поймёте, как это работает.

Читать далее

Делаем ландшафт на основе реальных данных

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

Я долгое время занимаюсь построением 3D копий городов в проприетарном игровом движке на основе картографических данных. Суммарно это сложная задача, успех выполнения которой заключется в решении небольшого набора больших проблем. Одной из таких проблем является отрисовка точного ландшафта на основе реальных данных. Далее я постараюсь расказать обо всех R&D этапах и технических особенностях, с которыми пришлось столкнуться, а вконце будет несколько сравнений сгенерированного ландшафта с фотографиями реальных мест.

Читать далее

Проверка високосности года в трёх командах CPU

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

Показанным ниже кодом вы можете проверить на високосность год в интервале 0 ≤ y ≤ 102499 всего примерно тремя командами CPU:

bool is_leap_year_fast(uint32_t y) {

return ((y * 1073750999) & 3221352463) <= 126976;

}

Как это работает? Ответ на удивление сложен. В статье я объясню процесс; в основном он связан с забавным битовым жонглированием. В конце мы обсудим применение этого кода на практике.

Читать далее

Основные алгоритмы сортировки. Разбираемся с танцами (это не шутка)

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

Два распространенных алгоритма могут ускользать от понимания. В чем отличие разбиения в быстрой сортировке и похожих «магических» движений в сортировке слиянием? Меня это долго сбивало с толку. Разберемся же с ними наконец!
Читать дальше →

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