Обновить
231.94

Алгоритмы *

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

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

Алгоритм анонимной коллективной подписи

Время на прочтение5 мин
Количество просмотров13K
Одним из способов протеста является подача и коллективное подписание разного рода петиций. Но поскольку список подписавших петицию открыт, нередко возникают ситуации, когда несогласные с «курсом партии» подвергаются угрозам и репрессиям со стороны администрации.

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

Постановка задачи

Имеется ограниченный круг лиц, например, студенты института, сотрудники организации или граждане страны. Часть из них подписывают некоторое сообщение (петицию, коллективное обращение и т.п.). Предлагаемый алгоритм подписания обладает следующими свойствами:
  1. Есть возможность удостовериться, что каждый подписант принадлежит к указанному кругу лиц.
  2. Есть возможность проверить, что большинство подписей принадлежат разным лицам.
  3. Нет возможности определить, кому именно принадлежит та или иная подпись.
  4. Нет возможности определить, оставляло ли данное конкретное лицо свою подпись или нет.
  5. Любой подписант может по своему желанию поставить вместо анонимной подписи персонализованную.
  6. Любой анонимный подписант может впоследствии по своему желанию предоставить доказательства того, что именно он поставил подпись.


Система основана на асимметричной криптографии, алгоритмах цифровой подписи и сертификации ключей.
Читать дальше →

Проект «робот-грузчик»: определение собственного местоположения

Время на прочтение12 мин
Количество просмотров18K
У моего давнего британского партнёра (именно для него два года назад писалось «Распознавание почтовых адресов») появилась новая идея по оптимизации бизнес-процессов: коробки по складу должны возить роботы, а грузчики — только перекладывать товары с робота на полку и обратно. Смысл, естественно, не в том, чтобы за каждым роботом по пятам шёл грузчик, и принимался за погрузку-разгрузку, как только робот остановится — а чтобы роботов было намного больше, чем грузчиков, и чтобы роботы большую часть времени стояли в конечной точке своего маршрута, ожидая погрузки. Тогда грузчик будет лишь переходить от одного робота к следующему, нагружая каждый, и не будет тратить рабочее время на переноску товаров.

Предыстория


В прошлом году мы экспериментировали с платформой самоходного пылесоса Roomba. Новенький пылесос обошёлся нам около £300 (подержанный можно найти за £100 и даже дешевле), и в его состав входят два электропривода на колёса, два датчика касания спереди, инфракрасный датчик снизу (для обнаружения ступенек) и сверху (для поиска зарадной станции). Точный перечень датчиков зависит от модели: в протоколе предусмотрено до четырёх инфракрасных датчиков снизу, каждый из которых возвращает один бит («пол виден/не виден»). В любом случае, никаких дальномеров: все имеющиеся датчики однобитные. Кроме того, никаких «программируемых ардуин» в Roomba нет, и чтобы им управлять, нужно установить сверху лаптоп (или ардуину) и общаться с роботом по RS-232. Поигравшись с пылесосом вдоволь, мы так и оставили его пылиться на одной из полок склада.

В этом году мы решили попробовать Microsoft Robotics Development Studio (MRDS), для продвижения которого Microsoft сформулировала спецификацию «MRDS Reference Platform» — набор оборудования и протокол управления «стандартным» роботом. Эта спецификация позволила бы роботолюбам создавать совместимых роботов и переносить между ними программы. По сравнению с аппаратным оснащением пылесоса, Reference Platform намного сложнее и мощнее: в спецификацию включён Kinect, три ИК-дальномера и два ультразвуковых, а также датчики вращения колёс (encoders). Реализацию MRDS RP пока что предлагает только фирма Parallax под названием Eddie (порядка £1000, не включая Kinect). Необычайное сходство Eddie с фотографиями робота-прототипа в спецификации MRDS RP наводит на мысли, что спецификация создавалась в тесном сотрудничестве с Parallax, иначе говоря — Parallax удалось добиться, что Microsoft приняли их платформу за эталонную.

