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

Алгоритмы *

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

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

Атаки по времени — сказка или реальная угроза?

Время на прочтение4 мин
Количество просмотров34K
Первую статью на хабр хотел написать совершенно о другом, но в один прекрасный день коллега по работе решил заморочиться и сделать защиту от «Атаки по времени» (Timing attack). Не долго разбираясь в различных материалах на эту тему, Я загорелся и решил написать свой велосипед и покататься на нем по лаборатории поэкспериментировать.



Результат этого небольшого эксперимента под катом.
Читать дальше →

Программа курса «Multicore programming in Java»

Время на прочтение3 мин
Количество просмотров53K
Добрый день.
Меня зовут Головач Иван, я руковожу небольшой образовательной компанией. Мы занимаемся онлайн курсами программирования.

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

Хотелось бы услышать мнение сообщества по поводу
  1. программы курса «Multicore programming in Java»
  2. литературы к курсу

Кратко о курсе: стартует 28 апреля (в связи с майскими праздниками старт перенесен на 15 мая), ведется в режиме вебинаров дважды в неделю в 19.00-22.00, состоит из 16 лекций по 2.5 часа (=40 лекционных часов), к каждой лекции дается расширенное задание, рассчитан на Java Junior/Middle.
Читать дальше →

Динамические деревья

Время на прочтение8 мин
Количество просмотров37K
Перед прочтением статьи рекомендую посмотреть посты про splay-деревья (1) и деревья по неявному ключу (2, 3, 4)

Динамические деревья (link/cut trees) мало освещены в русскоязычном интернете. Я нашел только краткое описание на алголисте. Тем не менее эта структура данных очень интересна. Она находится на стыке двух областей: потоки и динамические графы.

В первом случае динамические деревья позволяют построить эффективные алгоритмы для задачи о поиске максимального потока. Улучшенные алгоритмы Диница и проталкивания предпотока работают за и соответственно. Если вы не знаете, что такое поток, и на лекциях у вас такого не было, спешите пополнить свои знания в Кормене.

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

Перед тем, как нырнуть под кат, попробуйте решить следующую задачу. Дан взвешенный граф в виде последовательности ребер. По последовательности можно пройти только один раз. Требуется посчитать минимальное покрывающее дерево, используя памяти и времени. По прочтении статьи вы поймете, как легко и просто можно решить эту задачу, используя динамические деревья.
Читать дальше →

Поиск решений для игр со словами. Применение бора

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

Вступление


Существует множество игр, где игроку необходимо искать слова из определенного набора букв. Вот две наиболее популярные из них.
1. 4 фото 1 слов (4 Pics 1 Word) AppStore, Google Play
У этой игры довольно много реализаций, но идея у всех одна.
2. Словомания (Wordsmania) AppStore, Google Play
Читать дальше →

Используйте поиск по хешу, а не обыск массива

Время на прочтение3 мин
Количество просмотров29K
Довольно-таки часто встречается задача: проверить, совпадает ли строка с другими строками из набора. Например, вам нужно проверить каждое слово из сообщения на форуме на предмет того, не содержится ли оно в списке запрещённых. Распространённое решение: создать массив со списком запрещённых слов, а затем с помощью функции in_array() делать проверку. Есть способы повысить производительность такого алгоритма.
Читать дальше →

Конечное и бесконечное в математике. Лекция Павла Кожевникова для старшеклассников в Яндексе

Время на прочтение3 мин
Количество просмотров29K
В отличие от окружающего нас мира, в котором всё конечно, в математике мы часто сталкиваемся с бесконечными объектами. Например, бесконечны множества целых, рациональных, алгебраических, конструктивных или действительных чисел. На лекции мы рассмотрим задачи, в которых проявляются некоторые принципы работы с бесконечными множествами. Иногда эти принципы сильно отличаются от тех, к которым мы привыкли в случае «конечного» мира.


Конспект лекции

Алгоритмы о выборе дороги и сетях. Сети Штейнера. Лекция Владимира Протасова в Яндексе

Время на прочтение6 мин
Количество просмотров36K
Сегодня мы поговорим об одной из первых задач теории больших сетей, которая может быть решена полностью на самом простом базовом уровне, но которая от этого не становится менее интересной. Это задача о кратчайшей системе дорог или задача Штейнера.

Впервые она появилась, когда еще никаких практических надобностей для больших сетей не было: в тридцатые годы XX века. На самом деле Штейнер начал ее изучать еще раньше, в XIX веке. Это была чисто геометрическая задача, практические приложения которой стали известны только несколько десятилетий спустя.

Разговор пойдет о той области математики, которая впоследствии выросла в теорию больших сетей и разбилась на несколько областей. Это прикладная отрасль, которая задействует очень много методов из других математических дисциплин: дискретной математики, теории графов, функционального анализа, теории чисел и т.д. Бурное развитие теории больших сетей пришлось на конец девяностых и начало двухтысячных годов. Связано это конечно, с прикладными задачами: развитием интернета, мобильной связи, транспортных задач для больших городов. Кроме того теория сетей используется в биологии (нейронные сети), при построении больших электронных плат и т.п.



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

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

Реализация стеганографического метода Коха-Жао на Ruby

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

Алгоритм Коха-Жао для встраивания информации использует частотную область контейнера и заключается в относительной замене величин коэффициентов дискретного косинусного преобразования (ДКП). Изображение разбивается на блоки размерностью 8×8 пикселей и к каждому блоку применяется ДКП. Каждый блок пригоден для записи одного бита информации.
Читать дальше →

RASW: Улучшаем метод Виолы-Джонса

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

От переводчика:


Доброго времени суток!
Недавно я искал способы повышения скорости работы детектора Виолы-Джонса и натолкнулся на интересную статью 2013 года «RASW: a Run-time Adaptive Sliding Windowto Improve Viola-Jones Object Detection». В ней представлен эффективный подход к улучшению работы детекторов, основанных на принципе сканирующего окна и каскадных классификаторах. Я не нашел описания данного подхода на русском языке и решил восполнить этот пробел. В данном переводе я опустил описание алгоритма Виолы-Джонса, так как о нём уже много рассказано, в том числе и на хабре habrahabr.ru/post/133826.
Читать дальше →

Анимированные графики в R (и немного про бифуркацию, хаос и аттракторы)

Время на прочтение4 мин
Количество просмотров20K
Однажды для презентации мне понадобились анимированные графики. С графиками, собственно, проблем не возникло, а для их анимации пришлось воспользоваться еще одним пакетом animation, который можно установить из CRAN.
Читать дальше →

Arduino: ИК-управление бытовой техникой

Время на прочтение5 мин
Количество просмотров30K
Здравствуй хабрачитатель! Меня зовут Константин и я программист, а именно занимаюсь программированием систем «Умный дом».
За четыре года работы в этой области, довелось попробовать много интересных контроллеров и ПО для решения задач домашней автоматизации. Одними из интереснейших устройств с которыми мне приходилось иметь дело — это устройства компании Global Cache серии IP2IR. Их предназначение состоит в том что-бы принять текстовую команду от клиента и излучить ее через светодиод ик-спектра.
Использование подобных устройств упрощает жизнь пользователям сразу по нескольким направлениям:
  • в качестве ПДУ можно использовать планшеты, телефоны и ПК (с небольшой оговорочкой, нужен специальный софт);
  • управление можно централизовать т.е. специальный софт можно поднять на сервере и обращаться к нему;
  • в прицельной стрельбе нет необходимости, если с телевизором, например, таких проблем нет (мы в него и так смотрим), то вот для устройств вроде Blu-Ray проигрывателей или MediaServer'ов это может стать проблемой в случае если они заперты в шкафу или работают в режиме мультирум;
  • одна кнопка ПДУ может выполнить целый макрос, например включить телевизор и Blu-Ray, затем переключить ТВ на нужный источник, например HDMI1, и пользователь может вообще не париться о том где и как у него подключены устройства.

Такая игрушка жизнь конечно упрощает, но и по карману тоже бьет, если мне не изменяет память, то GlobalCache для управления тремя устройствами стоит порядка 6000-7000 деревянных рублей. Не очень гуманное ценообразование, вот и было решено сделать собственную реализацию подобного устройства.
Читать дальше →

Как мы спасали глаза с OpenCV

Время на прочтение10 мин
Количество просмотров35K
Материалы этого поста задержались с выходом в свет на 4 месяца. Мы — молодая команда разработчиков, и только учимся нарушать dead-лайны, но кажется, что получается уже неплохо. Предыстория в этой статье, где мы и обещали выложить продолжение. Рассказ пойдёт о том, как же наше приложение работает (или не работает, решать читателю).

Какое приложение? Мы — команда проекта Viewaide (бывший EyeDoc) и пишем софт, который при помощи веб-камеры определяет параметры усталости глаз и выводит уведомления, задача которых снизить риск ухудшения зрения вследствие долгой работы у монитора. Чем 100 раз услышать, лучше 1 раз увидеть.



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

НАСА объявило конкурс компьютерных алгоритмов

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


На сайте TopCoder размещён новый конкурс NASA Asteroid Grand Challenge Series. Задача конкурса — помочь в решении проблемы астероидов, которые могут врезаться в Землю и уничтожить человеческую расу. Конкретно, от программистов требуется разработать новые алгоритмы распознавания астероидов на изображениях с земных телескопов.
Читать дальше →

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

Модель Random Forest для классификации, реализация на c#

