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

Алгоритмы *

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

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

Пишем LR(0)-анализатор. Простыми словами о сложном

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

Введение



Добрый день.
Не нашел простого и внятного описания данного алгоритма на русском языке. Решил восполнить сей пробел. Прежде всего что это такое? LR(0)-анализатор в первую очередь это синтаксический анализатор. Цель синтаксического анализатора обработать входной поток лексем(базовые элементы языка, которые производит лексический анализатор на основе входного потока символов, примеры лексем — число, запятая, символ) и сопоставить его с описанием языка заданного в определенном формате. Сопоставление заключается в построении определенной структуры данных, чаще всего — дерева. Дальше эта структура пойдет на следующий этап — семантический анализ, где уже компилятор пытается понять смысл, заключенный в дереве.

Существует 2 класса синтаксических анализаторов — восходящие анализаторы и нисходящие. Первые строят дерево начиная с листьев, которые являются входными лексемами, вторые соответственно наоборот начинают с корня дерева. Собственно LR и значит то, что анализатор будет читать поток слева направо (L — 'Left') и строить дерево снизу вверх (пусть не смущает буква R, которая значит Right, объяснения даны чуть ниже). Индекс 0 обозначает то что мы не предпросматриваем следующие лексемы, а работаем только с текущей. Какие же плюсы даёт нам выбор этого типа анализаторов?
  • Он быстр.
  • Покрывает множество языков. То есть если вы придумали язык и описали его, то с большой долей вероятности LR-анализатор его сможет обработать.
  • Синтаксические ошибки обнаруживаются так быстро как это возможно. Сразу же как встречается символ, который не соответствует предыдущему входному потоку, мы можем вывести ошибку об этом.

Есть и недостатки:
  • Относительная сложность построения.
  • Можно вогнать анализатор в ступор неоднозначностью описания языка.


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

Упрощенный алгоритм Бойера-Мура

Время на прочтение3 мин
Количество просмотров58K
Прочитав статью об алгоритмах поиска подстроки в строке, я обнаружил, что там не рассказывается об алгоритме Бойера-Мура. Пара слов о нём всё-таки там есть, а именно, говорится, что алгоритм Бойера-Мура заслужил себе звание «алгоритма по умолчанию», потому что он в среднем дает лучшее время поиска (с чем я полностью согласен). Под катом рассказано об упрощенной версии этого алгоритма. В принципе, большинство скорее всего изучало этот алгоритм на 1-м или 2-м курсе ВУЗа (как и я), поэтому они могут пропустить эту статью, ничего нового тут нет.
Читать дальше →

Алгоритмы сжатия изображений

Время на прочтение8 мин
Количество просмотров87K
Легко подсчитать, что несжатое полноцветное изображение, размером 2000*1000 пикселов будет иметь размер около 6 мегабайт. Если говорить об изображениях, получаемых с профессиональных камер или сканеров высокого разрешения, то их размер может быть ещё больше. Не смотря на быстрый рост ёмкости устройств хранения, по-прежнему весьма актуальными остаются различные алгоритмы сжатия изображений.
Все существующие алгоритмы можно разделить на два больших класса:
  • Алгоритмы сжатия без потерь;
  • Алгоритмы сжатия с потерями.

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

Распознавание некоторых современных CAPTCHA

Время на прочтение15 мин
Количество просмотров79K
Именно так называлась работа, представленная мной на Балтийском научно-инженерном конкурсе, и принёсшая мне очаровательную бумажку с римской единичкой, а также новенький ноутбук.

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

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

Поиск пути в гексагональной сетке (AS3)

Время на прочтение2 мин
Количество просмотров14K
imageЭта статья представляет собой описание компонента HexaPath, реализующего поиск пути по алгоритму А* в гексагональной сетке. В сети мной было найдено большое количество описаний алгоритма на примере квадратной сетки и некоторое количество реализаций, но ни одного упоминания о шестиугольной сетке. И я написал свою реализацию. Выкладываю исходники. Вдруг кому-нибудь понадобится это, а писать самому будет лень.

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

Нечёткий поиск в тексте и словаре

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

Введение


Алгоритмы нечеткого поиска (также известного как поиск по сходству или fuzzy string search) являются основой систем проверки орфографии и полноценных поисковых систем вроде Google или Yandex. Например, такие алгоритмы используются для функций наподобие «Возможно вы имели в виду …» в тех же поисковых системах.

В этой обзорной статье я рассмотрю следующие понятия, методы и алгоритмы:
  • Расстояние Левенштейна
  • Расстояние Дамерау-Левенштейна
  • Алгоритм Bitap с модификациями от Wu и Manber
  • Алгоритм расширения выборки
  • Метод N-грамм
  • Хеширование по сигнатуре
  • BK-деревья
А также проведу сравнительное тестирование качества и производительности алгоритмов.
Читать дальше →

Как сделать из 123456789 число 100 или 0