Кроме разнообразия датчиков, Eddie обладает механически впечатляющей платформой (заявленная грузоподъёмность 20кг, а мощности моторов достаточно, чтобы толкать впереди себя складской погрузчик) и программируемым контроллером Parallax Propeller, т.е. критические куски кода можно зашить непосредственно в робота, а не только командовать им с компа.
Читать дальше →

Конкурс по алгоритмам компьютерного зрения. Призы достаются всем

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


Ровно месяц назад мы объявляли конкурс на создание приложения, реализующего несколько алгоритмов машинного зрения. Главным призом в этом конкурсе была поездка с нашей командой на Шри-Ланку для встречи либо конца света 21 декабря, либо Нового года (это уже как повезет). Но мы больше надеемся на Новый год и в любом случае постараемся организовать трансляцию с места событий.

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

Я и мои коллеги в Ivideon очень не хотели бы, чтобы кто-то из тех кто принял участие в нашем конкурсе пожалел о потраченном на него времени. И здесь речь идет о 9 потенциальных кандидатах, приславших работы.
Поэтому мы приняли решение, что 8 человек, которые по тем или иным причинам не заняли первое место — получат за свой труд мегапиксельную IP-камеру с поддержкой облака Ivideon на борту. Для тех кто не знает, это обычная IP-камера, в которой есть наш модуль, позволяющий напрямую подключать её к облаку Ivideon без дополнительных приложений и компьютеров. Мы не производим сами камеры. Мы предоставляем возможность встроить этот модуль всем производителям. Для удаленного доступа к такой камере не требуется внешнего IP-адреса и сетевых настроек вроде port-forwarding. Ну и она обладает всеми возможностями, которые предоставляет Ivideon. От записи видео в наше облако, до организации трансляции на своем сайте или в блоге. Очень надеемся, что эта камера станет достойной компенсацией за потраченное на наш конкурс время. Тем более помимо неё участники получили как минимум дополнительный опыт в разработке приложений видеоанализа.

Под катом подробности прошедшего конкурса.

Проверка принадлежности точки невыпуклому многоугольнику

Время на прочтение5 мин
Количество просмотров38K
Проверить принадлежность точки невыпуклому многоугольнику за линейное время совсем не сложно. Один из самых распространенных методов — выпустить луч и посчитать число точек пересечения. Однако, при этом нужно аккуратно рассматривать случаи, когда точки многоугольника попадают на луч. Отсюда естественно возникает вопрос, как рассмотреть эти случаи проще всего?
Дать волю пефекционизму

История тернарного оператора

Время на прочтение2 мин
Количество просмотров12K
Да, во он ? :, давайте разберемся почему он именно такой, а не другой. Единственное питонщикам не будет столь интересно это читать ибо у нас них он выглядит так:

print True if 1 > 2 else False

Четко и понятно «в лоб», с появлением его в python читал в блогах много рассуждений почему он такой, где же стандартный ? : подобный.

Давайте разберемся…
Читать дальше →

Подделываем вашу подпись при помощи шарнирного механизма. Теорема Кемпе

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

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

Декартовы деревья по неявному ключу + сжатие пространства

Время на прочтение3 мин
Количество просмотров3.6K
Прежде чем читать эту статью, нужно понимать, что такое декартово дерево по неявному ключу (это тема не одной статьи, поэтому об этом лучше почитать тут). Сжатие пространста — метод, используемый для сжатия на отрезке данных. Например, вместо того, чтобы хранить множество {1, 1, 1, 2, 2, 2, 3, 1, 1} будем хранить {1 x 3, 2 x 3, 3 x 1, 1 x 2}.
Теперь попробуем сжимать пространство с помощью такого метода и иметь возможность выполнять онлайн операции с любым отрезком.
Читать дальше →

Прецизионный поворот растрового изображения на произвольный угол

