Главная Полное построение алгоритма [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [ 48 ] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] с ПРОСМОТР ВСЕХ ВЕРШИН. 00 too I S 1.Р с Vr это 1-я НОВАЯ ВЕРШИНА. VISIT(V) = I к i V с СЛЕДУЮЩАЯ СМЕЖНАЯ С V ВЕРШИНА. £00 К s WEXT(K) с ЕСТЬ ЛИ ЕЩЕ СМЕЖНЫЕ С V ВЕРШИНЫ? IF { К .GT. О ) GOTO 300 с ОСТАЛОСЬ ли ЧТО-НИБУДЬ В СТЕКЕ?- IF •( PTR .ЕО. О I RETURN С УДАЛЕНИЕ ТРЕХ ВЕРХНИХ ЭЛЕМЕНТОВ С ИЗ СТЕКА. V = STOREIPTR) К = ST0BE(PTR-1I STORE(PTR) = О ST0RE(PTR-1I = О PTR = PTR - г GOTO гоо с СЛЕДУЮЩАЯ СМЕ.ЖИАЯ С V ВЕРШИНА. 300 U = ADJIKI с ПРОВЕРЕНА ЛИ ВЕРШИНА W? IF { visiT(W) .GT. О I GOTO гоо с ПРИБАВЛЕНИЕ РЕБРА VX, С К ОСТОВНОМУ ДЕРЕВУ. TREE(Т.II = V TREE(Tt2) = W I = Т + t с ИМЕЕМ ли мы УЖЕ ОСТОВНОЕ С ДЕРЕВО? IF ( Т .EQ. Р ) RETURM С ЗАНОСИМ К, V И и В СТЕК с и ПРОВЕРЯЕМ W. STORe<PTR+Xl = к STORE(PTR+21 = V PTR = prR + г V = w 400 CONTIWC с этот ОПЕРАТОР НИКОГДА НЁ ДОЛЖЕН ДОСТИГАТЬСЯ. Vr1TEI6,1000> . 1000 F0RMAT(lHli25H ERROR IN SUBROUTINE DFS.J RETURN - Цачада TIG) последовательно просматриваются все вершины дерева на уровне k, затем все вершины на уровне кЛ-\ и т. д. При отыскании остовного дерева в сети G, изображенной на рис. 3.5.2, методом поиска в ширину было бы построено такое дерево, как на рис. 3.5.7. Теперь для полноты изложения опишем алгоритм отыскания остовного дерева в сети G методом поиска в ширину (алгоритм BFS). Алгори™ BFS начинает работу с произвольной вершины V и добавляет к списку LIST все смежные с V, еш,е не просмотренные вершины, отмечая каждую из них «просмотрена» в момент, когда она прибавляется к LIST. На каждой из последовательных итераций алгоритма для следующей вершины W из LIST проверяется, нет ли непросмотренных смежных с ней вершин, которые можно добавить к LIST. Как только к LIST добавляется новая вершина, ребро от нее к текущей, уже проверенной вершине добавляется к остовному дереву. Algorithm BFS {Поиск в ширину). Поиск остовного дерева Т в связной сети G, вершины которой перенуме-e/!ifm рованы 1, 2, . . ., М. Алго-4 ритм начинает работу в вер-3 шине U; VISIT (W)=l озна-I чает, что вершина W уже просмотрена; VISIT (1г)=0, если W не просмотрена. Рис 3.5.6. Дерево поиска в глубину, построенное алгоритмом DFS. Ротло здесь Шаг 0. [Инициализация] Set 1; I; for /с 1 to М do set USTiK) 0; and VISIT (/<:) -e-0 od;set LIST(l)f/; VISIT(t/)l; and Рис 3.5.7. Дерево поиска в ширину, построенное алгоритмом BFS. Шаг 1. [Проверка всех вершин] While LIST(/)#0 do through шаг 3 od; and STOP. Шаг 2. [Следующая вершина] Set V LIST (J); and J J+ + 1. Шаг 3. [Поиск всех непросмотренных смежных с V вершин] For всех вершин W, смежных с V, do шаг 4 od. Шаг 4. [Добавление непросмотренной вершины в LIST, а ребра -к Т] If VISIT (W7)=0 then set +1; LIST(/)ir; VISIT (IT) 1; and T-T+iV, W) ii. Начат sBecb 1 2 3 4 Б Вектор 4 4 4 0 2 a g в Рис. 3.5.8. Векторное представление остовного дерева. Теперь покажем простую, нерекурсивную реализацию алгоритма BFS. Выход VECTOR подпрограммы BFS - это рекурсивное представление остовного дерева Т сети G, которое обсуждалось в конце разд. 2.3. На рис. 3.5.8 показано это представление Т. Полная программа нахождения остовного дерева, использующая поиске ширину, представлена на рис. 3.5.9. Доказательство правильности и анализ сложности алгоритма BFS можно провести точно так же, как и для алгоритма DFS. Оставляем это читателю. Рассмотрите также следующий вопрос: какой алгоритм предпочтительнее, DFS или BFS? Или это можно установить не во всех случаях? Предлагаем вам проверить оба алгоритма, чтобы ответить на эти вопросы. Рекурсия в сравнении с итерацией Полное рассмотрение преимуществ и недостатков рекурсивных и итерационных алгоритаов лежит за пределами этой книги. Так же обстоит дело и с рассмотрением связей между рекурсией и итерацией, представляющих глубокий теоретический интерес. Кое-кто утверждал, что любой рекурсивный алгоритм следует преобразовывать в эквивалентный итеративный алгори™. Другие утверждают, что это не всегда имеет смысл делать. [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [ 48 ] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] 0.0709 |