Все потоки
Поиск
Написать публикацию
Обновить
211.03

Алгоритмы *

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

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

Случайности не случайны

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

Можно ли достоверно предсказать будущее хоть на немного вперед? Иногда - вполне, надо только много везения... или немного знаний.

Сегодня пронаблюдаем сеанс черной магии с последующим разоблачением, или «Я угадаю твой рандом с 3 строк!»

Читать далее

Ленивые операции над множествами в C++

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

В C++ нет понятия "множество". Есть std::set, но это всё-таки конкретный контейнер. Есть функции для работы с упорядоченными диапазонами: merge, inplace_merge, includes, set_difference, set_intersection, set_symmetric_difference, set_union, но это алгоритмы, они не ленивые, и при вызове сразу вычисляют результат. К тому же они предназначены для работы строго с двумя диапазонами.


Что же делать, если, во-первых, диапазонов много (больше двух), а во-вторых, мы хотим вычислять результат не сразу, а по необходимости?


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


В публикации Ленивые итераторы и диапазоны в C++ я разбирал, что такое ленивые диапазоны.
Читать дальше →

Ленивые итераторы и диапазоны в C++

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

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


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


Хотя, в некотором смысле, и в стандартной библиотеке ленивые итераторы уже есть давно (см. std::reverse_iterator).

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

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

Мы создали Web приложение для определения лиц и масок для Google Chrome (часть 1)

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

Основная цель - обнаружение лица и маски в браузере, не используя бэкенд на Python. Это простое приложение WebApp / SPA, которое содержит только JS-код и может отправлять некоторые данные на серверную часть для следующей обработки. Но начальное обнаружение лица и маски выполняется на стороне браузера и никакой реализации Python для этого не требуется.

На данный момент приложение работает только в браузере Chrome.

Читать далее

Tesseract vs таблицы. Распознавание документов

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

В данной статье описан пример распознавания сложного документа с таблицами с помощью tesseracta.

Читать далее

Компилируем математические выражения

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

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

1. Арифметические операции, тригонометрия, и другие численные функции.

2. Булева алгебра (логика), логические операторы (и, или, и т. д.), а так же знаки сравнения.

3. Произвольные типы в качестве входных, выходных, и промежуточных.

Приятного чтения!

Читать далее

Разгоняем JS-парсер с помощью WebAssembly (часть 3: SIMD)

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

В предыдущей статье мы остановились на варианте, который с помощью SWAR-хинта превращает 8 последовательных цифр в одно числовое 32bit-значение. Но что если мы предположим, что все значения у нас, в основном, невелики - до 3 цифр? Тогда нам вполне достаточно использовать всего лишь 32bit-инструкции, а SWAR будет выполнен за 2 операции вместо 3 - сплошной выигрыш!

Давайте перепишем наш код так, чтобы первый блок из 4 символов обрабатывался 32bit-инструкциями, а второй блок из 8 символов, если понадобится - уже 64bit-инструкциями.

И... вместо 29ms получаем 31ms! Значит, наше предположение относительно длины чисел не оправдалось, и в первом блоке выгоднее обрабатывать сразу побольше символов.

То есть больше размерность регистра - лучше? И такие регистры есть - это 128-битные SSE-регистры XMM - в WebAssembly они доступны нам как переменные с типом v128 и суперскалярные операции над ними.

Читать далее

Студенческая Лунная площадка может помочь NASA совершить посадку на Луну

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

Лунная посадочная площадка студенческой команды может помочь астронавтам НАСА избежать рискованных посадок на Луну

Когда НАСА впервые отправило людей на Луну, астронавты часто совершали рискованные слепые посадки на лунную поверхность из-за вздымающихся облаков пыли, которые поднимались во время их спуска. Астронавты могли бы избежать повторения этих мучительных опытов во время будущих миссий на Луну с помощью 3D-печатной лунной посадочной площадки, разработанной студенческой командой НАСА.

Посадочная площадка, разработанная студентами из 10 американских университетов и колледжей, имеет форму, минимизирующую лунные пылевые облака, вызванные посадкой ракет, и в конечном итоге может быть изготовлена из реголита, найденного на Луне. Прототип пусковой площадки планируется запустить в начале марта в Кэмп-Свифте, штат Техас, под бдительным присмотром студентов и инженеров НАСА, чтобы провести испытания ракеты горячим огнем.

«Мы показали, что можем напечатать структуру в 3D с помощью нашего существующего прототипа», — говорит Хелен Карсон, студентка факультета материаловедения и инженерии Вашингтонского университета в Сиэтле и главный исследователь команды Lunar PAD. —До сих пор у нас есть большая гибкость с различными направлениями, которые мы можем выбрать в зависимости от того, как развиваются материалы».

Лунная посадочная площадка студенческой

4K страницы: навсегда, на веки вечные

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

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

Но, "для нас нет ничего святого"(С), попробуем выяснить почему именно 4К, изменится ли что-то если сделать 8К, 64К... Зачем вообще фиксировать конкретный размер, почему не сделать страницы произвольной (в пределах разумного) длины.

Читать далее

Вычисление динамических объектов по вектору

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

Допустим, у нас есть набор объектов с некими данными, и нам нужно произвести манипуляции с этими объектами.

Положим, самый обычный пример - наполнить корзинку фруктами. Мы реализуем некий класс Сart, в который будем складывать фрукты. Далее нам понадобиться базовый класс Fruit, для того, чтоб определить параметр объема, которому мы будем присваивать значение в зависимости от фрукта.

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

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

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

Читать далее

Параллелизм и плотность кода

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

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

Естественным перед началом анализа будет указание ограничений на ширину и глубину исследований. Принимаем, что многозадачность в рассматриваемых параллельных системах осуществляется простейшим путём - перегрузкой всего блока (связки) выполняющихся операторов (одновременное выполнение операторов разных программ не предполагается) или же система работает в однозадачном режиме; в противном случае высказанное в предыдущей фразе утверждение может быть неверным. Минимизация   объёма устройств временного хранения данных (описано здесь) проводиться не будет. На этом этапе исследований также не учитываются  задержки времени на обработку операторов и пересылку данных между ними (для системы SPF@home формально эти параметры могут быть заданы в файлах с расширениями med и mvr).

В предыдущей публикации была описана технология получения ПВПП на основе модели потокового (Data-Flow) вычислителя. Обычно считают, что правила выбора операторов для выполнения в такой машине подчиняются логике действия некоторых сущностей, совместно выполняющих определённые  действия – “актёров” (actors); при этом естественным образом моделируются связанные с характеристиками времени параметры обработки операторов. В общем случае при этом отдельные операторы выполняются асинхронно.  В публикации показано, что описанный принцип получения ПВПП приемлем (при выполнении несложных условий) и для машин архитектуры VLIW (Very Long Instruction Word, сверхдлинное машинное слово),  отличающихся требованием
одновременности начала выполнения всех операторов в связке. В расчётах использовали модель ILP (Instruction-Level Parallelism,  параллелизм  уровня машинных команд).

Читать далее

Все дело в виртуальном «прянике»: Uber создал алгоритм, способный обыграть человека в игре Atari

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

В ИИ-лаборатории Uber AI Labs создали новое семейство алгоритмов Go-Explore. В основе алгоритма — обучение с подкреплением. По эффективности Go-Explore превосходит большинство существующих разработок при испытании на классических играх Atari 1980-х годов.

ИИ от Uber прошел в общей сложности 11 самых сложных игр, в том числе Montezuma’s Revenge и Pitfall. По сумме набранных очков он обошел людей. Разрабатывается алгоритм не ради игр: в ближайшем будущем алгоритм можно будет применять для обучения в робототехнике, обработке естественных языков, создания новых лекарств и т.п. Что лежит в основе алгоритма?
Читать дальше →

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

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

Привет! Меня зовут Дмитрий, и я хочу рассказать про нашу статью “Balancing Rational and Other-Regarding Preferences in Cooperative-Competitive Environments”, которую недавно приняли на конференцию AAMAS (A*). 

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

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

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

Навигатор для пешеходов

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

Мы строим пешеходные маршруты по тропинкам, через калитки и с возможностью срезать через двор с апреля 2017 года. А совсем недавно мы добавили в 2ГИС полноценный навигатор для пешеходов — с режимом turn-by-turn и озвучкой важных точек на маршруте.

Под катом — история о том, как мы хотели решить эту задачу по-быстрому, опираясь на экспертизу в навигации для авто, а в итоге придумывали новые сценарии, боролись за размер баз и учились давать правильные инструкции.
Читать дальше →

Что нового в AngouriMath 1.2?

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

Спустя 210 дней, 600 коммитов, десятки дебажных ночей и тысячи сообщений в обсуждениях проекта, я таки выпустил релиз AngouriMath 1.2.

Это небольшая опен-сорсная библиотека символьной алгебры для C# и F#, но вдруг кому-нибудь интересно?

Читать далее

Рубрика «Читаем статьи за вас». Сентябрь — октябрь 2020 года

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

Привет, Хабр! Продолжаем публиковать рецензии на научные статьи от членов сообщества Open Data Science из канала #article_essense. Хотите получать их раньше всех — вступайте в сообщество!

Статьи на сегодня:

1. A Better Use of Audio-Visual Cues: Dense Video Captioning with Bi-modal Transformer (Tampere University, Finland, 2020)
2. Fast Bi-layer Neural Synthesis of One-Shot Realistic Head Avatars (Samsung AI Center, 2020)
3. Enhancing the Locality and Breaking the Memory Bottleneck of Transformer on Time Series Forecasting (University of California, USA, 2019)
4. Whitening for Self-Supervised Representation Learning (University of Trento, Italy, 2020)
5. MelGAN: Generative Adversarial Networks for Conditional Waveform Synthesis (Lyrebird AI and University of Montreal, 2019)
6. StyleFlow: Attribute-conditioned Exploration of StyleGAN-Generated Images using Conditional Continuous Normalizing Flows (KAUST, Adobe, 2020)

Читать далее

Генетический алгоритм для сегментаций строк в рукописном документе

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

Генетический алгоритм (GA)

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

Цель

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

Читать далее

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

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

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

В этой статье я хочу представить ряд техник, которые помогут повысить шансы вашего резюме на рассмотрение. В этом практическом примере мы будем использовать алгоритмы обработки текстов на естественных языках (Natural Language Processing, NLP), Python и ряд визуальных инструментов библиотеки Altair. Итак, готовы нанести ответный удар по кадровикам?

Приятного чтения!

Серебряная пуля для кремлевского демона

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

image


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

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

Шахматные алгоритмы, которые думают почти так же, как человек, только лучше

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

Когда создавались первые вычислительные машины, их воспринимали только как дополнение к человеческому разуму. И до недавнего времени так и было. Программисты учили компьютеры играть в шахматы с 1960-х годов. И тогда победа у игрока-новичка уже считалась большим прогрессом. О серьёзных матчах даже не задумывались.

В 1980-х программа Belle достигла рейтинга Эло в 2250 пунктов, что примерно соответствует рейтингу мастера спорта. И с того времени развитие компьютерных шахмат вышло на совершенно новый уровень. 

Сначала честь человечества не смог защитить Гарри Каспаров в 1996 году, а сегодня уже создана нейросеть с рейтингом около 5000 Эло, что в разы превосходит даже сильнейших игроков.

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

Приятного чтения

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