Обновить
256K+

Алгоритмы *

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

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

Построение regexp'a по входным строкам S1..SN

Время на прочтение3 мин
Охват и читатели2.2K
Вот совершенно недавно столкнулся с задачкой, по которой не смог накопать не то, чтобы каких либо библиотек, но даже теории или алгоритмов. Т.к. время поджимало, решил сам разбираться с задачей. Написал статью для тех, кто с подобной задачей столкнется в будущем, да и интресна критика. Как бы вы решали подобную задачу?

Итак, задача ...


На входе алгоритма есть набор строк S1..SN. Требуется, по данным строкам построить такое минимальное регулярное выражение R, чтобы R(Si)=true, i [1,N] (N порядка нескольких тысяч).
Требование минимальности — не строгое, и доказывать минимальность построенного regexp'a не требуется. Если строки S1..SN обладают некоторой схожей структурой, то regexp должен выявлять эту структуру. Стандартное задание программисту — в меру конкретизировано, но и с некоторой свободой действий.
Читать дальше →

GridStack ­— Пример практического применения flex+bison

Время на прочтение31 мин
Охват и читатели11K
В последнее время на Хабре появились несколько статей, посвящённых грамматическому разбору выражений.
И это замечательно! По моему скромному мнению, каждый программист должен хоть раз в жизни написать разбор выражения. Постараюсь и я внести свою лепту в общее дело.

Методов разбора существует множество (рекомендую следующий обзор Dick Grune, Ceriel J. H. Jacobs — Parsing Techniques: A Practical Guide, ISBN 0-13-651431-6). Причём реализации методов варьируются от полностью ручных до использования автоматизированных генераторов, таких как bison, antlr, lemon и других.
В то время, как ручное написание лексических и синтаксических (далее я буду называть из лексер и парсер) разборов позволяет достичь максимальной скорости и контроля (особенно над ошибками и способами их преодоления), использование генераторов позволяет сосредоточиться непосредственно на задаче, облегчает модификацию грамматики и бережёт время. Умение владеть такими инструментами позволяет чаще прибегать к DSL (Domain Specific Language) и вообще видеть возможность их применения.

Я хочу привести пример использования bison (парсер) и flex (лексер) в реальной жизни: от возникновения задачи, до её решения.

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

Prett Parsing — метод Вогана Пратта для разбора выражений

Время на прочтение3 мин
Охват и читатели6.6K
В тему компиляций и вычислений выражений.

В далёком 1973 году Воган Прэтт (Vaughan Pratt) предложил простой и эффективный метод разбора выражений, не использующий ни автоматы, ни грамматику как таковую.

Идея заключается в том, что каждый символ (token) наделяется свойствами:
lbp = приоритет связывания символа слева,
nud = функция, определяющая результат применения оператора в начале выражения,
led = функция, определяющая результат применения в середине выражения.

Основной разбор осуществляется по схеме:
разбор(приоритет продолжения):
    вытолкнуть символ из входного потока
    результат = вызов nud этого символа
    пока приоритет lbp следующего в потоке символа > приоритета продолжения:
        вытолкнуть символ из входного потока
        результат = применени led этого символа к текущему результату

Константы и переменные имеют приоритет связывания 0, а функция nud возвращает их значение (или ссылку). Поэтому применение разбора к константам сразу возратит их значение.
Для бинарных операторов функция led рекурсивно вызывает продолжение разбора (справа) вплоть до более низкого приоритета, и делает что-нибудь с уже накопленым (слева) результатом, и полученным рекурсивно.
Результат применения оператора аггрегируется для внешнего вызова.
Много-арные операторы — получают аргументы дополнительным вызовом функции разбора.
Префиксные операторы делаются с помощью определения для них функции nud.
Для правостороннего связывания меняется приоритет продолжения рекурсивного разбора.

На сайте effbot.org приводится подробная реализация на питоне.
Там же есть ссылки для жаваскрипта и схемы.
наглядный пример на питоне

Вычисление значения выражения «на коленке»

Время на прочтение2 мин
Охват и читатели9.4K
Тема навеяна недавними постами Компилятор выражений и Вычисление значения выражения. Рассмотрены два подхода — построение семантического дерева выражения для быстрого вычисления и вычисление самого выражения на ходу при помощи двух своих стеков. Я же хочу показать довольно простой способ реализации, по сути алгоритма из первой статьи, но на базе рекурсии. Иногда бывает уместно переложить часть работы со стеком на комплиятор, благо современные ОС дают нам большой стек и возможность разумного использования рекурсии.
Читать дальше →

Вычисление значения выражения

Время на прочтение7 мин
Охват и читатели48K
В продолжение поста Компилятор выражений. По просьбам читающих. Специально для michurin

Есть много способов вычислить значение выражения мне больше всего нравится метод с двумя стеками.
Нравится за его элегантность и простоту реализации.

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

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

Делаем Liquid Resize своими руками

Время на прочтение12 мин
Охват и читатели16K
Вы наверное уже слышали о технологии масштабирования Liquid Resize, которая учитывает содержимое изображения. Если вам интересно как оно все работает и как можно реализовать все это самому, то читайте далее (осторожно, много рисунков).


(НЛО прилетело и растянуло этот рисунок здесь)
Читать дальше →

Легенда о «Сетуни»

Время на прочтение3 мин
Охват и читатели4.5K
В далёкие времена, когда деревья были ниже, а космос ещё так далёк, где-то в конце 50-х прошлого столетия, зарождалась эра вычислительных машин.
Инженеры в белых халатах творили историю.
Транзисторы, диоды, реле, ферритовые кубы… создавались первые ЭВМ.
В стенах МГУ появилась легенда. И имя ей — Сетунь.

Промышленный образец ЭВМ «Сетунь», ВДНХ, 1961 год
Продолжение

«Находка». Новый поисковый алгоритм Яндекса

Время на прочтение1 мин
Охват и читатели793
Наконец-то Yandex запустила алгоритм, анонсированный в начале лета. Обещаний касательно него было дано не мало и многие оптимизаторы его, мягко говоря, побаивались. Оказалось зря, в ночь с 10 на 11 сентября произошел мощное обновление выдачи с прикрученным алгоритмом «Находка». Мне, как оптимизатору, так и рядовому пользователю новая система ранжирования документов очень понравилась, из плюсов можно выделить:

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

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

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

(картинка Кликабельна)
Небольшое описание под катом...
12 ...
342