Как стать автором
Обновить
205.55

Алгоритмы *

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

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

Моделируем флюиды, огонь и дым в режиме реального времени

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

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

Исходный код к этой статье выложен на GitHub.

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

Читать далее
Всего голосов 8: ↑8 и ↓0+11
Комментарии0

Новости

Сравнение алгоритмов ограничения частоты запросов

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

▍ Зачем ограничивать частоту?


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

Видео


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

Конечные точки API тоже часто ограничивают по частоте запросов, чтобы их ресурсы не монополизировал единственный пользователь. Представьте, что вам нужно, чтобы пользователи могли обращаться к затратной конечной точке не чаще ста раз в минуту. Это можно отслеживать при помощи счётчика, обнуляющегося каждую минуту. Все запросы после сотого в пределах этой минуты будут блокироваться. Это один из простейших алгоритмов ограничения частоты, называющийся fixed window limiter (ограничитель с фиксированным окном). Это распространённый способ управления трафиком к сервису.

Но не всегда всё так просто.

Когда начинается и заканчивается каждое одноминутное окно? Если я запущу поток запросов ближе к концу окна, смогу ли превысить лимит? Ёмкость окна восстанавливается по одному запросу за раз, или сразу на всё количество?

В этом посте мы рассмотрим три самых популярных алгоритма, чтобы ответить на каждый из этих вопросов.
Читать дальше →
Всего голосов 22: ↑22 и ↓0+35
Комментарии1

Большие языковые модели гораздо линейнее, чем мы думали

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

Хабр, привет! Это снова Антон Разжигаев, аспирант Сколтеха и научный сотрудник лаборатории Fusion Brain в Институте AIRI, где мы продолжаем углубляться в изучение языковых моделей. В прошлый раз мы выяснили, что эмбеддинги трансформеров-декодеров сильно анизотропны. На этот раз я бы хотел рассказать об их удивительной линейности, ведь нашу статью про обнаруженный эффект («Your Transformer is Secretly Linear») несколько дней назад приняли на международную конференцию ACL!

Читать далее
Всего голосов 32: ↑31 и ↓1+35
Комментарии7

GigaCode и все-все-все. Сравниваем различные ИИ-ассистенты между собой

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

Привет, Хабр! Мы представляем команду GigaCode. В декабре 2023 года наш продукт стал доступен широкой аудитории. До этого GigaCode использовался только внутри компании, и нас часто спрашивали о том, как GigaCode выглядит на фоне других ИИ-ассистентов, как вы сравниваете себя с остальными? Отвечая на эти вопросы, мы начали с простой задачи, которая оказалась не такой уж и простой и вылилась в увлекательное исследование со всем тем, что мы так любим: множеством измерений, математической статистикой и, конечно же, новыми горизонтами. Интересно? Добро пожаловать под кат.

Читать далее
Всего голосов 6: ↑6 и ↓0+6
Комментарии10

Истории

Реализация Streebog256 и Streebog512 на языке RUST

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

Как и планировалось, следом за реализацией семейства хэш-функций SHA, появляется Стрибог и тоже в двух версиях, для 256 и 512 бит на выходе. Надеюсь эта статья будет полезна другим студентам. Более опытные разработчики в комментариях приветствуются.

Весь код сохранен в репозитории GitVerse.

Читать далее
Всего голосов 14: ↑11 и ↓3+10
Комментарии10

Новый прорыв приближает умножение матриц к идеалу

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

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

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

Возьмем, к примеру, умножение матриц или массивов чисел. В 1812 году французский математик Жак Филипп Мари Бине разработал базовый набор правил, которым мы до сих пор обучаем студентов. Это работает прекрасно, но другие математики нашли способы упростить и ускорить процесс умножения матриц.

Читать далее
Всего голосов 43: ↑35 и ↓8+34
Комментарии39

Алгоритмы, вдохновлённые природой

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

В последние годы в нашей повседневной речи плотно закрепилось словосочетание «нейронные сети». Этот термин означает набор методов и программных решений из машинного обучения, дискретной математики и информатики. Но про что совсем часто забывают — он происходит из нейробиологии. Несмотря на очевидное название, нейросети — это не набор операторов IF и ELSE, а модели, вдохновлённые нервной системой живых организмов. Их эффективность в пору, когда у нас есть такие генеративные модели как GigaChat и Kandinsky, наглядно видна каждому. 

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

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