Время на прочтение8 мин
Количество просмотров58K
Поворот растрового изображения на углы, кратные 90°, относительно геометрического центра изображения – задача тривиальная и решается без потери качества простым преобразованием координат каждого пикселя.

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

Ниже мы рассмотрим алгоритм прецизионного поворота растрового изображения на произвольный угол относительно произвольного центра с минимальными потерями.

Выражаю благодарность Харченко Владиславу Владимировичу за оказанную помощь.
Читать дальше →

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

Время на прочтение2 мин
Количество просмотров61K
В буддизме есть понятие просветления.

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




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

Это как в компьютерной игре набрать чит-код и прокачать своего персонажа.
И, похоже, у буддистов есть проверенный способ.

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

Строим Nested Set дерево без рекурсии

Время на прочтение3 мин
Количество просмотров83K
Деревья в базах данных можно хранить тремя основными методами: Adjacency List, Matherialized Path & Nested Set. Когда мы хотим переехать с AL на NS, это можно сделать с помощью рекурсии (если БД расово верная). Но что делать в случае MySQL?
Переехать с AL на NS

Прогресс в разработке нейросетей для машинного обучения

Время на прочтение3 мин
Количество просмотров44K
В пятничном номере NY Times опубликована статья о значительных успехах, который демонстрируют в последние годы разработчики алгоритмов для самообучаемых нейросетей. В глубоких структурах есть несколько скрытых слоёв, которые традиционно тяжело было обучать. Но всё изменилось с использованием стека из машин Больцмана (RBM) для предварительной тренировки. После этого можно удобно перенастраивать веса, применяя метод обратного распространения ошибки (backpropagation). Плюс появление быстрых GPU — всё это привело к существенному прогрессу, который мы наблюдаем в последние годы.

Сами разработчики не делают громких заявлений, чтобы не поднимать ажиотаж вокруг нейросетей — такой, как в 1960-е годы поднялся вокруг кибернетики. Тем не менее, можно говорить о возрождении интереса к исследованиям в этой области.
Читать дальше →

Про двумерную упаковку: offline алгоритмы

Время на прочтение12 мин
Количество просмотров72K
Сегодня, дорогой Хабр, я расскажу тебе историю о комбинаторной оптимизации.
Издревле (как минимум, с начала прошлого века) математики задавались вопросом, как оптимально разместить некоторое количество пива нужных и полезных предметов в рюкзаке. Была сформулирована задача о ранце и ее подзадачи — тысячи их! — которые заинтересовали информатиков, криптографов и даже лингвистов.

От задачи о ранце отпочковалась задача об упаковке в контейнеры (Bin Packing Problem), одной из разновидностей которых является задача двумерной упаковки (2-Dimensional Bin Packing). Снова отбросив несколько вариаций, мы наконец придем к двумерной упаковке в полуограниченную полосу (2-Dimensional Strip Packing, 2DSP). Чувствуете, сколько интересного уже осталось за кадром? Но мы еще не закончили продираться сквозь классификацию. У 2DSP есть два варианта входных данных: когда набор упаковываемых объектов известен заранее (offline-проблема) и когда данные поступают порциями (online-проблема).

В этой статье рассматриваются алгоритмы решения offline-варианта 2DSP. Под катом немного матчасти и много картинок с цветными квадратиками.

В чем, собственно, проблема?


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

Предварительная обработка речевых сигналов с помощью Matlab

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

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

Типичная величина одного интервала — 25,6 мс. Соседние интервалы берутся со смещением относительно предыдущего интервала. Применяемая величина перекрытия интервалов равна 10 мс. В результате предварительной проработки каждого из указанных интервалов получаем вектор из нескольких десятков спектральных значений.
Читать дальше →

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

Конкурс «Интернет-математика: Яндекс.Карты» — опыт нашего участия и описание победившего алгоритма

