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

Алгоритмы *

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

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

Структуры данных: бинарные деревья. Часть 1

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

Интро



Этой статьей я начинаю цикл статей об известных и не очень структурах данных а так же их применении на практике.

В своих статьях я буду приводить примеры кода сразу на двух языках: на Java и на Haskell. Благодаря этому можно будет сравнить императивный и функциональный стили программирования и увидить плюсы и минусы того и другого.

Начать я решил с бинарных деревьев поиска, так как это достаточно базовая, но в то же время интересная штука, у которой к тому же существует большое количество модификаций и вариаций, а так же применений на практике.
Читать дальше →
Всего голосов 110: ↑101 и ↓9+92
Комментарии53

Алгоритмы на графах — Часть 1: Поиск в глубину и проблема взаимоблокировок

Время на прочтение6 мин
Количество просмотров66K
Недавно на Хабре была статья, посвященная алгоритмам на графах. С позволения автора, мой первый хабратопик продолжит цикл.

Хотелось бы осветить вопросы применения некоторых алгоритмов, для решения задач программирования.
Достаточно жизненный пример, с которым сталкивался не один разработчик — это deadlock. По сути deadlock – это взаимоблокировка, в результате которой система, или какие-то отдельные процессы начинают конкурировать за один ресурс.
В жизни такие ситуации встречаются, например, когда два человека желают пропустить друг друга на входе, предположим, в аудиторию. Однако после 3-4 фраз «только после вас!», кто-нибудь всё же пройдет первым.
На уровне программного обеспечения всё сложнее, пока программы не способны думать, машинный аналог фразы «только после вас!» будет повторяться вплоть до перезагрузки.
Как исполняющая система может повлиять на этот процесс? Вот тут нам на помощь и приходят алгоритмы на графах.
Для начала определимся, что же будет элементами нашего графа, и как его составить.
Читать дальше →
Всего голосов 61: ↑50 и ↓11+39
Комментарии20

Поиск нечетких дубликатов. Алгоритм шинглов для веб-документов

Время на прочтение4 мин
Количество просмотров44K
Ранее я показал элементарную реализацию алгоритма шинглов, позволяющую определять, являются ли два документа почти дубликатами или нет. В этот раз я поясню реализацию алгоритма, описанную Зеленковым  Ю. Г. и Сегаловичем И.В. в публикации «Сравнительный анализ методов определения нечетких дубликатов для Web-документов».
Этим я начинаю серию из трех теоретических статей, в которых постараюсь доступным языком описать принцип алгоритмов шинглов, супершинглов и мегашинглов для сравнение веб-документов.
Читать дальше →
Всего голосов 55: ↑53 и ↓2+51
Комментарии103

Алгоритмы на графах — Часть 0: Базовые понятия

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

Вступление


Как оказалось тема алгоритмов интересна Хабра-сообществу. Поэтому я как и обещал, начну серию обзоров «классических» алгоритмов на графах.
Так как публика на Хабре разная, а тема интересна многим, я должен начать с нулевой части. В этой части я расскажу что такое граф, как он представлен в компьютере и зачем он используется. Заранее прошу прощения у тех кто это все уже прекрасно знает, но для того чтобы объяснять алгоритмы на графах, нужно сначала объяснить что такое граф. Без этого никак.

Читать дальше →
Всего голосов 130: ↑118 и ↓12+106
Комментарии70

Истории

Максимальный поток минимальной стоимости. Решение в Excel

Время на прочтение2 мин
Количество просмотров5.6K
В ответ на аналогичный пост, который меня подстегнул к написанию этого…

Так как я закончил совсем недавно железнодорожный вуз, и курс логистики имел место там быть, нахлынули на меня приятные воспоминания. Как всегда все расчёты проводились, конечно же вручную, после, пораздумав немного была написана простенькая программка, так сказать, в помощь однокурсникам…
но какого же было моё удивление, когда я узнал, что всё это, как говориться, без меня придумано, да притом и ниодин раз ))).
Речь в статье пойдёт о решении транспортной задачи средствами Microsoft Excel.
как всегда всё гениальное просто, есть такой пунк меню — Поиск решений…
Читать дальше →
Всего голосов 13: ↑9 и ↓4+5
Комментарии8

Задача о назначениях

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

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

Give us the tools, and we will finish the job
Всего голосов 60: ↑57 и ↓3+54
Комментарии34

Фильтрация изображений методом свертки

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

Введение.


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

Что же там дальше?
Всего голосов 93: ↑89 и ↓4+85
Комментарии63

Классические алгоритмы — интересна ли тема?

Время на прочтение1 мин
Количество просмотров15K
Добрый день!

В последнее время сталкиваюсь с большим количеством разнообразных классических алгоритмов (как на занятиях в ВУЗе так и на практике в проектах), поэтому хочу поделиться с хабра-сообществом интересными материалами на данную тему. Думаю что далеко не все здесь знают о каких алгоритмах идет речь, но вполне возможно что они могли бы быть полезны вам.
В недавний пост: «Максимальный поток минимальной стоимости» навел меня на мысль попробовать описать каждый из этих классических алгоритмов отдельно и подробно.
То есть дать описание каждого алгоритма, вместе с его вычислительной сложностью и сферами применения.

Что я имею ввиду под «классические алгоритмы»:
BFS, DFS, Min Spanning Tree (Prim, ..), Shortest Path(Dijkstra, B-F) и многие другие. Это основные алгоритмы которые изучаются на курсе по алгоритмам и затем широко применяются в различных сферах.

Поэтому собственно вопрос, стоит ли освещать эту тему здесь или нет?
Заранее спасибо за комментарии!
Всего голосов 236: ↑219 и ↓17+202
Комментарии172

Структурированное программирование

Время на прочтение3 мин
Количество просмотров5.4K
В начале 80-х годов XX века, в недрах проблемной лаборатории электронных вычислительных машин Московского государственного университета им. М.В.Ломоносова началась работа над необычным, по нынешним меркам, языком, а вернее системы, или даже сказать идеологии программирования.
Что это?
Всего голосов 30: ↑23 и ↓7+16
Комментарии47

Максимальный поток минимальной стоимости

Время на прочтение15 мин
Количество просмотров84K
Транспортная задача (классическая) — задача об оптимальном плане перевозок товара со складов в пункты потребления на транспортных средствах.

Для классической транспортной задачи выделяют два типа задач: критерий стоимости (достижение минимума затрат на перевозку) или расстояний и критерий времени (затрачивается минимум времени на перевозку).

Под катом очень-очень много текста, т.к. рассказывается один из вариантов решения данной задачи «в картинках» для тех, кто мало знаком с графами. Листинг прилагается.

Путешествие в тысячу миль начинается с первого шага
Всего голосов 173: ↑165 и ↓8+157
Комментарии76

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

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

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


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

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

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

Методов разбора существует множество (рекомендую следующий обзор 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 (лексер) в реальной жизни: от возникновения задачи, до её решения.

Читать дальше →
Всего голосов 19: ↑18 и ↓1+17
Комментарии10

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

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

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

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

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

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

На сайте effbot.org приводится подробная реализация на питоне.
Там же есть ссылки для жаваскрипта и схемы.
наглядный пример на питоне
Всего голосов 38: ↑36 и ↓2+34
Комментарии15

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

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

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

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

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

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

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

Мы будем идти слева на право, добавляя операнды в один стек, а операции в другой. При каждом добавлении новой операции мы будем пытаться вытолкнуть из стека старые, руководствуясь приоритетами операций.
Читать дальше →
Всего голосов 59: ↑55 и ↓4+51
Комментарии36

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

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


(НЛО прилетело и растянуло этот рисунок здесь)
Читать дальше →
Всего голосов 230: ↑226.5 и ↓3.5+223
Комментарии125

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

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

Промышленный образец ЭВМ «Сетунь», ВДНХ, 1961 год
Продолжение
Всего голосов 96: ↑94 и ↓2+92
Комментарии178

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

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

Читать дальше →
Всего голосов 110: ↑96.5 и ↓13.5+83
Комментарии67

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

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

(картинка Кликабельна)
Небольшое описание под катом...
Всего голосов 95: ↑90 и ↓5+85
Комментарии25
12 ...
274

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