Шаг 82.
Поиск на графах

    На этом шаге мы приведем общие сведения по организации поиска на графах в языке LISP.

    Одной из самых распространенных задач, связанных с графами, является поиск на графах.

    Под поиском на графах мы будем понимать процесс систематического просмотра всех вершин графа с целью отыскания вершин, удовлетворяющих некоторому условию.

    Для организации простейшего поиска в графе, заданном с помощью неизвестной (!) списочной структуры, используется инкапсулированный тип данных множество. Идея алгоритма ясна из приведенной ниже программы.

    Программа.

   (DEFUN WALK (LAMBDA (GRAPH)
      (COND ( (NULL GRAPH) NIL )
            (  T  (LIST-SET (ONE-RANGE GRAPH)) )
      )
   ))
   ; ------------------------- ;
   (DEFUN LIST-SET (LAMBDA (LST)
   ; Функция LIST-SET преобразует список LST в множество ;
      (COND ( (NULL LST) NIL )
            ( (MEMBER (CAR LST) (CDR LST))
                (LIST-SET (CDR LST)) )
            ( T (CONS (CAR LST)
                      (LIST-SET (CDR LST))) )
      )
   ))
   ; -------------------------- ;
   (DEFUN ONE-RANGE (LAMBDA (LST)
   ; Списочная структура LST "ужимается" в ;
   ;          одноуровневый список         ;
      ( (NULL LST) NIL )
      ( (ATOM LST) (CONS (CAR LST) NIL) )
      ( APPEND (ONE-RANGE (CAR LST)) (ONE-RANGE (CDR LST)) )
   ))
Текст этой программы можно взять здесь.

    Тестовый пример:

   $ (WALK '((1 . (2 3 4)) (2 . (3)) (3 . (4))))
   (1 2 3 4)

    На следующем шаге мы рассмотрим поиск в глубину.




Предыдущий шаг Содержание Следующий шаг