Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[210]

Рис. 30.3 30.3. Работа алгоритма LlST-PREFIX. (а). Вначале для k-го объекта значение у равно [к, к], а указатель next[k] указывает на (& + 1)-й объект (указатель последнего - на NIL), (b)-(d). Значения у и next после каждого выполнения цикла while (строки 3-6). В конце алгоритма (d) для к-ого объекта значение у равно [1, к].

равны nil), а к-ъ по списку элемент хранит значение [тах(1,А; - 2* + 1),к] для к = 1,2,... , га. Перед первым выполнением цикла (t = 0) каждый объект (кроме последнего) указывает на следующий. В строке 6 алгоритма к-ъ элемент (точнее, отвечающий за него процессор) вычисляет значение [к, /г+1] = [к, к] <g> [к + 1, к + 1], которое передаётся (к + 1)-му элементу. Указатели меняются так же, как и в алгоритме List-Rank. Состояние списка после первого выполнения цикла показано на рис. 30.3 (Ь). При втором выполнении цикла к-ъ элемент (при к = 2, 3,... , га - 2) вычисляет значение [к - 1, к + 2] = [к - 1, к] <g> [к + 1, к + 2], которое передаётся к + 2-му элементу; результат показан на рис. 30.3 (с). Наконец, в ходе третьего (последнего) выполнения цикла оставшиеся два элемента вычисляют нужные значения (рис. 30-3 (d)).

Как и предыдущий алгоритм, алгоритм List-Prefix работает за время О (lgra), а общие затраты составляют О (га lgra).

30.1.5. Метод эйлерова цикла

В этом разделе рассмотрен метод эйлерова цикла и его использование в задаче вычисления глубины вершин двоичного дерева. Если дерево имеет га вершин, то вычисление их глубин займёт время О (lgra); при этом будет использована техника параллельной обработки префиксов.

Дерево хранится в памяти так, как описано в разделе 11.4: каждая вершина i имеет поля parent[i] (родитель), left[i] (левый ребёнок) и right[i] (правый ребёнок).

Имея один процессор, можно вычислить глубину всех вершин дерева с га вершинами за время О (га). Как сократить это время, используя несколько процессоров? Простейший параллельный алгоритм состоит в движении от корня дерева к листьям с увеличением счётчика глубины. При этом вершина глубины к достигается в момент времени к, так что время работы пропорционально высоте дерева. Для полного дерева этот алгоритм требует логарифмического времени, но бывают деревья, у которых высота равна п - 1. Метод эйлерова цикла, который мы сейчас изложим, позволяет обработать любое дерево с га вершинами за время 0(lg га) (независимо от его высоты).

Эйлеровым циклом в графе называется путь, проходящий ровно один раз по каждому ребру (вершины могут проходиться мно-


Рис. 30.4 30.4. Использование метода эйлерова цикла для вычисления глубины вершин двоичного дерева, (а) Эйлерову циклу (обходу дерева) соответствует список. Каждый процессор хранит число, которое используется при параллельном вычислении префиксов. (Ь) Результат вычисления префиксов для дерева на рисунке (а). С-процессор каждой вершины (зачернённый) содержит её глубину.

гократно). Согласно задаче 23-2, связный ориентированный граф имеет эйлеров цикл в том и только в том случае, когда у каждой вершины входная и выходная степени совпадают. Если превратить связный неориентированный граф в ориентированный, заменив каждое ребро двумя противонаправленными, то такой граф, очевидно, будет иметь эйлеров цикл.

Пусть Г - двоичное дерево. Будем предполагать, что его вершины занумерованы неотрицательными целыми числами. С каждой вершиной мы связываем три процессора А, В ж С] узлу с номером г соответствуют процессоры с номерами Зг, Зг + 1 и Зг + 2. Рассмотрим ориентированный вариант дерева (с удвоенными рёбрами). Эйлеров цикл (или обход дерева) можно превратить в список (см. рис. 30.4(a)):