Время на прочтение18 мин
Количество просмотров51K
Доброго времени суток, читатель. Random Forest сегодня является одним из популярнейших и крайне эффективных методов решения задач машинного обучения, таких как классификация и регрессия. По эффективности он конкурирует с машинами опорных векторов, нейронными сетями и бустингом, хотя конечно не лишен своих недостатков. С виду алгоритм обучения крайне прост (в сравнении скажем с алгоритмом обучения машины опорных векторов, кому мало острых ощущений в жизни, крайне советую заняться этим на досуге). Мы же попробуем в доступной форме разобраться в основных идеях, заложенных в Random Forest (бинарное дерево решений, бутстреп аггрегирование или бэггинг, метод случайных подпространств и декорреляция) и понять почему все это вместе работает. Модель относительно своих конкурентов довольно таки молодая: началось все со статьи 1997 года в которой авторы предлагали способ построения одного дерева решений, используя метод случайных подпространств признаков при создании новых узлов дерева; затем был ряд статей, который завершился публикацией каноничной версии алгоритма в 2001 году, в котором строится ансамбль решающих деревьев на основе бутстреп агрегирования, или бэггинга. В конце будет приведен простой, совсем не шустрый, но крайне наглядный способ реализации этой модели на c#, а так же проведен ряд тестов. Кстати на фотке справа вы можете наблюдать настоящий случайный лес который произрастает у нас тут в Калининградской области на Куршской косе.

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

BitSorting Алгоритм со сложностью О(n)

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

Предыстория


В свободное от работы время решил поразмыслить, а нельзя ли создать алгоритм соритировки который имел бы сложность O(n) не занимал бы много дополнительной памяти и мог бы быть легко распараллелен. И добился некоторого результата.
Читать дальше →

Об особенностях реализации префиксного энтропийного кодирования для больших алфавитов

Время на прочтение4 мин
Количество просмотров10K
Думаю, всем читателям хабра хорошо известны алгоритмы энтропийного сжатия с использованием префиксных кодов (алгоритмы Шеннона-Фано, Хаффмана и др.). Особенностью этих алгоритмов является тот факт, что длина кода определённого символа зависит от частоты этого символа в закодированном сообщении. Соответственно при декодировании сообщения необходимо иметь таблицу частот. Данная статья посвящена рассмотрению малоизученной, но важной задачи – передаче частот исходного алфавита.
Читать дальше →

Как использование случайности может помочь сделать ваш код быстрее? Лекция Михаила Вялого в Яндексе

Время на прочтение5 мин
Количество просмотров28K
И сила и слабость современных компьютеров в том, насколько они точны. Сегодня в нашей серии лекций от Яндекса рассказ о том, как использование случайностей может помочь сделать вычисления более эффективными.

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



Лекцию читает старший научный сотрудник Вычислительного центра им. А.А. Дородницына РАН, доцент кафедры математических основ управления МФТИ, кандидат физико-математических наук Михаил Вялый.

Начнём с самого простого. Представим, что у нас есть два калькулятора. Один обычный, а у второго есть дополнительная кнопка, которая при нажатии выдает дополнительный бит. Попробуем ответить на вопрос, полезна ли будет такая функция?
Читать дальше →

Дайкстра от Тима из Стэнфорда

Время на прочтение2 мин
Количество просмотров16K
На прекрасной Coursera скоро снова начинается курс по Алгоритмам от Тима из Стэнфорда. И я не могу про него не написать. А в свете вот этого поста про дистанционное образование так тем более.

Начну с того, что это самый интересный курс, который мне вообще когда-либо приходилось брать. А я провела во всяких не самых худших университетах немало лет. Курс называется Algorithms: Design and Analysis. Рассказывается в курсе про разные алгоритмы для графов, обсуждаются подходящие структуры данных для каждого алгоритма, присутствует теория и краткие доказательства этих алгоритмов. Во второй части рассказывается в том числе про P=NP проблему и алгоритмы с неполиномиальным временем.

Почему этот курс мне так понравился. Потому что лектор невероятно классный! Он настолько вовлечен, он так все это рассказывает. И потом каждую неделю надо запрограммировать новый алгоритм (на языке по собственному выбору) и найти с помощью своей имплементации ответ на вопрос. Ответ на вопрос засабмитить на сайте, и еще раз, пока не получится правильный ответ. Каждую неделю, как я сказала, новый алгоритм. И соответственно дедлайны. Мотивировало меня это просто сумасшедше: я бежала домой с работы и я не расставалась с алгоритмами по выходным, я ездила в отпуск, сидела на вершине самой высокой точки страны и программировала merge sort.

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

Дальше - больше, и с примером

Концепт «правильного» определения случайного победителя

Время на прочтение3 мин
Количество просмотров117K
Здравствуйте.

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

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

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

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

Я же считаю, что системы должны быть спроектированы таким образом, чтобы совершить нечто неправильное в них не было возможно, поэтому…

Один из вариантов привнесения в систему справедливости...

Можем ли мы доверять решению компьютера, если не можем его проверить?

Время на прочтение1 мин
Количество просмотров20K
Если помните, Рей Курцвейл обещал приход сингулярности уже в 30 годах этого века. Похоже, что первые предвестники уже появляются: два бывших наших соотечественника, Алексей Лисица и Борис Конев, работающие в Ливерпульском университете, запустили на расчет задачу несоответствия Эрдеша. Задача считается неразрешенной, и программа, запущенная исследователями с задачей справилась. Но! Проблема в том, что доказательства решения сами по себе занимают 13 Гб (еще раз, текстовый лог-файл, по сути и являющийся доказательством, занимает 13 Гб) и с трудом поддается верификации. Отсюда напрашивается простой вопрос – можем ли мы доверять решению компьютера, если не в состоянии проверить его выкладки?


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

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