Время на прочтение12 мин
Количество просмотров42K
Прошло уже больше года после завершения конкурса "Интернет-математика: Яндекс.Карты", но нас до сих пор спрашивают об алгоритме, который принёс нам победу в этом конкурсе. Узнав о том, что недавно Яндекс объявил о старте очередной "Интернет-математики", мы решили поделиться опытом нашего прошлогоднего участия и описать наш подход. Разработанный алгоритм смог с точностью 99.44% правильно определить лишние изображения в сериях панорамных снимков, например, как здесь:



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

Исходный код нашего решения доступен на github (C++ с использованием OpenCV).
Читать дальше →

Keccak, новый стандарт хеширования данных

Время на прочтение10 мин
Количество просмотров63K
Доброго времени суток, уважаемые читатели.
Многие из вас наверняка знают о том, что на протяжении нескольких лет NIST проводил конкурс среди хеш-функций с целью принятия нового стандарта SHA-3. И в этом году награда нашла своего героя. Новый стандарт был благополучно принят.
Ну а раз стандарт уже принят, самое время посмотреть что же он из себя представляет.
И тихим, субботним вечером, я обложившись мануалами открыв в браузере google.com начал свое небольшое исследование.
Читать дальше →

Интерполяция + (линейная | логарифмическая) шкала + С++

Время на прочтение15 мин
Количество просмотров82K
Понадобилось мне как-то сделать интерфейс для загрузки в микроконтроллер график функции «сопротивление -> температура» (график решили задавать по нескольким точкам, а потом их интерполировать). По ходу дела выяснилось, что график будет оч-чень нелинейным (180 Ом -> 100o, 6 000 Ом -> 0o, 30 000 Ом -> -30o). Поэтому пришлось мне погрузиться в тему логарифмических шкал… и сразу вынырнуть, так как я не нашел того, что мне нужно. А нужно-то мне было всего лишь понять математику (и реализацию на С++) таких дел. ЧуднО — вроде такая нужная тема, а не расписано! Ну да ладно — мозги заскрипели и вспомнили высшую математику из университета, и программа была написана. Решил описать я свои мытарства тут — может, кому пригодится.

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

Осторожно: в тексте много графики!
Читать дальше →

Простой хромакей по цветовой компоненте RGB

Время на прочтение2 мин
Количество просмотров24K
Все чаще и чаще нам на глаза попадается использование хромакея в самых неожиданных местах. Долго свербила мысль попробовать реализовать что-то свое.
Читать дальше →

Разбор картинки в текст: простой алгоритм

Время на прочтение2 мин
Количество просмотров35K
Корни истории уходят в те годы, когда один из кланов древней текстовой игры «Бойцовский клуб» заказал у меня, молодого программиста на Perl, капчу для игры. Пара бессонных ночей — и четыре ровных цифры готовы вместе с проверкой ввода.



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

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







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

Генерация числа прописью из любого произвольного числа

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

Талмуд по формулам в Google SpreadSheet

Время на прочтение13 мин
Количество просмотров421K
Обычно мы пишем про хостинги, в частности про зарубежный shared хостинг в США. Но чтобы писать, нужно иметь аналитические данные под рукой. Вот как раз тут требуется помощь Google Docs, если файл получится предположительно меньше 400 000 строк.

За несколько месяцев работы с таблицами Google пришлось много раз анализировать посредством формул разного рода данные. Как и ожидалось — то, что можно было решить в MS Excel, можно реализовать и в Google таблицах. Но многочисленные попытки решить проблемы с помощью любимого поисковика приводили только к новым вопросам и почти к нулевым ответам.
Посему, было решено облегчить жизни другим и прославить себя.

Кратко о главном


Для того чтоб Excel, либо spreadsheet (таблица Google) поняли что написанное — это формула, необходимо поставить знак "=" в строку формул (Рисунок 1).

ok
Рисунок 1
Далее, начинаем писать формулу с клавиатуры либо выделяем мышкой те ячейки, с которыми мы собираемся работать.
Читать дальше →

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