LINUX.ORG.RU

Индексирование частично упорядоченного множества

 


1

3

В частично упорядоченном множестве хочу быстро узнавать, верно ли, что А<Б. Видимо, для этого надо построить какой-то индекс и пользоваться им. Какой? Как его быстро построить?

Пока нашёл вот это: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.6760&rep=rep1... но даже не смотрел. Мне кажется, это должно быть в каком-то учебнике, который я не читал.

★★★★★

Если множество конечно, то диаграмма Хассе.

cool_hedin
()
Ответ на: комментарий от cool_hedin

В гугле забил «efficient storage of partially ordered sets», вторая ссылка. Ща, кстати, первую посмотрю.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Диаграмма Хассе не даёт быстрого ответа на вопрос «сравнимы ли А и Б» и кто из них больше. Также неплохо бы иметь процедуру, которая пополняет уже построенное хранилище новым элементом, добавляя его в «индекс».

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Блин, это диссер какой-то, причём от 2013 года. Что, наука не доросла что ли ещё до осознания частично упорядоченных множеств? Я думал уже есть стандартная библиотечка, с которой я просто ещё пока что не сталкивался. Блин :(

Хотя на лиспе что-то нагуглилось по редкому слову poset:

https://bitbucket.org/mt/biobike/src/0776fd5740a5900534620e3310cb238ac1fc5e4b...

den73 ★★★★★
() автор топика

Простите меня за возможную глупость, но индексом, в данном случае, возможно будет упорядоченное множество, отсортируйте его.

anonymous
()

Нашлось такое:

... Using this algorithm, we design a succinct data structure for representing a poset that, given two elements, can report whether one precedes the other in constant time. ...

xaizek ★★★★★
()

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

Её за время О(число_вершин^3) можно достроить до матрицы достижимости, которая как раз и даёт то, что я просил - это «алгоритм Флойда - Уоршелла», который придумал и опубликовал первым, как ни странно, Бернард Рой :)

Есть и другие алгоритмы вычисления матрицы достижимости (находим по википедии), которые в каких-то случаях работают быстрее.

Накопал в ходе поисков сайт e-maxx.ru с описанием алгоритмов

Но, как оказалось, мне нужно не совсем это... А целая куча всяких действий над графами. Тем не менее, вопрос решён. Ещё была полезной книжка Новиков «дискретная математика для программистов».

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 3)
Ответ на: комментарий от den73

Дуболомность способа в данном случае состоит в том, что не используется антисимметричность. Плюс, в моём случае заданы только вершины, а не рёбра, поэтому заполнение матрицы смежности требует N^2 сравнений, и уже сразу получается матрица достижимости. Плюс нельзя строить инкрементно, при изменении (например, при удалении ребра) всё нужно переделывать заново. Так что свою частную задачу я вроде решил, но в целом тема не раскрыта. Возможно, по ссылкам, к-рые тут накидали, приведены хорошие алгоритмы - я этого не проверял.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.