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


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




[144]

Find-Set(s) («найти множество»). Возвращает указатель на представитель (единственного) множества, содержащего элемент х.

11шсш(ж,?/) («объединение»). Применима, если элементы хну содержатся в различных множествах Sx и Sy, и заменяет эти множества на объединение SxL)Sy; при этом выбирается некоторый представитель для U. Сами множества Sx и Sy при этом удаляются.

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

В этой главе мы оценим время работы операций над системами непересекающихся множеств. Параметрами будут число операций Make-Set (то есть общее число элементов во всех множествах), которое мы обозначим через га, а также суммарное число операций Union, Make-Set и Find-Set, которое мы обозначим через то. Прежде всего заметим, что (по определению) то га, а также что число операций Union не превосходит га - 1 (после каждой из них количество множеств уменьшается на единицу).

Пример использования систем непересекающихся множеств

Применим системы непересекающихся множеств к задаче о связных компонентах неориентированного графа (см. раздел 5.4; пример графа с четырьмя связными компонентами дан на рис. 22.1а).

Алгоритм Connected-Components (связные компоненты), приведённый ниже, разбивает множество вершин графа на непересекающиеся множества, соответствующие связным компонентам; после этого можно с помощью процедуры Same-Component выяснить, лежат ли две данные вершины в одной компоненте. Если граф задан заранее («режим off-Нпе»), быстрее найти его связные компоненты с помощью поиска в глубину (упражнение 23.3-9); однако если граф строится постепенно и в любой момент надо уметь отвечать на вопрос, каковы его связные компоненты («режим оп-line»), то может оказаться выгоднее применить наш алгоритм, а не проводить заново поиск в глубину после добавления каждого из рёбер.

Ниже E[G] и V[G] обозначают множества соответственно рёбер и вершин графа G.

Connected-Components(G)

1for (для) каждой вершины v\in V[G]

2do Make-Set(v)

3for (для) каждого ребра (u,v) \in E[G]

4do if Find-Set(u)\ne Find-Set(v)

5then Union(u,v)


Рис. 22.1 (часть (б) я даже б-м нарисовал)

обработанное ребро

непересекающиеся

множества

вначале

{а}

W

{с}

{d} {е}

{/}

ы

{h}

w

0"}

(b,d)

{а}

{M}

{с}

W

{/}

ы

{h}

w

0"}

(е,9)

{а}

{M}

{с}

{е,д}

{/}

{h}

w

0"}

(а, с)

{а, с}

{M}

{е,д}

{/}

{h}

w

0"}

{а, с}

{M}

{е,д}

{/}

{h,t}

0"}

(а, Ь)

{а, Ь, с,

4

{е,д}

{/}

{h,t}

0"}

(*>/)

{а, Ь, с,

4

{e,f,g}

{h,t}

0"}

(6, с)

{а, 6, с,

4

{e,f,g}

{h,t}

0"}

Рис. 22.1 22.1 а) Граф, состоящий из четырех связных компонент: {a,b,c,d}, {е, f,g}, {h, г} и {j}. б) Последовательные состояния системы непересекающихся множеств в процессе работы алгоритма connected-components.

Same-Component(u,v)

1if Find-Set(u)=Find-Set(v)

2then return true

3else return false

Алгоритм Connected-Components работает так. Сначала каждая вершина рассматривается как одноэлементное подмножество. Далее для каждого ребра графа мы объединяем подмножества, в которые попали концы этого ребра (рис. 22.16). Когда все рёбра обработаны, множество вершин разбивается на связные компоненты (упр. 22.1-2). Теперь процедура Same-Component определяет, лежат ли две данные вершины в одной связной компоненте, дважды вызвав процедуру Find-Set.

Упражнения

22.1-1

Следуя образцу рис. 22.1, опишите выполнение алгоритма Connected-Components для графа G, у которого V[G] =

{a,b,c,d,e,f,g,h,i,j,k}nE[G] = { (d,i), (/,&), (g,i), (b,g), (a,h),(d,k), (b,j), (d,f),

Рёбра обрабатываются в том порядке, в котором они выписаны. 22.1-2

Покажите, что алгоритм Connected-Components действительно находит связные компоненты графа. 22.1-3

Алгоритм Connected-Components применили к графу с v вершинами и е ребрами, состоящему из к связных компонент. Сколько при этом было вызовов процедур Find-Set и Union?


Рис. 22.2 Подпись:

а) Представление двух множеств с помощью списков. Представителем множества {Ь, с, е, h} является элемент с, представителем {d, /, д} является /. Каждый объект в списке содержит элемент множества, указатель на следующий элемент и указатель на представителя (то есть на начало списка), б) Результат выполнения операции Union(е,д). Представитель объединения множеств есть

22.2. Реализация с помощью списков

Самый простой вариант реализации системы непересекающихся множеств хранит каждое множество в виде списка. При этом представителем множества считается первый элемент списка, и каждый элемент списка содержит ссылки на следующий элемент списка и на первый элемент списка (который считается представителем списка). Для каждого списка мы храним указатели на его первый и последний элементы (второй из них нужен при добавлении элементов в конец списка). Порядок элементов в списке может быть любым. На рис. 22.2 (а) изображены два представленных таким образом множества.

При такой реализации операции Make-Set и Find-Set требуют времени 0(1): Make-Set создаёт список из одного элемента, а Find-Set возвращает указатель на начало списка.

Простейшая реализация объединения

При естественной реализации операция Union оказывается дорогостоящей. Выполняя UNlON(a:,?/), мы добавляем список, содержащий ж, к концу списка, содержащего у (рис. 22.2 Ь). Представителем нового множества при этом будет начало нового списка, то есть представитель множества, содержащего у. При этом нужно ещё установить правильные указатели на начало списка для всех бывших элементов множества, содержащего ж, и время на выполнение этой операции линейно зависит от размера указанного множества.

Легко привести пример, в котором время выполнения квадратично зависит от числа операций (рис. 22.3). Пусть даны га элементов Ж1,Ж2,.. - ,хп. Выполним операции Маке-8ет(ж8) для всех г = 1, 2,..., га, а затем га - 1 операций Unioni, х2), Union2, жз), ... , Union(хп 1, хп). Поскольку стоимость операции Union(жг-, Xi+\) пропорциональна г, суммарная стоимость выполнения 2га - 1 one-



[стр.Начало] [стр.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]