Обновить
284.54

Алгоритмы *

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

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

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

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

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

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

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

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

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

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

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

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

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