Время на прочтение5 мин
Количество просмотров138K
В «Занимательной арифметике» известного популяризатора наук Якова Исидоровича Перельмана в конце первой главы я нашел пример следующих «Арифметических курьезов»:

100 = 1+2+3+4+5+6+7+8*9
100 = 12+3-4+5+67+8+9
100 = 12-3-4+5-6+7+89
100 = 123+4-5+67-89
100 = 123-45-67+89

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

Задача RMQ — 1. Static RMQ

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

Введение



Задача RMQ весьма часто встречается в спортивном и прикладном программировании. Удивительно, что на Хабре ещё никто не упомянул эту интересную тему. Попробую восполнить пробел.

Аббревиатура RMQ расшифровывается как Range Minimum (Maximum) Query – запрос минимума (максимума) на отрезке в массиве. Для определённости мы будем рассматривать операцию взятия минимума.

Пусть дан массив A[1..n]. Нам необходимо уметь отвечать на запрос вида «найти минимум на отрезке с i-ого элемента по j-ый».



Рассмотрим в качестве примера массив A = {3, 8, 6, 4, 2, 5, 9, 0, 7, 1}.
Например, минимум на отрезке со второго элемента по седьмой равен двум, то есть RMQ(2, 7) = 2.

В голову приходит очевидное решение: ответ на каждый запрос будем находить, просто пробегаясь по всем элементам массива, лежащим на нужном нам отрезке. Такое решение, однако, не является самым эффективным. Ведь в худшем случае нам придётся пробежаться по O(n) элементам, т.е. временная сложность этого алгоритма – O(n) на один запрос. Однако, задачу можно решить эффективнее.

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

Фонетические алгоритмы

Время на прочтение9 мин
Количество просмотров46K
Фонетические алгоритмы сопоставляют двум словам со схожим произношением одинаковые коды, что позволяет осуществлять сравнение и индексацию множества таких слов на основе их фонетического сходства.

Часто довольно трудно найти в базе нетипичную фамилию, например:
— Леха, поищи в нашей базе Адольфа Швардсенеггера,
Шворцинегира? Нет такого!
В этом случае использование фонетических алгоритмов (особенно в сочетании с алгоритмами нечеткого сопоставления) может значительно упростить задачу.

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

В этой статье я рассмотрю наиболее известные алгоритмы, такие как Soundex, Daitch-Mokotoff Soundex, NYSIIS, Metaphone, Double Metaphone, русский Metaphone, Caverphone.
Читать дальше →

Рейтрейсер четырёхмерного пространства

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

Недавно я делал простой рейтрейсер 3-х мерных сцен. Он был написан на JavaScript и был не очень быстрым. Ради интереса я написал рейтрейсер на C и сделал ему режим 4-х мерного рендеринга — в этом режиме он может проецировать 4-х мерную сцену на плоский экран. Под катом вы найдёте несколько видео, несколько картинок и код рейтрейсера.

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

Неортогональная БИНС для малых БПЛА

Время на прочтение7 мин
Количество просмотров33K
БИНС
По правилам сокращений в заголовке не должно быть, но расписав сокращения я превратил бы заголовок в аннотацию. Так что вот…
  • БИНС — бесплатформенная инерциальная навигационная система
  • БПЛА — беспилотный летательный аппарат
  • ОЧ — ось чувствительности датчика

Речь в статье пойдет о навигационной системе, в которой ОЧ датчиков ориентированы неортогонально, т.е. расположены под некоторым, ненулевым, углом к осям системы координат, связанной с БПЛА. Особенность таких БИНС в том, что по информации от каждого из датчиков можно получить значения всех трех компонент угловой скорости (для гироскопов) и линейного ускорения (для линейных акселерометров) объекта.
Статья написана как дополнение к Строим мультикоптер, часть вторая. Целью является описание одного из способов борьбы с дрейфом нуля в дешевых датчиках.
Для чего нужна избыточность читать тут...

B-tree

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

Введение


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

Основные операции в деревьях выполняются за время пропорциональное его высоте. Сбалансированные деревья минимизируют свою высоту (к примеру, высота бинарного сбалансированного дерева с n узлами равна log n). Большинство знакомо с такими сбалансированными деревьями, как «красно-черное дерево», «AVL-дерево», «Декартово дерево», поэтому не будем углубляться.

В чем же проблема этих стандартных деревьев поиска? Рассмотрим огромную базу данных, представленную в виде одного из упомянутых деревьев. Очевидно, что мы не можем хранить всё это дерево в оперативной памяти => в ней храним лишь часть информации, остальное же хранится на стороннем носителе (допустим, на жестком диске, скорость доступа к которому гораздо медленнее). Такие деревья как красно-черное или Декартово будут требовать от нас log n обращений к стороннему носителю. При больших n это очень много. Как раз эту проблему и призваны решить B-деревья!

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

SSP — Собственный алгоритм сжатия изображений без потерь

