Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Графы. Обход в глубину и динамические масивы / 23 сообщений из 23, страница 1 из 1
13.02.2006, 18:26
    #33541755
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Имеется следующая задача:
В таблице в одном поле хранится номер группы, а во втором номер родительской группы для данной(если конкретизовать, то это группы товара).
Нужно сделать выборку номеров группы вместе с всеми ее подгруппами.
Как это правильно сделать?
Одним из вариантов решения вижу графы, обход в глубину.
Но не совсем четко представляю как реализовать их с динамическими масивами.
...
Рейтинг: 0 / 0
13.02.2006, 18:30
    #33541768
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Мужик, эт тебе праграмму писать нада ...
...
Рейтинг: 0 / 0
13.02.2006, 18:31
    #33541774
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
MasterZivМужик, эт тебе праграмму писать нада ...
Это я прекрасно понимаю. Не совсем понимаю каким образом осуществить реализацию..
...
Рейтинг: 0 / 0
14.02.2006, 01:54
    #33542278
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Предлагаю обойти дерево в глубину.
...
Рейтинг: 0 / 0
14.02.2006, 07:26
    #33542397
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
WWWovanИмеется следующая задача:
В таблице в одном поле хранится номер группы, а во втором номер родительской группы для данной(если конкретизовать, то это группы товара).
Нужно сделать выборку номеров группы вместе с всеми ее подгруппами.
Как это правильно сделать?
Одним из вариантов решения вижу графы, обход в глубину.
Но не совсем четко представляю как реализовать их с динамическими масивами.
Я делал похожую задачу: расшифровка рецептуры резиновых смесей для расчета необходимых материалов и полуфабрикатов. Правда делал это все средствами SQL в среде FoxPro...

Алгоритм примерно следующий:
1. Создал временную таблицу-курсор, куда помещал результаты (create cursor...)
2. В другой курсор (курсор 2) поместил всех родителей. (Select...where <родитель>=NULL)
3. Скопировал данные из курсора2 в результирующий курсор.
4. В курсор2 поместил детей родителей, находящихся в настоящий момент в курсоре2 (select ... where <родитель>=cursor2.ID_product)
5. Пункты 3 и 4 повторял до тех пор, пока не получал пустой курсор курсор2
NOTE: ID самого первого родителя я "тянул" до конца, так как у разных родителей могли быть одинаковые "дети" (с одним номером ID).
6. Дальше делал выборку из результирующего курсора (для сортировки, группировки и т.д....)

Получалась таблица примерно следующей структуры:

ID_parent,ID_product,Name, ....
11111111,111111111,Колесо R-13,....
11111111,111111112,Покрышка,....
11111111,111111115,Камера,.....
11111111,111111120,"золотник",....
11111111,111112001,колпачок,.....
22222222,222222222,Колесо R-17,....
22222222,111111112,Покрышка,....
22222222,111111115,Камера,....
и т.д........
Посмотри, может поможет чем...
...
Рейтинг: 0 / 0
14.02.2006, 10:24
    #33542722
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Мужчины, вы чего ? Форумом ошиблись ?
...
Рейтинг: 0 / 0
14.02.2006, 10:25
    #33542728
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Станислав C. WWWovanИмеется следующая задача:
В таблице в одном поле хранится номер группы, а во втором номер родительской группы для данной(если конкретизовать, то это группы товара).
Нужно сделать выборку номеров группы вместе с всеми ее подгруппами.
Как это правильно сделать?
Одним из вариантов решения вижу графы, обход в глубину.
Но не совсем четко представляю как реализовать их с динамическими масивами.
Я делал похожую задачу: расшифровка рецептуры резиновых смесей для расчета необходимых материалов и полуфабрикатов. Правда делал это все средствами SQL в среде FoxPro...

Алгоритм примерно следующий:
1. Создал временную таблицу-курсор, куда помещал результаты (create cursor...)
2. В другой курсор (курсор 2) поместил всех родителей. (Select...where <родитель>=NULL)
3. Скопировал данные из курсора2 в результирующий курсор.
4. В курсор2 поместил детей родителей, находящихся в настоящий момент в курсоре2 (select ... where <родитель>=cursor2.ID_product)
5. Пункты 3 и 4 повторял до тех пор, пока не получал пустой курсор курсор2
NOTE: ID самого первого родителя я "тянул" до конца, так как у разных родителей могли быть одинаковые "дети" (с одним номером ID).
6. Дальше делал выборку из результирующего курсора (для сортировки, группировки и т.д....)

