www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал «Системный администратор»
Журнал «БИТ»
Подписка
Спецпроекты
Вебинары
Архив номеров
Где купить
Авторам
Рекламодателям
О НАС
   

  Опросы
  Статьи

Вопрос-ответ  

ИИ на службе сисадмина: есть ли польза?

При использовании искусственного интеллекта в работе системного администратора порой бывает сложно понять,

 Читать далее...

Управление командой  

Удаленка навсегда: как выстроить IT-инфраструктуру для территориально распределенной команды

По мнению экспертов, в 2026 году удаленная работа становится всё более востребованной

 Читать далее...

Книжная полка  

Искусственный интеллект лидирует уже в книгах

Издательство «БХВ» выпустило несколько книг, которые будут интересны всем, кто хочет использовать возможности

 Читать далее...

Мониторинг  

Какая задача мониторинга отнимает больше всего времени?

Многие системные администраторы тратят до 30% рабочего времени на рутину мониторинга. Но

 Читать далее...

Рынок труда  

Какие навыки вы хотите развивать в 2026 году?

Рынок труда меняется быстро. Еще вчера его называли рынком соискателей, а сегодня

 Читать далее...

Книжная полка  

От сисадмина до архитектора: книги, которые прокачают ваш стек в этом году

Новинки от издательства «БХВ» отличаются тем, что в них часто делается упор

 Читать далее...

Автоматизация  

Автоматизируем рутину: что реально работает?

Многие сисадмины автоматизировали что-то за последний год. Но далеко не все остались

 Читать далее...

Защита ИТ-системы  

Практическая защита: что вы внедрили и что мешает?

Какие меры безопасности реально внедрить в реальных условиях – и что не

 Читать далее...

Вопрос-ответ  

Обеспечиваем безопасную эксплуатацию базы данных

Что для вас чаще всего является причиной инцидентов с БД? Как вы

 Читать далее...

Книжная полка  

От «безопасного» Linux до Контролируемого взлома

Издательство «БХВ» продолжает радовать читателей интересными новинками и в наступившем году. Вы можете

 Читать далее...

Перспективы роста  

Как расти ИТ-специалисту, не уходя в начальство

Далеко не все ИТ-специалисты мечтают стать большими ИТ-начальниками. Среди айтишников есть

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 15634
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 15773
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 13227
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 6904
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 7747
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 7649
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 10443
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 7075
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 7319
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 11491
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 14981
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 16411
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 19130
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 14023
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 11986
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 10222
Комментарии: 4
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 8279
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 7174
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 6706
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 7048
Комментарии: 1
Рецензия на книгу «MongoDB в действии»

 Читать далее...

Друзья сайта  

 Основные процедуры для работы с деревьями

Архив номеров / 2007 / Выпуск №12 (61) / Основные процедуры для работы с деревьями

Рубрика: Программирование /  Веб-программирование

АЛЕКСАНДР ЯМПОЛЬСКИЙ

Основные процедуры для работы с деревьями

Иерархические структуры доминируют в мире. Систем, построенных на основе бескомпромиссного иерархического подхода, немного, так как такой подход выглядит труднореализуемым. Однако его применение повысит вероятность того, что ваша система в конце концов не окажется в тупике.

Статья содержит реализации основных («штатных») процедур для работы с деревьями, включая реализацию алгоритма эвристического поиска. Я попытался продемонстрировать преимущества алгоритма обхода «в ширину» при работе с большими деревьями.

Отличительной особенностью алгоритма является то, что он не использует инструментов, создающих неопределенность с точки зрения требований к памяти, таких как рекурсия, очереди и т. п.

Основные процедуры для работы с деревьями

В системах обработки информации иерархические объекты моделируются деревьями. Схема на рис. 1 демонстрирует связи между объектами, формирующими ветвь дерева.

Рисунок 1. Схема ветви дерева

Рисунок 1. Схема ветви дерева

На языке C# эта схема может быть реализована с помощью следующей структуры:

public struct ObjectN   // объект (узел дерева)

   {

   public string J_NAME;       // имя объекта

   public long J_TYPE;  // тип объекта(носитель знаний)

   public long IDF,     // указатель на «отца»

               IDB,     // указатель на «брата»

               ID1C;    // указатель на первого потомка

   }

Дерево моделируется массивом структур ObjectN:

