Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1800 / 482 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 3:

Разделенные множества

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Теорема 1. Время выполнения последовательности операций, состоящей из n операций СОЗДАТЬ, u \le n - 1 операций ОБЪЕДИНИТЬ и f операций НАЙТИ, при использовании рангов и сжатия путей является величиной O((f + n)\log^\ast\!u).

Доказательство Пусть s_1, s_2\dts s_m — все операции вида СОЗДАТЬ, ОБЪЕДИНИТЬ, НАЙТИ, объявленные в формулировке теоремы и выписанные в порядке их следования, m = n + u + f. Очевидно, суммарная трудоемкость всех операций СОЗДАТЬ есть O(n), суммарная трудоемкость всех операций ОБЪЕДИНИТЬ есть O(u). Остается оценить суммарную трудоемкость операций НАЙТИ.

Через r_t(x) обозначим ранг узла x, который получится после выполнения операции s_t, а p_t(x) — родитель узла x, получающийся после выполнения этой операции. Определим множество

\eq*{
G_k(t) = \{x: \log^\ast r_t(x) = k\} = \{x: b(k) \le
r_t(x) < b(k + 1)\}.
}
Для краткости будем обозначать \log^\ast r_t(x) = i_t(x).

Поскольку ранг узла может увеличиваться лишь при выполнении операции ОБЪЕДИНИТЬ, причем не более чем на 1, после u таких операций ранг никакого узла не может стать больше u, следовательно, максимальный индекс k, при котором G_k(t) может быть непустым, равен \log^\ast\!u.

Оценим теперь суммарное время, требуемое для выполнения f операций НАЙТИ; очевидно, оно пропорционально числу ребер, ведущих от сыновей к отцам и встречающихся при выполнении всех таких операций. Для оценки времени, затрачиваемого на реализацию этих операций, применим бухгалтерский прием. Отнесем расход времени на прохождение очередного ребра (x, y) от узла x к его родителю y при выполнении операции s_{t+1} типа НАЙТИ на одну из трех разных статей расходов: "корневую", "транзитную" и "местную" в зависимости от следующих условий.

Если i_t(x) \ne i_t(y) и y в данный момент не является корнем, то расходы относим на статью T транзитных расходов. Если i_t(x) = i_t(y) = k и y не является корнем, то на статью M_k местных расходов в k -м диапазоне, если же y — корень, то на статью K корневых расходов.

Сумму местных расходов во всех диапазонах обозначим через

\eq*{
M=\suml_{k=0}^{\log^\ast\!u} M_{k}.
}

Имеем K = O(f), так как при каждом выполнении операции НАЙТИ проходится одно корневое и, возможно, одно прикорневое ребро.

Для транзитных переходов имеем T = O(f\cdot \log^\ast\!u), так как при каждом выполнении операции НАЙТИ происходит не более \log^\ast\!u переходов из одного диапазона в другой.

Для оценки величины M введем потенциал c_t(x) =
r_t(p_t(x)) узла x после выполнения операции s_t. Если к узлу x еще не применялась операция СОЗДАТЬ, то c_t(x) = 0.

Потенциалом группы G_k(t) при текущем состоянии коллекции назовем величину

\eq*{
C_{k}(t)=\suml_{x\in G_{k} (t)} c_{t}(x).
}

Очевидно, что в любой момент времени справедливо неравенство

\eq{
C_k(t) \le |G_k(t)| b(k + 1).
} ( 1)

Покажем, что для любого узла x при любом t = 1, 2, 3\dts
m выполняется неравенство c_t(x) \ge c_{t-1}(x). Действительно, если s_t — операция СОЗДАТЬ ( x ), то

\eq*{
c_{t-1}(x) = c_t(x) = 0,
}
то есть потенциал узла x, так же, как, очевидно, и всех остальных, не изменяется. Пусть теперь s_t — операция ОБЪЕДИНИТЬ (x, y).

В случае r_{t-1}(x) < r_{t-1}(y) имеем

\eqa*{
c_t(x) & = r_t(p(x)) = r_t(y) = r_{t-1}(y) > r_{t-1}(x)
= r_{t-1}(p(x)) = c_{t-1}(x)\ \ \t{и }\\
c_t(y) & = c_{t-1}(y).
}
Случай r_{t-1}(x) > r_{t-1}(y) аналогичен.

В случае r_{t-1}(x) = r_{t-1}(y) имеем

\eq*{
\begin{aligned}
c_t(y) & = r_t(p(y)) = r_t(y) =  r_{t-1}(y) +
1 > r_{t-1}(y) = r_{t-1}(p(y)) = c_{t-1}(y),\\
c_t(x) & = r_t(p(x)) = r_t(y) =
r_{t-1}(y)+1 > r_{t-1}(y) =\\ & \qq\qq\qq\;\qq\qq\qq\qq = r_{t-1}(x)
= r_{t-1}(p(x)) = c_{t-1}(x).
\end{aligned}
}

