Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Граф, но не дерево???   Найти похожие ветки 

 
pasha_golub ©   (2006-02-24 19:02) [0]

Ребят, не могу ясно сформулировать в терминах графов задачу, чтобы начать поиски. Велосипед изобретать не хочеться.

Предметная область: есть набор объектов, каждый объект может быть потомком одного или нескольких объектов (множественное наследование).
а) необходимо проверить правильность наследования
б) для каждого объекта найти список допустимых предков
в) отсортировать объекты по порядку создания, сначала предки, потом все потомки.

Закодировано:

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. ну уж если алгоритм вдруг дадите, то с меня бутыль сала и пляшка горилки

Спасибо.


 
jack128 ©   (2006-02-24 19:12) [1]

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) ??


 
pasha_golub ©   (2006-02-24 19:14) [2]

Не знаю как "однонаправленный", но то, что ориентированный - это точно.


 
pasha_golub ©   (2006-02-24 19:17) [3]


> 1 -> 2      -> 4
>                    
>   -> 3      -> 5
>
> кто в отсортированном списке "выше"  , насленик (2 и 5)
> или насленик (3 и 4) ??


Жень, это я так понимаю 1 - общий, 2 и 3 потомки от 1, далее 4 потомок 2, а 5 потомок 3?

Если так, то
1
(2,3)
(4,5)

То есть смысл таков, пока не будет создан предок, не может быть создан потомок.

Уф, чего-то бошк не варит совсем.


 
jack128 ©   (2006-02-24 19:24) [4]

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 поскольку они никак не пересекаются в иерархии.


 
palva ©   (2006-02-24 20:39) [5]

http://algolist.ncstu.ru/sort/top_sort.php


 
palva ©   (2006-02-24 21:00) [6]

С картинками!
http://www.cs.fsu.edu/~cop4531/slideshow/chapter23/23-4.html


 
TUser ©   (2006-02-25 10:41) [7]

> 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;

Также есть хорошие алгоритмы поиска кратчайших путей, которые возвращают результат "циклы есть, не могу ничего найти", если в графе есть циклы.


 
pasha_golub ©   (2006-02-25 15:06) [8]


> jack128 ©   (24.02.06 19:24) [4]


> palva ©   (24.02.06 20:39) [5]


> TUser ©   (25.02.06 10:41) [7]

Спасибо, друзья.


 
Rouse_ ©   (2006-02-25 15:33) [9]

ИМХО пункт А следует из пункта Б.  При создании объект должен знать список допустимых предков. Если тебя создает не тот кто может - райзимся в конструкторе...


 
pasha_golub ©   (2006-02-25 16:10) [10]


> Rouse_ ©   (25.02.06 15:33) [9]

Это не ООП... Это SQL для Postgres"a: http://www.postgresql.org/docs/8.1/interactive/tutorial-inheritance.html



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.039 c
2-1142341927
kilop
2006-03-14 16:12
2006.03.26
Есть процедура приостановления работы программы, но ...


1-1140945024
nap<>
2006-02-26 12:10
2006.03.26
Панель инструментов


1-1140437293
Чапаев
2006-02-20 15:08
2006.03.26
Rewrite


2-1141644435
Junior1
2006-03-06 14:27
2006.03.26
Прочитать файл в массив


2-1142168978
Golik
2006-03-12 16:09
2006.03.26
Как указать путь к БД ????





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский