Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
Задача не имеет прямого отношения ни к C#, ни к NET. Но все же нужно ее решить. Итак, есть табличка с двумя полями ID, OwnderID в ID содержится ID :) (уникальный), в OwnerID содержится ID владельца этого елемента (NULL если нет). Вот сие чудо нужно превратить в XML файл. Меня не интересуют подробности технической реализации (подключение к базе, создание XML и т.д., эт слава богу сам умею делать), меня интересует сам алгоритм. Есть пару идей, но чувствую что они не самые удачные, посему и прошу помощи. Все усложняется тем что кол-во данных от 100 тыс до 500 тыс записей, и использование Hashtable и прочих не желательно (слишком большие затраты ресурсов и времени на boxing/unboxing), про genetics еще пока не думал. Короче мож кто-то сталкивался с подобной задачей, или может где-то можно почитать (и плз. не надо ссылок на инфу о деревьях и т.д. у меня том Кнута на столе лежит). _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 10:55 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
Не понял. Алгоритм чего? Получения XML? Это можно сделать селектом For XML. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 11:07 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
Проблема состоит в раскрутке дерева... что б построить XML мне нужно знать корневой елемент, а потом постепенно подсоединять к нему дочерные елементы. _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 11:31 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
Если есть таблица с селф связью (дерево без органичения вложенности), и, надеюсь, она в MSSQL (ну или хотя бы в Oracle :) ), то есть ,имхо, два пути его (дерева) раскрутки: 1. на сервере, путем неявной рекурсии, если не использовать вспомагательных таблиц. Кстати не самый плохой метод. Я спокойно раскручивал дерево в 60 тыс. элементов с уровнем вложения до 10. Время нараскрутку 3-4 секунды на не самой крутой тачке, и запрос написан в лоб (до оптимизации руки не дошли пока) 2. явная рекурсия на клиенте. Здесь все и проще и сложнее. Алгоритм обхода достаточно прост - от корня к листьям - запросы по требованию (on demand). Приблизительно как при заполнении treeview на обработчике события Expand - тут (или в ADO.NET форуме это уже обсуждалось). Ресурсов уходит мало, если конечно в ветках не по миллиону элементов! Но скорость сильно зависит от мощности клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 11:39 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
Первый не подходит так как я в жестких рамках универсальности :( Все приходиться делать на клиенте (причем я не знаю, ни базу, ни структуру таблицы, ни названия полей... все идет на вход). Согласен, воторой варинт работает. Насколько я нпонимаю по ходу рекурсии нужно вычищать прочтенные данные дабы не париться с ними каждый раз... _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 11:44 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
авторНасколько я нпонимаю по ходу рекурсии нужно вычищать прочтенные данные дабы не париться с ними каждый раз Дык они сами очистятся, как только reader (recordset, dataset и т.д...) заполнишь данными от следующего узла. Сборка мусора, мать его... (мусор :) ) Проблема с ресурсами может возникнуть, если вложенность оооочень большая :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 11:52 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
С Reader-ом я чет слабо представлю процесс... предположим мне вернулся DataReader reader с полями "ID", "OwnerID" while(reader.Read()) { .... } Каким образом я смогу родить рекурсию если мне доступна только текущая запись? Ведь не извесно будет ли следующая запись потомком текущей, а может она будет потомком потомка текущей, или вообще отдельной ветвью... _________________________________________________ Легче написать не правильную программу чем понять правильную (С) Alan Perlis ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 12:02 |
|
||
|
Раскрутка дерева
|
|||
|---|---|---|---|
|
#18+
авторпредположим мне вернулся DataReader reader с полями "ID", "OwnerID" Нет, вернулся reader с полями "ID", "OwnerID" и "HasChildren" где-то так для MSSQL: Код: plaintext 1. 2. 3. 4. 5. Ну а дальше, я думаю понятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2004, 12:31 |
|
||
|
|

start [/forum/topic.php?fid=20&gotonew=1&tid=1438688]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
11ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 448ms |

| 0 / 0 |