Пусть теперь s_t является операцией НАЙТИ, проходящей через узел x, и при этом p_{t-1}(x) — не корень ( x получает нового родителя p_t(x)). Тогда имеем

\eq*{
c_t(x) = r_t(p_t(x)) = r_{t-1}(p_t(x)) > r_{t-1}(p_{t-1}(x))
= c_{t-1}(x).
}

В этом случае совершен переход по внутреннему ребру (местный или транзитный).

Итак, для любого узла x величина c(x) при выполнении операции вида СОЗДАТЬ, ОБЪЕДИНИТЬ, НАЙТИ не может уменьшиться и, следовательно,

\eq*{
C_k(t) \ge C_k(t- 1).
}

При этом, если s_t — операция НАЙТИ, то у M_k(t) вершин при ее выполнении потенциал увеличится, по крайней мере, на 1, следовательно, число M_k(t) местных переходов в группе G_k(t) при ее выполнении удовлетворяет неравенству

\eq*{
M_k(t) \le C_k(m) - C_k(m - 1).
}

Суммируя это неравенство по всем t и учитывая неравенство (1), получаем, что число M_k местных переходов при всех операциях \mbox{НАЙТИ} удовлетворяет неравенству

\eq*{
M_k \le C_k(m) - C_k(0) \le C_k(m) \le |G_k| b(k + 1).
}

Заметим далее, что утверждение леммы 2, которая гарантирует, что количество узлов ранга r не более n/2^r, остается верным и при использовании сжатия путей, так как при выполнении операции НАЙТИ ранги элементов не меняются. Следовательно, справедливы соотношения

\eq*{
|G_{k} | =\suml_{r=b(k)}^{b(k+1)-1}
\frac{n}{2^{r}} < \frac{n}{2^{b(k)}} \left(1+\frac{1}{2}
+\frac{1}{4} +\frac{1}{8} +\ldots \right)=
\frac{2n}{2^{b(k)}} =\frac{2n}{b(k+1)}.
}

Отсюда

\eqa*{
M_{k} & \le \frac{2n}{b(k+1)} b(k+1)=2n,\\
M & = \suml_{k=0}^{\log^\ast\!u} M_{k} =O(n\cdot \log^\ast\!u).
}

Итак, суммарная трудоемкость выполнения f операций НАЙТИ равна

\eq*{
K + T + M = O(f + f\cdot \log^\ast\!u + n \log^\ast\!u) =
O((f + n) \log^\ast\!u).
}
Учитывая теперь оценки трудоемкости операций СОЗДАТЬ и ОБЪЕДИНИТЬ, получаем утверждение теоремы.

Замечание. Используя функцию Аккермана, задаваемую равенствами

\begin{alignat*}{2}
A(1,j) & = 2^j \q && \t{при } j \ge 1,\\
A(i,1) & = A(i - 1, 2)\q && \t{при } i \ge 2,\\
A(i,j) & = A(i - 1, A(i,j - 1))\q && \t{при } i, j \ge 2.
\end{alignat*}

и обратную к ней функцию

\eq*{
\al(f, n) = \min\{i \ge 1: A(i, \lfloor f/n\rfloor) > \log n\},
}

Р.Е.Тарьян доказал, что время выполнения последовательности, состоящей из u операций ОБЪЕДИНИТЬ с перемешанными с ними f операциями НАЙТИ, где u \le n - 1, u +
f = m, является величиной O(m\cdot \al (m, n)). Также он показал, что эта оценка не может быть улучшена, то есть алгоритм может потребовать для своего выполнения \Om (m \cdot \al (m,n)) времени.

Сводные данные о сложности операций с разделенными множествами

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

СОЗДАТЬ (x) O(1)
ОБЪЕДИНИТЬ (x, y) O(n)
НАЙТИ (x, y) O(1)
m операций O(mn)

Реализация с помощью древовидной cтруктуры

СОЗДАТЬ (x) O(1)
ОБЪЕДИНИТЬ (x,y) O(1)
НАЙТИ (x, y) O(n)
m операций O(mn)

Реализация с использованием рангов вершин

СОЗДАТЬ (x) O(1)
ОБЪЕДИНИТЬ (x,y) O(1)
НАЙТИ (x, y) O(\log n)
m операций O(m \log n)

Реализация с использованием рангов и сжатия путей

СОЗДАТЬ (x) O(1)
ОБЪЕДИНИТЬ (x,y) O(1)
НАЙТИ (x, y) O(\log n)
m операций O(n \log^\ast (u + 1))
O(m \al (m,n))
< Лекция 2 || Лекция 3: 123456 || Лекция 4 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...