Как стать автором
Обновить
  • по релевантности
  • по времени
  • по рейтингу

Деревья в MySql/Php.

Чулан
Привет хабр. Недавно я столкнулся с задачей, которая потребовала использования такой структуры, как деревья. Но из всей таблицы строится не одно глобальное дерево, а несколько мелких деревьев. Причем, при генерации страницы, нужно было получать дерево соответствуещее определенному элементу.
Читать дальше →
Всего голосов 9: ↑8 и ↓1 +7
Просмотры 700
Комментарии 30

Структуры данных в memcached/MemcacheDB. Часть 1

Разработка веб-сайтов *
Достаточно часто нам приходится хранить данные в memcached или MemcacheDB. Это могут быть относительно простые данные, например, закэшированные выборки из базы данных, а иногда необходимо хранить и обрабатывать более сложные структуры данных, которые обновляются одновременно из нескольких процессов, обеспечивать быстрое чтение данных и т.п. Реализация таких структур данных уже не укладывается в комбинацию команд memcached get/set. В данной статье будут описаны способы хранения некоторых структур данных в memcached с примерами кода и описанием основных идей.

Memcached и MemcacheDB в данной статье рассматриваются вместе, потому что имеют общий интерфейс доступа и логика работы большей части структур данных будет одинаковой, далее будем называть их просто «memcached». Зачем нам нужно хранить структуры данных в memcached? Чаще всего для распределенного доступа к данным из разных процессов, с разных серверов и т.п. А иногда для решения задачи хранения данных достаточно интерфейса, предоставляемого MemcacheDB, и необходимость в использовании СУБД отпадает.

Иногда проект разрабатывается изначально для нераспределенного случая (работа в рамках одного сервера), однако предполагая будущую необходимость масштабирования, лучше использовать сразу такие алгоритмы и структуры данных, которые могут обеспечить легкое масштабирование. Например, даже если данные будут храниться просто в памяти процесса, но интерфейс к доступа к ним повторяет семантику memcached, то при переходе к распределенной и масштабируемой архитектуре достаточно будет заменить обращения к внутреннему хранилищу на обращения к серверу (или кластеру серверов) memcached.
Читать дальше →
Всего голосов 47: ↑47 и ↓0 +47
Просмотры 4K
Комментарии 23

Структуры данных в memcached/MemcacheDB. Часть 2

Разработка веб-сайтов *
Продолжение статьи про структуры данных в memcached. В этой завершающей части мы рассмотрим еще три структуры данных: лог событий, массив и таблицу.
Читать дальше →
Всего голосов 26: ↑26 и ↓0 +26
Просмотры 2.7K
Комментарии 6

Бесплатные CMS для структурированных данных. Существуют?

Чулан
А существуют ли среди бесплатных CMS такие, что позволяют создавать свои сложные типы данных, имеющие множество полей разных типов, и удобно ими оперировать?
Мой опыт далее.
Читать дальше →
Всего голосов 13: ↑9 и ↓4 +5
Просмотры 767
Комментарии 27

Онлайн База Данных, сервис структур данных, динамическая объектно-реляционная проекция (Dynamic ORM)

Я пиарюсь
В данной статье речь пойдет о создании рабочего прототипа онлайд БД. И рассмотрены некоторые сервисы аналоги от компаний Google и Yahoo.

Последним временем более активно стали развиваться сервисы для работы с онлайн БД. Такого рода сервисов в себя включают такие платформы как GData (Google Data API) и Yahoo! Query Language (YQL).

Указанные сервисы онлайн доступа к БД позволяют лучше контролировать и оперировать данными, получаемыми из разных сервисов платформ и самое главное это готовые сервисы для использования которых достаточно изучить документацию и примеры.
Читать дальше →
Всего голосов 29: ↑23 и ↓6 +17
Просмотры 1.7K
Комментарии 12

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

Алгоритмы *

Интро



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

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

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

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

Алгоритмы *
Первая статья цикла

Интро


Во второй статье я приведу обзор характеристик различных сбалансированных деревьев. Под характеристикой я подразумеваю основной принцип работы (без описания реализации операций), скорость работы и дополнительный расход памяти по сравнению с несбаланчированным деревом, различные интересные факты, а так же ссылки на дополнительные материалы.
Читать дальше →
Всего голосов 55: ↑54 и ↓1 +53
Просмотры 219K
Комментарии 28

Школа Microsoft по структурам данных и алгоритмам

Блог компании Образовательные проекты JetBrains

В августе 2010-го года в Санкт-Петербурге пройдёт Школа Microsoft по структурам данных и алгоритмам. Принять участие в школе могут студенты старших курсов, аспиранты и молодые ученые, интересующиеся структурами данных и алгоритмами. Школа, в основном, нацелена на российских участников, но подать заявку на участие могут и жители других стран, не нуждающиеся в визе для въезда в Россию. Рабочий язык школы — английский, однако некоторые доклады будут на русском, поэтому участники должны владеть обоими языками.
Читать дальше →
Всего голосов 45: ↑30 и ↓15 +15
Просмотры 10K
Комментарии 39

Иерархия в БД на простых числах

Чулан
Здравствуйте, многоуважаемые.

Задача довольно избитая — хранить дерево в реляционной БД. Само по себе не сложно, но некоторые практические вопросы заставляют сильно наморщить мозг. Есть много интересных решений, но вот пришло мне в голову еще одно. Не уверен, что оно оригинальное, но такого решения я не встречал.
Придумать способ хранения дерева в БД — не сложно. Сложно придумать так, чтобы данные легко было доставать. Вот несколько самых типичных задая:
  • Проверить, является ли данный узел потомком заданного узла
  • Выбрать все узлы-потомки данного узла
  • Выбрать всех предков заданного узла

Первые два пункта в описываемом решении выполняются очень простым запросом, без всяких объединений и подзапросов, независимо от глубины иерархии.. По последнему пункту — еще не успел продумать :(
Читать дальше →
Всего голосов 11: ↑4 и ↓7 -3
Просмотры 452
Комментарии 22

Ваша программа использует связный список? Платите лицензионные отчисления

Чулан
Бюро по регистрации патентов и торговых марок США не перестаёт нас удивлять: в апреле 2006 года оно выдало компании LSI Logic Corporation патент на связный список. Связные списки используются практически в любой программе, а значит любая компания-разработчик в США теоретически оказывается под угрозой судебного иска. Впрочем, вряд ли компания сможет отстоять своё «изобретение» в суде, так как связные списки появились ещё в середине 50-х годов прошлого века.

Читать дальше →
Всего голосов 25: ↑22 и ↓3 +19
Просмотры 401
Комментарии 20

Пишу поисковик (virtual project). Ч.1.2. Внутренности кирпича

Чулан
Известны два способа проектирования — «сверху вниз» и «снизу вверх». Похоже я опять пытаюсь изобрести велосипед, пойти третьим путем — от середины.
Поскольку лично мне в данный момент более интересна «частная производная» поиска, а именно поиск по отдельному сайту (группе сайтов, сгруппированных в некий единый блок) — в этом направлении и пойду.
Читать дальше →
Всего голосов 10: ↑4 и ↓6 -2
Просмотры 175
Комментарии 5

Сортировка неструктурированного потока данных

Чулан
В прошлой статье Я писал как мы на YPAG.RU сортируем компании по разделам с помощью нейронной сети.
Многие просили описать алгоритм. Я опишу универсальный подход для сортировки данных.

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

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

3. Отбираются 20 самых релевантных документов и строится по ним рейтинг разделов. После этого отбираются самые популярные разделы из этой выборки. Этот порог настраивается сугубо индивидуально, у нас стоит порог – больше 5.

4 У нас на YPAG.RU еще назначается позиция документа в разделе. Позиция вычисляется следующим образом: определяются позиции найденных документов раздела и вычисляется средняя позиция. Если компания интересует посетителей – позиция постепенно растет.

Таким образом можно эффективно структурировать данные. Погрешность составляет 3-5%.
Основные проблемы возникают, если текст ни точно сформулирован. Например: оптовые закупки. Ни понятно что, как.
Всего голосов 11: ↑7 и ↓4 +3
Просмотры 574
Комментарии 9

Декартово дерево: Часть 1. Описание, операции, применения

Алгоритмы *

Оглавление (на данный момент)


Часть 1. Описание, операции, применения.
Часть 2. Ценная информация в дереве и множественные операции с ней.
Часть 3. Декартово дерево по неявному ключу.
To be continued...

Декартово дерево (cartesian tree, treap) — красивая и легко реализующаяся структура данных, которая с минимальными усилиями позволит вам производить многие скоростные операции над массивами ваших данных. Что характерно, на Хабрахабре единственное его упоминание я нашел в обзорном посте многоуважаемого winger, но тогда продолжение тому циклу так и не последовало. Обидно, кстати.

Я постараюсь покрыть все, что мне известно по теме — несмотря на то, что известно мне сравнительно не так уж много, материала вполне хватит поста на два, а то и на три. Все алгоритмы иллюстрируются исходниками на C# (а так как я любитель функционального программирования, то где-нибудь в послесловии речь зайдет и о F# — но это читать не обязательно :). Итак, приступим.

Введение


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

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


На заметку сразу скажу, что совершенно не обязательно думать про кучу исключительно как структуру, у которой родитель больше, чем его потомки. Никто не запрещает взять противоположный вариант и считать, что родитель меньше потомков — главное, выберите что-то одно для всего дерева. Для нужд этой статьи гораздо удобнее будет использовать вариант со знаком «больше».

Сейчас за кадром остается вопрос, каким образом в кучу можно добавлять и удалять из нее элементы. Во-первых, эти алгоритмы требуют отдельного места на осмотр, а во-вторых, нам они все равно не понадобятся.
А теперь собственно про декартово дерево
Всего голосов 166: ↑161 и ↓5 +156
Просмотры 124K
Комментарии 30

Декартово дерево: Часть 2. Ценная информация в дереве и множественные операции с ней

Алгоритмы *

Оглавление (на данный момент)


Часть 1. Описание, операции, применения.
Часть 2. Ценная информация в дереве и множественные операции с ней.
Часть 3. Декартово дерево по неявному ключу.
To be continued...

Тема сегодняшней лекции


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

К счастью (или к сожалению?), реальная жизнь такими пустяковыми задачами не ограничивается. О чем сегодня и пойдет речь. Первый вопрос на повестке дня — это так называемая K-я порядковая статистика, или индекс в дереве, которая плавно подведет нас к хранению пользовательской информации в вершинах, и наконец — к бесчисленному множеству манипуляций, которые с этой информацией может потребоваться выполнять. Поехали.

Ищем индекс


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

Решение и вся статья - под катом
Всего голосов 76: ↑72 и ↓4 +68
Просмотры 33K
Комментарии 14

Декартово дерево: Часть 3. Декартово дерево по неявному ключу

Алгоритмы *

Оглавление (на данный момент)


Часть 1. Описание, операции, применения.
Часть 2. Ценная информация в дереве и множественные операции с ней.
Часть 3. Декартово дерево по неявному ключу.
To be continued...

Очень сильное колдунство


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

Вспомним-ка еще раз структуру дерамиды. В ней есть ключ x, по которому дерамида есть дерево поиска, случайный ключ y, по которому дерамида есть куча, а также, возможно, какая-то пользовательская информация с (cost). Давайте совершим невозможное и рассмотрим дерамиду… без ключей x. То есть у нас будет дерево, в котором ключа x нет вообще, а ключи y — случайные. Соответственно, зачем оно нужно — вообще непонятно :)

