IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Теория графов.Оргдеревья., Разбиение оргдеревьев.
сообщение
Сообщение #1


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Как разбить ориентированное дерево на все неизоморфные поддеревья?..Входные данные-например,FO представление.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


И еще: "без циклов" = без ориентированных циклов? Или просто без циклов? Потому что если без ориентированных, от висячих вершин может и не оказаться
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(Michael_Rybak @ 7.11.2006 14:47) *

И еще: "без циклов" = без ориентированных циклов? Или просто без циклов? Потому что если без ориентированных, от висячих вершин может и не оказаться


Просто без циклов.
В понимании препода оргдерева это оргдерево в обычном понимании.Только вот из корня не обязательно достижимы все вершины.Да и корня в принципе мы не знаем.Поэтому можем подвесить граф за любую вершину.


Под поддеревом понимаеться любой граф.
Алгоритм: как представляю себе я, подвесим граф за 1 вершину. Найдём висячии. Рассмотрим всевозможные комбинации удаляя их и проверяя на изоморфность и неизоморфные запишем в файл. Файлы сортируем по кол-ву вершин. И так далее. В конце необходимо подвесить за следующую вершину. (Очень долго =( )

Списковым представлением пользоваться не обязательно. Просто входные данные могут быть очень большими (около 10000 вершин , а то и больше),а это дастаточно экономный вариант хранения графа.

Не откажусь от любой помощи.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата(Fanat @ 7.11.2006 17:48) *

Алгоритм: как представляю себе я, подвесим граф за 1 вершину. Найдём висячии. Рассмотрим всевозможные комбинации удаляя их и проверяя на изоморфность и неизоморфные запишем в файл. Файлы сортируем по кол-ву вершин. И так далее. В конце необходимо подвесить за следующую вершину. (Очень долго =( )


Я не понял, что ты имеешь ввиду под "Рассмотрим всевозможные комбинации удаляя их и проверяя на изоморфность и неизоморфные запишем в файл". Как именно мы это делаем? Сначала строим все возможные поддеревья, содержащие корень, а потом для каджой пары из них проверяем, не изоморфны ли они? Или как-то по ходу отсеиваем изоморфные?

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

Затем взять всю эту кучу поддеревьев, и попарно сравнивать их, находя изоморфные.

Теперь, как это можно ускорить:

1) после того, как мы уже подвешивали за первую вершину, нам больше нет смысла рассматривать опять те поддеревья (но подвешенные за другую вершину), которым она принадлежит. Поэтому мы ее удаляем со всеми инцидентными ребрами. Подвешиваем за вторую, удаляем ее тоже, и т.д.

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

3) можно воспользоваться приемом, который я тебе описал в самом первом посте. Подвесив за какую-нибудь вершину, будем вот так индексировать (систему индексирования нужно немного подправить, чтобы она учитывала направление ребра). Тогда можно будет значительную часть изоморфных поддеревьев отсечь на ходу.

НО.

Я очень сомневаюсь, что имеет смысл особо париться. Пункты 1 и 2, конечно, надо сделать, а вот пункт третий - с ним мороки побольше, а в худшем случае он все равно не поможет.

Дело в том, что для некоторых входных данных количество неизоморфных поддеревьев будет порядка O(2^n), и никакие оптимизации тут не спасут при n = 10000, и даже при n = 50 yes2.gif

Цитата
Я так понял, что
Списковым представлением пользоваться не обязательно. Просто входные данные могут быть очень большими (около 10000 вершин , а то и больше),а это дастаточно экономный вариант хранения графа.


Еще меньше памяти занимает обычный список ребер. Вот:

type TEdge = record x, y: longint end;

var edges: array[1 .. MAX_E] of TEdge;
first: array[1 .. MAX_N] of longint;
last: array[1 .. MAX_N] of longint;