Получалась таблица примерно следующей структуры:

ID_parent,ID_product,Name, ....
11111111,111111111,Колесо R-13,....
11111111,111111112,Покрышка,....
11111111,111111115,Камера,.....
11111111,111111120,"золотник",....
11111111,111112001,колпачок,.....
22222222,222222222,Колесо R-17,....
22222222,111111112,Покрышка,....
22222222,111111115,Камера,....
и т.д........
Посмотри, может поможет чем...

Спасибо за совет. Если не получится сделать средствами программы буду делать так...
Но хотелось бы не загружать сервер базы такими манипуляциями, а сделать выборку родителей и потомков и уже нужные нацти средствами программы, которая на C++...
...
Рейтинг: 0 / 0
14.02.2006, 10:28
    #33542739
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
MasterZivМужчины, вы чего ? Форумом ошиблись ?
Почему ошиблись? Форум по sql, а база у меня на Yaffil висит... Ветка по С++, прога у меня на Builder C++ 6.0 пишеться...
...
Рейтинг: 0 / 0
14.02.2006, 12:42
    #33543198
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
WWWovan MasterZivМужчины, вы чего ? Форумом ошиблись ?
Почему ошиблись? Форум по sql, а база у меня на Yaffil висит... Ветка по С++, прога у меня на Builder C++ 6.0 пишеться...

Посмотрите в документацию, поддерживает ли ваша
база join.

select p.parent_id , c.product_id , p.name, c.name
from table1 p inner join table1 c on p.parent_id=c.parent_id
where parent_id=blablabla

выдаст необходимый вам результат.
Если поле parent проиндексировано база справится с этим быстрее
чем проход по дереву.
...
Рейтинг: 0 / 0
14.02.2006, 13:58
    #33543529
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
onstat- WWWovan MasterZivМужчины, вы чего ? Форумом ошиблись ?
Почему ошиблись? Форум по sql, а база у меня на Yaffil висит... Ветка по С++, прога у меня на Builder C++ 6.0 пишеться...

Посмотрите в документацию, поддерживает ли ваша
база join.

select p.parent_id , c.product_id , p.name, c.name
from table1 p inner join table1 c on p.parent_id=c.parent_id
where parent_id=blablabla

выдаст необходимый вам результат.
Если поле parent проиндексировано база справится с этим быстрее
чем проход по дереву.
Но это не совсем то. При таком запросе(если на место blablabla поставить нужный parent_id) оно выдает только подгруппы первого уровня(да и то с повторениями), а глубже не заходит...
...
Рейтинг: 0 / 0
14.02.2006, 14:55
    #33543746
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
WWWovan onstat- WWWovan MasterZivМужчины, вы чего ? Форумом ошиблись ?
Почему ошиблись? Форум по sql, а база у меня на Yaffil висит... Ветка по С++, прога у меня на Builder C++ 6.0 пишеться...

Посмотрите в документацию, поддерживает ли ваша
база join.

select p.parent_id , c.product_id , p.name, c.name
from table1 p inner join table1 c on p.parent_id=c.parent_id
where parent_id=blablabla

выдаст необходимый вам результат.
Если поле parent проиндексировано база справится с этим быстрее
чем проход по дереву.
Но это не совсем то. При таком запросе(если на место blablabla поставить нужный parent_id) оно выдает только подгруппы первого уровня(да и то с повторениями), а глубже не заходит...

Повторения убираются с помощью distinct

а where выглядит приблизительно так:

с.parent_id in ( select t.product_id from table1 t where t.parent_id=c.product_id ) or p.parent_id=blablabla

Не буду отрицать, серверу будет тяжело.
...
Рейтинг: 0 / 0
14.02.2006, 15:05
    #33543808
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
onstat-...
а where выглядит приблизительно так:

с.parent_id in ( select t.product_id from table1 t where t.parent_id=c.product_id ) or p.parent_id=blablabla