public static ObjectN[] obj = new ObjectN[];

В качестве идентификатора объекта выступает индекс массива. В реальных системах дерево может храниться в файле, записи которого имеют структуру ObjectN. В этом случае номер записи файла будет являться идентификатором объекта.

Схема, показанная на рис. 1, позволяет легко строить и модифицировать деревья произвольного размера и конфигурации. Проблемы с добавлением узлов и вставкой ветвей отсутствуют (имеется в виду отсутствие проблем с перенастройкой системы связей между объектами). Например, для добавления нового узла необходимо знать индекс свободной ячейки массива и идентификатор объекта-«отца»:

FreeCell = getfreecell();

obj[FreeCell].IDF = FatherIdentifier;

obj[FreeCell].IDB = obj[FatherIdentifier].ID1C;

obj[FatherIdentifier].ID1C=FreeCell;

Все запросы к иерархически организованным структурам реализуются в процессе обхода узлов дерева. Основной целью обхода является выделение из сложной структуры отдельных фрагментов – целевых объектов.

Существуют два основных метода обхода древовидных структур: «depth first» обход (обход в глубину, далее DF-обход) и «breadth first» обход (обход в ширину, далее BF-обход).

Маршрут DF-обхода показан на рис. 2.

Рисунок 2. Схема DF-обхода

Рисунок 2. Схема DF-обхода

Общее направление обхода – поперек дерева. В процессе обхода для обработки (например, для формирования списка целевых объектов) хаотично выдаются узлы разного уровня. С первых шагов курсор уходит вглубь и, если дерево большое, нескоро вновь окажется на поверхности. Этот метод обхода по смыслу не соответствует иерархической структуре.

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

Маршрут BF-обхода показан на рис. 3.

Рисунок 3. Схема BF-обхода

Рисунок 3. Схема BF-обхода

Общее направление обхода – сверху вниз. В процессе обхода для обработки последовательно выдаются узлы одного уровня. Курсор предпочитает держаться ближе к поверхности, т.е. к исходному узлу дерева. Можно надеяться, что в этой достаточно ограниченной зоне сосредоточены либо сами целевые объекты, либо промежуточные целевые объекты (т.е. объекты, при посещении которых может быть выполнена процедура отсечения, см. далее). Этот метод обхода, по-видимому, наиболее соответствует иерархической структуре.

Недостатки метода связаны с процедурой его реализации. Узлы в процессе BF-обхода посещаются более одного раза. Отсечение ветвей выполнить труднее, чем при DF-обходе.

Работа с большими деревьями невозможна без использования процедуры отсечения ветвей. Решение об отсечении принимается на основе знаний об отношениях между встреченными и целевыми объектами. Например, мы знаем, что бесперспективно искать письма в фотоальбоме. В случае дефицита знаний принятие решения об отсечении в данном узле невозможно. В этом случае встает вопрос о том, куда двигаться дальше: уходить в глубину, т.е. совершать DF-обход, или оставаться на поверхности, т.е. совершать BF-обход. На мой взгляд, второй вариант более безопасен по причине, которая уже упоминалась при обсуждении особенностей BF-обхода.

Преимущества BF-обхода могут быть использованы в процедурах поиска объектов. Например, нужно найти файл mpwt.doc. Полный адрес файла: docsdescsourvar1ver1mpwt.doc.

Было бы неплохо иметь возможность вместо полного адреса вводить отдельные узловые точки. В этом случае задание на поиск объекта могло бы выглядеть так: desc;var1;mpwt.doc. Папки desc и var1 являются промежуточными целевыми объектами. Для того чтобы выполнить задание, процедура поиска должна быстро просканировать близлежащие уровни и выполнить необходимые отсечения.

Я думаю, что полезной стратегией поиска могла бы быть такая: как можно быстрее найти хотя бы один целевой объект, получить от него дополнительную информацию, использовать эту информацию для уточнения района дальнейшего поиска. BF-обход хорошо подходит для этой стратегии.

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

Тип объекта можно рассматривать как ссылку на абстрактный объект, обладающий типовыми свойствами. Это эквивалентно понятию «класс» в языках программирования.

Разработчику иерархического специализированного приложения придется выстроить собственную систему работы со знаниями. Такие понятия, как абстрактные объекты, типовые структуры объектов, типовые свойства и отношения объектов и т. п., должны храниться в базе знаний системы. Например, файл отношений между абстрактными объектами может выглядеть так, как представлено в таблице.

Файл отношений между абстрактными объектами

Идентификатор абстрактного объекта (первый объект пары)

Идентификатор абстрактного объекта (второй объект пары)

Тип отношения

Значение отношения

…

…

…

…

Письмо

Альбом фотографий

Иерархическая совместимость

Не совместимы

…

…

…

…

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

Нерекурсивная процедура descent реализует на языке C# алгоритм BF-обхода дерева объектов. Вместе со встроенной возможностью отсечения ветвей она также реализует алгоритм эвристического поиска:

public static int descent(long SourceObj,int TravDepth)

// SourceObj - указатель исходного узла обхода

// TravDepth - лимит глубины обхода

{

long[] Router = new long[TravDepth]; // маршрутизатор

int Lev, // счетчик уровней дерева

    cur; // вспомогательный указатель уровня

bool EOTree, // признак завершения дерева

     EOLev; // признак завершения уровня

long ObjPnt, // вспомогательный указатель объекта

     FirstCh; // указатель на первого потомка исходного узла

FirstCh=obj[SourceObj].ID1C;

EOTree=false;

Lev=0;

while (!EOTree && Lev<TravDepth)

   {// цикл по уровням

   EOTree=true;

   ObjPnt=FirstCh;

   Lev=Lev+1;

   cur=1;

   EOLev=false;

   while (!EOLev)

      {// DF-обход фрагмента дерева глубиной Lev

      // спуск по левому краю ветви

      while (cur < Lev)

         {

         Router[cur]=ObjPnt;

         cur=cur+1;

         // Здесь может быть вставка – фрагмент кода,реализующий отсечение

         ObjPnt=obj[ObjPnt].ID1C;

         if (ObjPnt<1) break; // узел не имеет потомков

         }

      // выпуск очередной порции узлов уровня Lev

      while (ObjPnt>0)

         {

         Console.WriteLine("object: {0}",obj[ObjPnt].J_NAME);

         // здесь может быть процедура обработки объекта

         EOTree=EOTree && (obj[ObjPnt].ID1C<1);

         ObjPnt=obj[ObjPnt].IDB;

         }

      // подняться по массиву Router до первого ненулевого указателя на объект

      cur=cur-1;

      while (cur>0)

         {

         ObjPnt=obj[Router[cur]].IDB;

         if (ObjPnt>0) break;

         cur=cur-1;

         }

      if (cur == 0) EOLev=true;

      } // обход фрагмента дерева глубиной Lev

   } // цикл по уровням

return(0);

}

Выпуск узлов уровня Lev осуществляется в результате DF-обхода верхней части (от уровня 1 до уровня Lev) дерева, но только узлы уровня Lev выпускаются.

В процессе BF-обхода дерева с количеством уровней L каждый узел, лежащий на уровне Lev, посещается L-Lev+1 раз. В момент посещения каждого узла его полная генеалогия хранится в массиве Router. Как видно, BF-обход является надстройкой над DF-обходом.

Эта избыточность алгоритма иногда может обернуться его преимуществом. Так как процедура постоянно откатывается назад, она имеет возможность в это время подкорректировать параметры отсечения ветвей и соответственно границы района поиска объектов.

Отсечения неперспективных объектов возможны с помощью следующей процедуры:

// фрагмент кода, реализующий отсечение

// compatible – функция, определяющая совместимость объектов

// target_j_type - тип целевого объекта

if (!compatible(obj[ObjPnt].J_TYPE, target_j_type))

   {

   ObjPnt=0;

   break; // как если бы узел не имел потомков

   }

Процедура наследования свойств реализуется с помощью посещения предков объекта и получения от них недостающей информации.

while (ObjPnt != RootPnt)

   {

   // if (информация получена) break;

   ObjPnt=obj[ObjPnt].IDF;

   }

Эту процедуру можно использовать в процессе обработки выделенных объектов, т.е. после того, как процедура обхода выполнила свою задачу, сформировав список целевых объектов.

Заключение

В случае больших деревьев маловероятно то, что полная информация об отношениях между объектами доступна. BF-обход с использованием (там, где это возможно) отсечений – наиболее подходящая процедура для работы с такими деревьями.

Удачи!


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru