| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > Хранение графа в базе данных |
| Автор: Illuminaty 19.3.2005, 20:56 |
| Вопрос в следующем. Задан граф. Заданы веса ребер. Как сохранить его в БД? Необходима такая реализация, чтобы удобно было с ней работать. Т.е. осуществление выборок для нахождения пути от одной вершины к другой Кто нибудь делал похожее? И у кого какие идеи? Подчеркиваю: необходима реализация в виде структуры таблиц |
| Автор: LSD 20.3.2005, 00:59 |
| Самый очевидный способ: две таблицы одна список вершин, вторая список ребер с весами ребро имеет два foreign key на таблицу вершин и поле вес. Найти все пути, фиксированной длинны, из заданного ребра можно будет одним запросом. |
| Автор: Illuminaty 20.3.2005, 10:54 |
| LSD Спасибо за ответ, но возникает резонный вопрос: а сколько запросов потребуется для реализации нахождения пути из вершины А в вершину Б, учитывая, что вершин достаточно много (больше 1000)? Над предложенной реализацией я думал уже |
| Автор: LSD 21.3.2005, 20:19 | ||||
| Внимание аттракцион! Сейчас с помощью ловкости рук мы получим все не циклические пути из точки B!
А теперь следим за руками:
Правда я здесь использовал специфичные фишки Oracle и если база будет не Oracle, то не прокатит. Это я к тому, что неплохо бы знать что за база. |
| Автор: Illuminaty 21.3.2005, 23:36 |
| Да уж.... С Oracle не сталкивался, поэтому есть загадочные элементы Причем много... А база, скорее всего MySQL Думал, что можно все решить хорошей реализацией, не зависящей от платформы |
| Автор: LSD 21.3.2005, 23:41 | ||
Упс А я с MySQL не знаком, а как у него с join-нами? |
| Автор: Illuminaty 21.3.2005, 23:55 |
| LSD Да, вроде бы, нормально |
| Автор: LSD 24.3.2005, 22:35 | ||
| ИМХО все должно быть ОК. Т.к. именно так граф представляется в математике (множество вершин и множество ребер) и соответсвенно все алгоритмы поиска пути в графе расчитанны именно на такое представление. Вот например как можно реализовать алгоритм http://algolist.manual.ru/maths/graphs/shortpath/dijkstra.php, это уже для Interbase (у меня нет под рукой MySQL).
Теперь чтобы найти путь из начальной точки в заданную, выбираем для заданной точки соседнюю, так что
|
| Автор: Feliastre 30.3.2005, 10:35 |
| Всё ниже сказанное сугубое ИМХО. Я тоже занимался приколами с графами. И долго думал, как же их хранить. Предложенный метод имеет один противный момент. Для 1000 вершин мы должны сделать 1 000 000 записей. Может для оракла это и быстро. Может для MS SQL 2000 это быстро. Для локальных баз - это погибель. Так что есть вариант. В базе хранить только "габариты" графа. А саму матрицу скидывать на хард. Для наглядности: У меня машина P4 2,4GHz, 768Mb RAM Запись того самого миллиона рёбер потребовала ~20 минут. БД юзал Парадокс, аксесс, InterBase. Если не страшны такие скорости - то я позорно замолкаю(типа со своим уставом в чужой монастырь...) |
| Автор: LSD 30.3.2005, 22:04 | ||||
Это верно для полного ориентированного графа, для не ориентированного это число меньше в половину. Но как правило графы не полные (иначе поиск пути на них задача тривиальная). Я попробовал забить в Firefox 1.5 полный неориентированный граф, 1000 вершин 500 000 ребер. На таблицах были foreign key и constrain. Вставка вершин заняла 0.5-1 сек, вставка ребер 3.5-5 мин. Машина: AthlonXP 2000, 768Mb RAM.
А как работать с таким графом, тащить полностью в память? А целостность (отсутствие дубликатов ребер, некорректных ссылок и т.п.)? |