|
Следващата функция е малко по-сложна. Преди да я разгледаме, нека изясним каква е идеята на намиране на поддърво.
Започваме от даден възел, който се явява стартов възел. Намираме всички негови наследници (аналогично на предходната функция) и съставяме списък, съдържащ идентификаторите на току що намерените клиенти.След това намираме всички клиенти, чиито родители са в гореспоменатия списък. Списъка се нулира, в него се записват идентификаторите на новополучените клиенти и т.н. Функцията по-долу е точна реализация на гореописания алгоритъм. И така, да започваме: CODE
Този алгоритъм е прост, но но точно тази реализация е крайно неефективна за големи набори от данни, защото: 1) Обектът "DataSet" извлича всички записи и ги пази в паметта на локалната машина (това е равносилно на син екран или най-малкото компютъра ще заспи, ако го пробвате с 10 000+ записа). 2) Линейността на алгоритъма (+) се компенсира от факта, че колокто е по-широко дървото, толкова по-бавно се извличат данните за всяка следваща итерация (-). 3) Нямаме достъп до всеки елемент поотделно, записите се разглеждат "на нива". Това е като плюс, така и минус. Защото понякога е необходим анализ дали точно даден възел да бъде включен в дървото или не! 4) Скоростта на "MS-Access" не е от най-задоволителните. 5) Не е предвиден вариант за извличане на поддърво до определено ниво надолу. За да се решат тези проблеми е необходимо да се използва по-качествана база данни (не е задължително да е MS-SQL), да се създаде функция, която да приема като параметри входящ възел и броя нива, които трабва да се извлекат от базата данни. Функцията трябва да връщя като резултат динамично генерирана таблица, съдържаща поддървото. Следващата стъпка е да се напише съхранена процедура, която вътрешно да извиква функцията. Резултатът трябва да е същата таблица, която връща функцията, най-много с леки изменения (например не винаги желаем крайната таблица да съдържа началния възел). Последната стъпка е да въведем ASP.NET код, който да изпълни съхранената процедура на DB сървъра и да отчете крайния резултат. Тъй като целта на този урок е повече демонстрационна, не смятам, че е необходимо да излагам подробности по имплементацията на функцията и съхранената процедура, но ако някой има желание, нека даде мнението си за урока и ще публиувам урок "за напреднали дървета" :)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