На самом деле расценивать такую структуру стоит как декартово дерево, в котором ключи x все так же где-то имеются, но нам их не сообщили. Однако клянутся, что для них, как полагается, выполняется условие двоичного дерева поиска. Тогда можно представить, что эти неизвестные иксы суть числа от 0 до N-1 и неявно расставить их по структуре дерева:

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

В отличие от прошлой части, этот массив не приобретает автоматически никаких свойств, вроде отсортированности. Ведь на информацию-то у нас нет никаких структурных ограничений, и она может храниться в вершинах как попало.
Если интересно - под кат
Всего голосов 81: ↑77 и ↓4 +73
Просмотры 45K
Комментарии 17

Потокобезопасная очередь без блокировок

Чулан

Задача


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

Читать дальше →
Всего голосов 18: ↑14 и ↓4 +10
Просмотры 4.3K
Комментарии 21

Система непересекающихся множеств и её применения

Алгоритмы *
Добрый день, Хабрахабр. Это еще один пост в рамках моей программы по обогащению базы данных крупнейшего IT-ресурса информацией по алгоритмам и структурам данных. Как показывает практика, этой информации многим не хватает, а необходимость встречается в самых разнообразных сферах программистской жизни.
Я продолжаю преимущественно выбирать те алгоритмы/структуры, которые легко понимаются и для которых не требуется много кода — а вот практическое значение сложно недооценить. В прошлый раз это было декартово дерево. В этот раз — система непересекающихся множеств. Она же известна под названиями disjoint set union (DSU) или Union-Find.

Условие


Поставим перед собой следующую задачу. Пускай мы оперируем элементами N видов (для простоты, здесь и далее — числами от 0 до N-1). Некоторые группы чисел объединены в множества. Также мы можем добавить в структуру новый элемент, он тем самым образует множество размера 1 из самого себя. И наконец, периодически некоторые два множества нам потребуется сливать в одно.

Формализируем задачу: создать быструю структуру, которая поддерживает следующие операции:

MakeSet(X) — внести в структуру новый элемент X, создать для него множество размера 1 из самого себя.
Find(X) — возвратить идентификатор множества, которому принадлежит элемент X. В качестве идентификатора мы будем выбирать один элемент из этого множества — представителя множества. Гарантируется, что для одного и того же множества представитель будет возвращаться один и тот же, иначе невозможно будет работать со структурой: не будет корректной даже проверка принадлежности двух элементов одному множеству if (Find(X) == Find(Y)).
Unite(X, Y) — объединить два множества, в которых лежат элементы X и Y, в одно новое.

На рисунке я продемонстрирую работу такой гипотетической структуры.


Как такое сделать и зачем оно нужно
Всего голосов 114: ↑109 и ↓5 +104
Просмотры 49K
Комментарии 29

Структуры данных: двоичная куча (binary heap)

Алгоритмы *
Из песочницы
Двоичная куча (binary heap) – просто реализуемая структура данных, позволяющая быстро (за логарифмическое время) добавлять элементы и извлекать элемент с максимальным приоритетом (например, максимальный по значению).

Для дальнейшего чтения необходимо иметь представление о деревьях, а также желательно знать об оценке сложности алгоритмов. Алгоритмы в этой статье будут сопровождаться кодом на C#.

Введение


Двоичная куча представляет собой полное бинарное дерево, для которого выполняется основное свойство кучи: приоритет каждой вершины больше приоритетов её потомков. В простейшем случае приоритет каждой вершины можно считать равным её значению. В таком случае структура называется max-heap, поскольку корень поддерева является максимумом из значений элементов поддерева. В этой статье для простоты используется именно такое представление. Напомню также, что дерево называется полным бинарным, если у каждой вершины есть не более двух потомков, а заполнение уровней вершин идет сверху вниз (в пределах одного уровня – слева направо).