Читать далее
Всего голосов 10: ↑10 и ↓0+19
Комментарии3

Delta-Rle-Huffman (DRH) Texture Format

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

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

Внимание! В статье много картинок.

Кому интересно, добро пожаловать под кат!
Всего голосов 31: ↑30 и ↓1+40
Комментарии16

Двоичный поиск против вероятностного

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

Внутри Dolt, первой в мире базе данных SQL с полнофункциональными возможностями контроля версий, таится много интересной computer science. Недавно я писал о системе хранения Dolt, в ней есть очень тонкая особенность — применение вероятностного поиска на больших выборках 64-битных целых чисел.

В любом учебном плане по Computer Science есть курс алгоритмов. Моим был CS 102, и одним из пунктов, который объяснялся в нём досконально, было то, что поиск — это, по сути, задача O(log2(N)) при условии, если данные отсортированы. За свою карьеру я многократно встречался с этим в том или ином виде — если сортируешь информацию и сохраняешь её, то стоит ожидать, что для поиска потребуется время O(log2(N)). В общем случае мы соглашаемся на время поиска O(log2(N)), потому что оказывается, что можно перебрать большой объём данных с логарифмическим коэффициентом масштабирования. Эта система работает, потому что мы уже почти автоматически сортируем всё заранее.

Но что если мы добавим дополнительные ограничения на наши данные, которые позволят нам выполнять поиск за константное время?

Будет ли эта статья историей о необязательной оптимизации? Да, будет. В этом конкретном случае поиск будет занимать гораздо меньше времени, чем чтение с диска. Мы говорим о величинах менее чем 0,1% от суммарного времени. Будет ли эта статья историей о преждевременной оптимизации? Нет, не будет. Это бы подразумевало, что мы не осознаём, что время тратится не на то. Эта статья — история о заманчивости алгоритма константного времени.

Читать далее
Всего голосов 18: ↑18 и ↓0+25
Комментарии11

Почему для меня так важен алгоритм CORDIC

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

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

Перейду сразу к делу и скажу, почему я так сильно люблю этот алгоритм, а затем займёмся изучением принципов его работы. По сути, фактические операции CORDIC весьма просты — как я уже сказал, это сдвиги и сложение — но выполняет он их путём комбинирования векторной арифметики, тригонометрии, доказательств сходимости и продуманных техник компьютерных наук. Лично я считаю, что именно это имеют ввиду, описывая его природу, как «элегантную».
Читать дальше →
Всего голосов 82: ↑82 и ↓0+108
Комментарии25

Улучшение простого чат-бота: концепция системы команд

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

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

Читать далее
Всего голосов 3: ↑2 и ↓1+3
Комментарии1

Прародитель T1000: алгоритм динамической морфологии мягких роботов

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


Первые роботы, чей внешний вид напоминал Железного Дровосека, постепенно уступают дорогу мягким роботам, спектр применения которых растет с каждым новым исследованием. Мягкие роботы могут оперировать в условиях и средах, которые были бы недостижимы их жестким собратьям. Однако, развитие и совершенствование мягкой робототехники далеко от завершения. К примеру, ученые из Массачусетского технологического института (Кембридж, США) разработали новый метод машинного обучения, который позволит динамически управлять роботами с адаптируемой морфологией. В чем суть данного метода, насколько он эффективен, и где могут быть применены «желеобразные» роботы? Ответы на эти вопросы мы найдем в докладе ученых.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+12
Комментарии0

Многообразие связных списков

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

Связный список — классическая структура данных, которая позволяет быстрые вставки/удаления, но при этом просаживает другие операции (случайный доступ к элементу). Мы пройдёмся от базовой реализации до других возможных вариаций этой структуры данных и, надеюсь, вместе узнаем что‑то новое. Краем глаза увидим возможные применения связных списков. И в конце, для любителей C++, бонус: использование связного списка для сбора диагностики выделений динамической памяти в вашем коде.

Связать себя со знаниями!
Всего голосов 23: ↑23 и ↓0+30
Комментарии7

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

Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
OTUS CONF: GameDev
Дата30 мая
Время19:00 – 20:30
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область

Falang: Low-сode конструктор логики с экcпортом в C++, C#, Rust, Go, TypeScript

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

