![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Граф, но не дерево???
pasha_golub © (2006-02-24 19:02:00)Ребят, не могу ясно сформулировать в терминах графов задачу, чтобы начать поиски. Велосипед изобретать не хочеться.
Предметная область: есть набор объектов, каждый объект может быть потомком одного или нескольких объектов (множественное наследование).
а) необходимо проверить правильность наследования
б) для каждого объекта найти список допустимых предков
в) отсортировать объекты по порядку создания, сначала предки, потом все потомки.
Закодировано:
TEntity = class
...
public
property ObjectID: integer ...; //уникальный ИД объекта
property Inherited: TList ...; //Список ИД предков
...
end;
Я сначала подумал, что можно попробовать сделать это все через дерево. Просто для случаев когда у объекта несколько потомков, добавлять несколько листьев к каждому предку.
Например, такое дерево:
1 -> 2
-> 4
-> 3
-> 4
В данном случае, объект 1 общий предок, 2 и 3 его прямые потомки, а объект 4 потомок и 2, и 3.
Однако, потом отказался от этой идеи, ибо она мне показалась черезчур громоздкой и требующей доп. вычислений.
Что я помню из теории графов по этому поводу:
1. Это не дерево.
2. Это однонаправленный граф.
3. Мне нужно найти, есть ли в нем циклы???
4. Его (граф) можно представить в виде матрицы инцидентности, так как он однонаправленный, то это будет треугольная матрица.
Пока, то что искал на http://manual.algolist.ru& http://ru.wikipedia.org/wikiне особо вдохновило.
Что прошу:
1. подтвердить мои догадки или опровергнуть
2. предложить ключевые слова для поиска
3. ну уж если алгоритм вдруг дадите, то с меня бутыль сала и пляшка горилки
Спасибо.
pasha_golub (2006-02-25 16:10:00) [1]
> Rouse_ © (25.02.06 15:33) [9]
Это не ООП... Это SQL для Postgres'a: http://www.postgresql.org/docs/8.1/interactive/tutorial-inheritance.html
Rouse_ (2006-02-25 15:33:00) [2]ИМХО пункт А следует из пункта Б. При создании объект должен знать список допустимых предков. Если тебя создает не тот кто может - райзимся в конструкторе...
pasha_golub (2006-02-25 15:06:00) [3]
> jack128 © (24.02.06 19:24) [4]
> palva © (24.02.06 20:39) [5]
> TUser © (25.02.06 10:41) [7]
Спасибо, друзья.
TUser (2006-02-25 10:41:00) [4]> 3. Мне нужно найти, есть ли в нем циклы???
Примерно так
var Vs: array of TVertex;
begin
// "топологическая сортировка"
for j:=low(Vs) to high(Vs) do
for i:=low(Vs) to high(Vs) do
for each Child of Vs[i] do begin
if Child.Index < i then
Swap (i, Child.Index);
// поиск циклов
for i:=low(Vs) to High(Vs) do
for each Child of Vs[i] do
if Child.Index < i then
return циклы есть
return циклов нет
end;
Также есть хорошие алгоритмы поиска кратчайших путей, которые возвращают результат 'циклы есть, не могу ничего найти', если в графе есть циклы.
palva (2006-02-24 21:00:00) [5]С картинками!
http://www.cs.fsu.edu/~cop4531/slideshow/chapter23/23-4.html
palva (2006-02-24 20:39:00) [6]http://algolist.ncstu.ru/sort/top_sort.php
jack128 (2006-02-24 19:24:00) [7]pasha_golub © (24.02.06 19:17) [3]
Жень, это я так понимаю 1 - общий, 2 и 3 потомки от 1, далее 4 потомок 2, а 5 потомок 3?
Да.
pasha_golub © (24.02.06 19:17) [3]
То есть смысл таков, пока не будет создан предок, не может быть создан потомок.
Ну тогда 2 = 5 поскольку они никак не пересекаются в иерархии.
pasha_golub (2006-02-24 19:17:00) [8]
> 1 -> 2 -> 4
>
> -> 3 -> 5
>
> кто в отсортированном списке "выше" , насленик (2 и 5)
> или насленик (3 и 4) ??
Жень, это я так понимаю 1 - общий, 2 и 3 потомки от 1, далее 4 потомок 2, а 5 потомок 3?
Если так, то
1
(2,3)
(4,5)
То есть смысл таков, пока не будет создан предок, не может быть создан потомок.
Уф, чего-то бошк не варит совсем.
pasha_golub (2006-02-24 19:14:00) [9]Не знаю как "однонаправленный", но то, что ориентированный - это точно.
jack128 (2006-02-24 19:12:00) [10]pasha_golub © (24.02.06 19:02)
а) необходимо проверить правильность наследования
А в чем проблема? Ищешь среди предков самого себя, если нету - значит иерархия допустима.
pasha_golub © (24.02.06 19:02)
б) для каждого объекта найти список допустимых предков
Все объекты вычесть все недопустимые объеты = допустимые объекты
pasha_golub © (24.02.06 19:02)
в) отсортировать объекты по порядку создания, сначала предки, потом все потомки.
не совсем понятно:
1 -> 2 -> 4
-> 3 -> 5
кто в отсортированном списке "выше" , насленик (2 и 5) или насленик (3 и 4) ??