Время на прочтение6 мин
Количество просмотров6.3K
Наконец–то появилась возможность опубликовать разработанный мною когда-то алгоритм. Алгоритм был разработан для программы автоматического снятия скриншотов. Для удобства дальнейшего его описания буду называть его – SSP (sciner screenshot packer). SSP можно справедливо сопоставить PNG, поэтому в статье я буду проводить сравнения именно с ним.

Алгоритм имеет два режима компресии:
  1. без потерь – в котором, изображения после декомпресии будет восстановлено с точностью до бита;
  2. с потерями – который не уменьшает качества картинки, просто в нем непосредственно перед сжатием, изображение переводится палитру YcbCr
    Только лишь за счет изменения палитры удается существенно улучшить сжатие. Использую следующие коэффициенты:
    cY = 0.30078125 * R + 0.5859375 * G + 0.11328125 * B
    cCb = -0.171875 * R - 0.33984375 * G + 0.51171875 * B + 128
    cCr = 0.51171875 * R - 0.4296875 * G - 0.08203125 * B + 128
Читать дальше →

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

Математическая морфология

Время на прочтение6 мин
Количество просмотров61K
Воспользовавшись поиском, я с удивлением обнаружил, что на Хабре совсем нет статей, описывающих аппарат математической морфологии, а ведь этот аппарат незаменим в области низкоуровневой обработки изображений. Если вам это интересно, прошу под кат.
Читать дальше →

Двадцать вопросов, которые помогают разработать алгоритм

Время на прочтение5 мин
Количество просмотров8.4K
Как разработать алгоритм, решающий сложную задачу? Многие считают, что для этого нужно «испытать озарение», что процесс этот не вполне рационален и зависит от творческой силы или таланта.

На самом деле решение любой задачи сводится к сбору информации о наблюдаемом объекте. Причем этот принцип применим как для решения самых сложных научно-исследовательских задач, так и для решения прикладных задач. Работа изобретателя напоминает не столько работу волшебника, сколько путешествие первооткрывателя по неизведанной территории. Главное качество хорошего изобретателя – умение собирать информацию.

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

Четырехмерный рендеринг: особенности, проблемы, варианты решения

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


В комментариях к статье «Рейтрейсер на JavaScript» ее автор ankh1989 рассказал о планах написать рейтрейсер для четырехмерного пространства. Кое-какие свои мысли на эту тему я попробую изложить здесь.

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

Весенний семестр 2011 в Computer Science клубе в Санкт-Петербурге и Екатеринбурге

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


Весенний семестр в Computer Science клубе будет довольно алгоритмическим.

Курсы


В. Л. Ерухимов
Компьютерное зрение и библиотека OpenCV
Санкт-Петербург
3 пары, начало: 20.02
Д. Н. Москвин
Системы типизации лямбда-исчисления
Санкт-Петербург
12 пар, начало: 27.02
Ф. Фомин
Параметризованные
алгоритмы

Санкт-Петербург
4 пары, начало: 19.03
М. Бабенко
Линейное программирование
Санкт-Петербург
10 пар, начало: 16.04
М. Н. Вялый
Квантовые алгоритмы: возможности и ограничения
Санкт-Петербург
10 пар, начало: 02.04
П. Браславский
Анализ поисковых запросов
Екатеринбург
3 пар, начало: 13.05
Д. С. Перевалов
Что может и не может компьютерное зрение с OpenCV
Екатеринбург
2 пары, начало: 17.02
М. Ю. Хачай
Теоретические основы распознавания образов
Екатеринбург
6 пар, начало: 03.03
А. М. Райгородский
Случайные графы и алгоритмы
Екатеринбург
6 пар, начало: 18.03
М. А. Ройтберг
Анализ символьных последовательностей
Екатеринбург
6 пар, начало: 21.04


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

Защита JPEG от повторного сжатия

Время на прочтение1 мин
Количество просмотров2.6K
Многие фотохостинги и веб-прокси пережимают файлы JPEG для ускорения загрузки. В связи с этим у специалистов из Кембриджа появилась идея адаптировать известный алгоритм Товальдса по защите купюр от копирования к JPEG-изображениям. Они разработали сетку, которая генерирует муар при повторном сжатии (демонстрация на примере Google WAP прокси).
Оригинальное изображение После рекомпрессии
Если вы находитесь за файрволом с рекомпрессиией, то надпись VOID будет на обоих изображениях.
Читать дальше →

Поиск подстроки и смежные вопросы

Время на прочтение13 мин
Количество просмотров125K
Здравствуйте, уважаемое сообщество! Недавно на Хабре проскакивала неплохая обзорная статья о разных алгоритмах поиска подстроки в строке. К сожалению, там отсутствовали подробные описания каких либо из упомянутых алгоритмов. Я решил восполнить данный пробел и описать хотя бы парочку тех, которые потенциально можно запомнить. Те, кто еще помнит курс алгоритмов из института, не найдут, видимо, ничего нового для себя.
Читать дальше →

Lua vs. JavaScript

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

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

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

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