Полтора года назад я рассказывал про свой пет‑проект по визуальному программированию — falang.io. Основная его особенность состоит в том, что пользователь не управляет расположением икон на схеме, только их содержимым. Все остальные соединительные линии рисуются автоматически алгоритмом по строгим правилам. В т.ч. continue, break, return.

На данный момент, помимо обычных текстовых диаграмм, у меня появился Low‑code констркутор логики с упрощенной семантикой, который может экспортироваться в 5 современных языков программирования: C++, C#, Rust, Go, TypeScript.

Читать далее
Всего голосов 11: ↑11 и ↓0+16
Комментарии9

Коммивояжер на GPU

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

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

Динамическое программирование — это метод решения сложных задач путём разбиения их на более мелкие подзадачи, решение которых легче и проще.

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

Читать далее
Всего голосов 6: ↑6 и ↓0+9
Комментарии20

«Я в топ 4% мира на LeetCode» — это оказалось на удивление просто и недолго

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

Ко мне в коучинг пришёл джентльмен. Чуть меньше 20 лет опыта в разработке. Одна из ключевых задач, которая ему была интересна — Как начать литкодить каждый день?

«То настроения, то сил нету, то задачи не понимаю.. Начинаю раз в полгода и бросаю» — самый обычный набор приколов, которые мешают.

Я предложил ему обернуть всё это в привычку и дисциплину. Я собрал свою методологию прививания привычек основываясь на:

Ежедневно он тратил на Литкод 15–20 минут. Не более. Иногда участвовал в турнирах, которые и зафиксировали результат в топ 4%.

Читать далее
Всего голосов 97: ↑42 и ↓550
Комментарии116

Go напишем шахматный сервер? Часть первая — Введение и пока ни слова про Golang

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

Сегодня мы порассуждаем об одной из самых древних и знаменитых настолок — шахматах. Что вообще нужно для комфортной игры двух человек по сети?

База данных, где будет храниться информация об играх? Удобный и понятный интерфейс? Движок, подсказывающий возможные ходы? Прежде чем хвататься за код, нужно понять, что (кроме возможности играть на расстоянии в тысячи километров) может дать игрокам вычислительная техника оснащённая соответствующим софтом.

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

Предлагаю с этого и начать.

Давайте порассуждаем
Всего голосов 14: ↑12 и ↓2+15
Комментарии8

Ходить как человек: генеративный ИИ и локомоция

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


Глядя на улицы города утром буднего дня, мы видим множество людей, каждый из которых торопливо или размеренно идет куда-то по своим делам, будь то на учебу или на работу. Скорость, особенности шага и общая картина локомоции человеческой ходьбы являются уникальными для каждого человека. При этом обстоятельства окружающей среды имеют немалое влияние на то как ходит человек. Говоря о роботах, мы уже давно научили их ходить, подобно человеку. Однако адаптация к динамическим условиям окружающей среды, особенно настройка скорости в реальном времени, остаются крайне сложной задачей. Ученые из Университета Тохоку (Япония) разработали новую методику обучения роботов, использовав возможности генеративного ИИ. Насколько данная методика была эффективной для обучения роботов, и насколько лучше стала их локомоция? Ответы на эти вопросы мы найдем в докладе ученых.
Читать дальше →
Всего голосов 9: ↑9 и ↓0+17
Комментарии0

Тестирование алгоритма деления больших чисел на С++ с использованием Python C API

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

Ранее был предложен некоторый Алгоритм деления 2W‑битовых чисел с использованием операций над W‑битовыми числами. Для тестирования использовались целые числа языка С++, что не позволяло проверять, например, 128-битные целые числа. Однако, в язык Python встроена поддержка целых чисел неограниченной ширины (Big Integer), а также имеется API для вызова методов Python из программ на языке С/С++. Это позволяет протестировать разные алгоритмы с числами, в том числе деление, используя в качестве результата строковое представление чисел.

В данной статье расписаны шаги для использования Python C API в программе на языке С++, а также показан пример вызова оператора деления двух целых чисел с возвратом результата в виде строки С. Использовалась следующая программная конфигурация:

Читать далее
Всего голосов 6: ↑4 и ↓2+5
Комментарии7

Основы программирования на примере исходного кода MobX

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

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

Читать далее
Всего голосов 15: ↑4 и ↓11-7
Комментарии0
1
23 ...

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