Проходишь слева направо по FO представлению, и заполняешь edges в отсортированном порядке парами (откуда-куда). Отсортированном по "откуда", т.е. сначала идут все ребра, исходящие из 1, потом - из 2 и т.д (фактически, просто выбрасываешь нолики из FO). По ходу заполняешь first и last; first[i] - начало подсписка для вершины i, т.е. такое наименьшее t, что edges[t].x = i; а last[i] - конец подсписка для вершины i, т.е такое наименьшее w>t, что edges[w].x <> i. Теперь, чтобы пробежаться по вершинам, достижимым из i, надо пробежаться от edges[first[i]] до edges[last[i]-1]. Очень удобно и экономно.

Поскольку здесь нам не помешают и обратные связи (от сына к отцу), ребра можно продублировать (a->b порождает b->a), отсортировать список, и уже потом пройтись по нему, заполняя first и last.

Цитата
Не откажусь от любой помощи.


Пробуй, приходи, будем советоваться.

Сообщение отредактировано: Michael_Rybak -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Можешь на примере показать что мы храним в массивах first i last?..Почему просто не хранить список рёбер в двух массивах?..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Fanat   Теория графов.Оргдеревья.   4.11.2006 15:48
Michael_Rybak   Идем от листов вверх к корню, и индексируем по ход…   4.11.2006 16:45
Fanat   Требуеться разбить на ВСЕ неизоморфные поддеревья.…   6.11.2006 17:13
Michael_Rybak   Требуеться разбить на ВСЕ неизоморфные поддеревья…   6.11.2006 17:55
Fanat   Например,рассмотрим такое огрдерево. Дерево имее…   7.11.2006 1:00
Michael_Rybak   Приведи, пожалуйста, определения "FO представ…   7.11.2006 2:01
Fanat   Ориентированное дерево — это ориентированный граф …   7.11.2006 5:17
Michael_Rybak   Я сейчас выхожу, подумаю над задачей в дороге. А т…   7.11.2006 13:40
Michael_Rybak   И еще: "без циклов" = без ориентированны…   7.11.2006 18:47
Fanat   И еще: "без циклов" = без ориентированн…   7.11.2006 22:48
Michael_Rybak   Алгоритм: как представляю себе я, подвесим граф з…   8.11.2006 0:36
Fanat   Можешь на примере показать что мы храним в массива…   8.11.2006 1:40
Michael_Rybak   Можешь на примере показать что мы храним в массив…   8.11.2006 2:05
Fanat   Сколько думал, а сделать ничё не могу..... :blink:   14.11.2006 21:49
Michael_Rybak   Давай шаг за шагом. 1. Напиши программу, которая …   14.11.2006 22:58
Маня   Такая вот задача: требуется определить изоморфны л…   8.11.2006 4:15
Michael_Rybak   Прочти мой первый пост здесь. Алгоритм, который я…   8.11.2006 6:18
Маня   Послушайте! А если я сделаю так? Как всё это н…   16.11.2006 3:41
Michael_Rybak   Эвристики тут ни к чему. Сравнить два графа можно …   16.11.2006 4:49
Маня   Там все связано с разбиением деревьев на поддеревь…   17.11.2006 2:40
Michael_Rybak   Там *не все* связано с разибиением на поддеревья. …   17.11.2006 3:25
Маня   понимаешь,я уже несколько раз все твои сообщения п…   18.11.2006 23:30
Michael_Rybak   Давай разберемся с тем, что я называю индексацией.…   19.11.2006 6:01
Маня   Ой !!! Спасибо огромное! Знаешь,а…   20.11.2006 3:48
Michael_Rybak   Молодец, Маня, порадовала! :) Да, очень прав…   20.11.2006 6:17
Маня   :good: :good: :good: Просто СУПЕР!!…   23.11.2006 2:26
Маня   О!!! У меня родилась идея,точнее мысль…   23.11.2006 3:26
Michael_Rybak   Молодец что придумала пример :) Видишь? Не зано…   23.11.2006 8:33
Маня   Значится так, вот как я поняла этот алгоритм: :…   28.11.2006 15:26
Michael_Rybak   Схему ты описала правильно, но вот правильно ли ты…   28.11.2006 18:46


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 20:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name