Читать дальше →
Всего голосов 72: ↑58 и ↓14 +44
Просмотры 158K
Комментарии 58

Моноиды и их приложения: моноидальные вычисления в деревьях

Алгоритмы *
Приветствую, Хабрахабр. Сегодня я хочу, в своём обычном стиле, устроить сообществу небольшой ликбез по структурам данных. Только на этот раз он будет гораздо более всеобъемлющ, а его применения и практичность — простираться далеко в самые разнообразные области программирования. Самые красивые применения, я, конечно же, покажу и опишу непосредственно в статье.

Нам понадобится капелька абстрактного мышления, знание какого-нибудь сбалансированного дерева поиска (например, описанного мною ранее декартова дерева), умение читать простой код на C#, и желание применить полученные знания.

Итак, на повестке сегодняшнего дня — моноиды и их основное применение для кеширования вычислений в деревьях.

Моноид как концепция


Представьте себе множество чего угодно, множество, состоящее из объектов, которыми мы собираемся манипулировать. Назовём его M. На этом множестве мы вводим бинарную операцию, то есть функцию, которая паре элементов множества ставит в соответствие новый элемент. Здесь и далее эту абстрактную операцию мы будем обозначать "⊗", и записывать выражения в инфиксной форме: если a и b — элементы множества, то c = ab — тоже какой-то элемент этого множества.

Например, рассмотрим все строки, существующие на свете. И рассмотрим операцию конкатенации строк, традиционно обозначаемую в математике "◦", а в большинстве языков программирования "+": "John""Doe" = "JohnDoe". Здесь множество M — строки, а "◦" выступает в качестве операции "⊗".
Или другой пример — функция fst, известная в функциональных языках при манипуляции с кортежами. Из двух своих аргументов она возвращает в качестве результата первый по порядку. Так, fst(5, 2) = 5; fst("foo", "bar") = "foo". Безразлично, на каком множестве рассматривать эту бинарную операцию, так что в вашей воле выбрать любое.

Далее мы на нашу операцию "⊗" накладываем ограничение ассоциативности. Это значит, что от неё требуется следующее: если с помощью "⊗" комбинируют последовательность объектов, то результат должен оставаться одинаковым вне зависимости от порядка применения "⊗". Более строго, для любых трёх объектов a, b и c должно иметь место:
(ab) ⊗ c = a ⊗ (bc)
Легко увидеть, что конкатенация строк ассоциативна: не важно, какое склеивание в последовательности строк выполнять раньше, а какое позже, в итоге все равно получится общая склейка всех строк в последовательности. То же касается и функции fst, ибо:
fst(fst(a, b), c) = a
fst(a, fst(b, c)) = a
Цепочка применений fst к последовательности в любом порядке всё равно выдаст её головной элемент.

И последнее, что мы потребуем: в множестве M по отношению к операции должен существовать нейтральный элемент, или единица операции. Это такой объект, который можно комбинировать с любым элементом множества, и это не изменит последний. Формально выражаясь, если e — нейтральный элемент, то для любого a из множества имеет место:
ae = ea = a
В примере со строками нейтральным элементом выступает пустая строка "": с какой стороны к какой строке её ни приклеивай, строка не поменяется. А вот fst в этом отношении нам устроит подлянку: нейтральный элемент для неё придумать невозможно. Ведь fst(e, a) = e всегда, и если ae, то свойство нейтральности мы теряем. Можно, конечно, рассмотреть fst на множестве из одного элемента, но кому такая скука нужна? :)

Каждую такую тройку <M, ⊗, e> мы и будем торжественно называть моноидом. Зафиксируем это знание в коде:
public interface IMonoid<T> {
    T Zero { get; }
    T Append(T a, T b);
}

Больше примеров моноидов, а также где мы их, собственно, применять будем, лежит под катом.
Читать дальше →
Всего голосов 127: ↑124 и ↓3 +121
Просмотры 19K
Комментарии 27