Не буду отрицать, серверу будет тяжело.
В том-то и дело, что за один селект такого (выбрать сразу все уровни вложения "детей" при условии, что число уровней вложения заранее неизвестно) сделать нельзя!
Только через процедуру (Возможно - хранимую процедуру).
Я на подобную задачу (см.выше) не один день убил пока все понял и сделал правильно...
...
Рейтинг: 0 / 0
14.02.2006, 15:20
    #33543879
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Поэтому я и хочу выбрать сначала слектом с таблицы селектом все ID и PARENTID, а потом зная ID вершины родителя програмно определить всех его потомков и подпотомков. Програмно в первую очередь из-за того, что с базой будет работать не один человек(примерно 20)... а такие запросы они точно посувствуют...
...
Рейтинг: 0 / 0
14.02.2006, 15:41
    #33543966
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Станислав C.
В том-то и дело, что за один селект такого (выбрать сразу все уровни вложения "детей" при условии, что число уровней вложения заранее неизвестно) сделать нельзя!
Только через процедуру (Возможно - хранимую процедуру).
Я на подобную задачу (см.выше) не один день убил пока все понял и сделал правильно...

Меня настораживает ваша категоричность.

Почему нельзя зделать?
В чем ограничения?

На sql можно реализовать ветвленную
рекурсию значит можно реализовать обход графа.
Пример рекурсии я привел выше.
...
Рейтинг: 0 / 0
14.02.2006, 16:11
    #33544105
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
В таком варианте(уже адаптировано к моим условиям)
Код: plaintext
1.
2.
select p.parentid, c.id , p.name, c.name
from Wareh p inner join wareh c on p.PARENTID=c.PARENTID
where c.parentid in ( select t.id from Wareh t where t.parentid=c.parentid ) or p.parentid= 2 
Выдает то же самое что и с where p.parentid=2
...
Рейтинг: 0 / 0
14.02.2006, 17:31
    #33544397
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
WWWovan MasterZivМужчины, вы чего ? Форумом ошиблись ?
Почему ошиблись? Форум по sql, а база у меня на Yaffil висит... Ветка по С++, прога у меня на Builder C++ 6.0 пишеться...

Железная логика !!
...
Рейтинг: 0 / 0
14.02.2006, 17:35
    #33544408
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Когда с запросом натрахаетесь, сходите хотябы в http://www.sql.ru/forum/actualtopics.aspx?bid=2,
там вам быстро объяснят, почему нельзя, где нельзя и вообще.
...
Рейтинг: 0 / 0
14.02.2006, 18:52
    #33544636
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
WWWovanВ таком варианте(уже адаптировано к моим условиям)
Код: plaintext
1.
2.
select p.parentid, c.id , p.name, c.name
from Wareh p inner join wareh c on p.PARENTID=c.PARENTID
where c.parentid in ( select t.id from Wareh t where [color=red]t.parentid[/color]=c.parentid ) or p.parentid= 2 
Выдает то же самое что и с where p.parentid=2

похоже что
выделенное дожно быть t.id
...
Рейтинг: 0 / 0
14.02.2006, 19:11
    #33544670
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Результат другой, но все-равно не то что нужно...(результотов намного больше чем должно быть...в том числе и тех, которые не должны попадать...)
...
Рейтинг: 0 / 0
16.02.2006, 13:04
    #33548855
Гадёныш
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
вообщем у мну есть документация по графам...вообще.. могу скинуть..

Ziv ну и нафик так категорично настаивать... х) этж не ты мучаешся %)
...
Рейтинг: 0 / 0
17.02.2006, 19:42
    #33553395
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Гадёнышвообщем у мну есть документация по графам...вообще.. могу скинуть..

Ziv ну и нафик так категорично настаивать... х) этж не ты мучаешся %)
Можно. Но это уже для общего развития. Решение я уже нашел.
Мыло: gwf[собака]yandex.ru
...
Рейтинг: 0 / 0
19.02.2006, 01:45
    #33554246
Гадёныш
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
Усё смотри мыло
...
Рейтинг: 0 / 0
21.02.2006, 11:12
    #33557713
WWWovan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Графы. Обход в глубину и динамические масивы
ГадёнышУсё смотри мыло
Получил. Спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Графы. Обход в глубину и динамические масивы / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]