•А-процессор вершины указывает на А-процессор левого ребёнка, если он есть, а иначе на 5-процессор той же вершины.

•5-процессор вершины указывает на А-процессор правого ребёнка, если он есть, а иначе на С-процессор той же вершины.

•С-процессор вершины указывает на 5-процессор родителя, если это левый ребёнок, и на С-процессор родителя, если это правый ребёнок. С-процессор корневой вершины указывает на NIL.

Таким образом, список начинается в А-процессоре корневой вершины и заканчивается в её С-процессоре. Этот список может быть построен по данному дереву за время 0(1).

Глубину каждой вершины можно подсчитать как сумму изменений глубин по пути к ней (по эйлеровому циклу). Более формально, пусть в каждом А-процессоре находится число 1, в каждом В-процессоре - число 0, а в каждом С-процессоре - число ( - 1). Произведём параллельное вычисление префиксов, используя в качестве операции обычное сложение. Его результат для дерева рис. 30.4(a) показан на рис. 30.4(b).

После этого С-процессор каждой вершины будет содержать её глубину, а А- и 5-процессоры - на единицу большее значение. Это можно проверить, двигаясь вдоль эйлерова цикла. В самом деле, к А-процессору ведёт стрелка вниз по дереву с началом в А- или 5-процессоре родителя; к 5-процессору ведёт либо стрелка вверх из С-процессора левого потомка, либо стрелка из А-процессора той же вершины; к С-процессору ведёт либо стрелка вверх из С-процессора правого потомка, либо стрелка из 5-процессора той


же вершины; во всех случаях наше утверждение остаётся верным.

Создание списка занимает время 0(1), а параллельная обработка префиксов - время 0(lg3ra), т. е. О (lgra). Таким образом, общее время работы составляет О (lgra). Поскольку параллельная обработка префиксов не требует одновременного доступа к памяти, алгоритм может быть реализован на EREW-машине.

Упражнения

30.1-1. Укажите EREW-алгоритм, который для каждого элемента га-элементного списка определяет, является ли он средним ( га/2 -м), за время O(lgra).

30.1-2. Постройте EREW-алгоритм для обработки префиксов массива х[1.. .га] за время О (lgra). (Можно обойтись без указателей)

30.1-3. Пусть в списке L имеются объекты двух разных типов (некоторые красные, а остальные синие). Укажите эффективный EREW-алгоритм, формирующий из этого списка два: один из синих объектов, а другой из красных (с сохранением взаимного расположения).

30.1-4. Пусть имеется несколько непересекающихся кольцевых списков, содержащих в совокупности га элементов. Укажите эффективный EREW-алгоритм, который выбирает по одному представителю из каждого списка и сообщает каждому элементу, кто является представителем его списка. (Считается, что процессоры занумерованы и каждому процессору известен его собственный номер.)

30.1-5. Найдите EREW-алгоритм, который за время 0(lg га) определяет для каждой вершины размер поддерева с корнем в этой вершине. (Указание: следует взять разность двух префиксов суммы вдоль эйлерова цикла).

30.1-6. Вершины дерева можно нумеровать в разном порядке. Рассмотрим три способа: корень - левое поддерево - правое поддерево (preorder); левое поддерево - корень - правое поддерево (inorder); левое поддерево - правое поддерево - корень (pos-torder). Укажите для каждого из способов алгоритм, вычисляющий номера всех вершин.

30.1-7. Распространите метод эйлерова цикла на деревья с произвольной степенью вершин (выбрав подходящее представление дерева). Постройте алгоритм, вычисляющий глубину всех га вершин дерева (в этом представлении) за время О (lgra).

30.1-8. Измените алгоритм List-Rank так, чтобы проверка условия окончания цикла производилась явно (без использования управляющей сети), сохранив оценку на работы. (Указание: следите за первым элементом списка).



[стр.Начало] [стр.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] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]