Некоторые задачи, сводящиеся к сортировке.
К задачам сортировки могут быть за линейное время сведены следующие классические задачи
Задача 1. Найти все различные элементы множества {A1,…,AN }, где – Ai , например, целые или вещественные числа.
Задача 2. Определить, все ли элементы в множестве A={A1,…,AN } различаются, где – Ai , например, целые или вещественные числа.
Задача 3. Определить, совпадают ли два множества {A1,…,AN } и {B1,…,BN }, где Ai , Bi , например, – целые или вещественные числа.
Т.о., мы получаем, что для всех трех приведенных задач верхняя оценка времени решения равна Q (N log N).
Можно задаться вопросом: а можно ли решить эти задачи быстрее? Заметим, что Задача 2 может быть за линейное время сведена к Задаче 1, поэтому если мы докажем, что нижняя оценка времени решения Задачи 2 есть Q(N log N), то тем мы докажем неулучшаемость полученной оценки для Задачи 1.
Задача 2 относится к классу задач о принятии решения. Это значит, что на выходе таких задач выдается всего один бит информации, т.е. ответ `да’ или `нет’. Мы будем рассматривать алгоритмы решения задач о принятии решений, которые сводятся к бинарному дереву принятия решений. Под деревом принятия решений имеется в виду следующее. Пусть на входе нашего алгоритма находится вектор входных данных aÎIR N. Рассмотрим бинарное дерево, в каждой вершине которого вычисляется некоторая функция от вектора a и в зависимости от знака этой функции происходит переход на правую или левую ветвь дерева. Каждая конечная вершина дерева будет называться либо принимающей либо отвергающей, в зависимости от приписанного ей соответствующего атрибута. Достижение принимающей вершины означает выдачу алгоритмом ответа `да’, а отвергающей, соответственно, - `нет’.
Дерево принятия решений называется алгебраическим деревом принятия решений степени n, если функции в вершинах дерева являются многочленами степени не выше n.
Далее мы рассмотрим лишь алгоритмы, представимые в виде алгебраического дерева принятия решений степени 1. Мы будем предполагать, что время вычисления каждой функции в вершине дерева есть Q(1). Приведенная далее теорема верна и для деревьев высшей степени, но для ее доказательства потребуются весьма серьезные факты из теории функций, которые мы здесь привести не сможем.
Введем два определения.
Разделимые множества. Множества A, B Ì IR N называются разделимыми (линейно-разделимыми) если " aÎ A, bÎ B найдется cÎ [a,b], такое что сÏ A, сÏ B.
Связное множество. Связным множеством называется такое множество, что при любом его разбиении на два непересекающихся непустых подмножества одно из них содержит точку, предельную для другого. В евклидовом пространстве открытое множество связно тогда и только тогда, когда любые две его точки можно соединить целиком лежащей в нём ломаной.
Теорема. Пусть W Ì IR N – множество точек, на которых решением задачи будет `да’. Пусть #W – количество разделимых связных компонент множества W. Тогда, в рамках алгоритмов, описывающихся алгебраическими деревьями степени 1, время решения задачи есть W(log 2 #W).
Доказательство. Докажем, что количество принимающих вершин дерева принятия решений не меньше #W. Для этого докажем, что все элементы R N, относящиеся к одной принимающей вершине дерева решений находятся внутри одной разделимой связной компоненты W.
Предположим противное: существует принимающая вершина дерева принятия решений, в которую попадает алгоритм при использовании двух различных a,bÎ W , таких что a и b принадлежат различным разделимым связным компонентам Va , Vb Ì W, соответственно. Рассмотрим [a,b]. Линейные функции от N переменных обладают свойством монотонности на отрезке, поэтому все функции, вычисляющиеся в вершинах дерева принятия решений, сохраняют свой знак на [a,b]. Т.о. весь отрезок [a,b] Ì W (т.к. все точки из отрезка обязаны попасть в одно и ту же принимающую вершину). Это противоречит предположению о принадлежности a и b различным разделимым компонентам.
Итак, мы получили, что количество концевых вершин бинарного дерева принятия решений не меньше #W, из чего сразу следует, что высота дерева не меньше [log 2 #W].
¢
Вернемся к решению Задачи 2. Рассмотрим в качестве различных вариантов входных данных задачи все перестановки последовательности {1,2,…,N}. Т.е.
Ap= {p(1), p(2),…, p(N)}, где p – некоторая перестановка.
Докажем, что каждая последовательность Ap принадлежит своей связной разделимой компоненте множества W, на котором решением Задачи 2 будет `да’. Действительно, допустим противное, т.е. пусть две различные последовательности Ap1 и Ap2 принадлежат одной компоненте W. Тогда найдутся 1 £ i, j £ N, такие что (p1(i)- p1(j)) (p2(i)- p2(j))<0, т.е. (p1(i)- p1(j)) и (p2(i)- p2(j)) имеют разные знаки. Но тогда для любой ломаной S, соединяющей точки Ap1 и Ap2 Î IR N , найдется x Î S такая, что xi = xj , что противоречит принадлежности Ap1 и Ap2 одной связной компоненте множества W.
В приведенном доказательстве требует объяснения следующий факт: для двух различных перестановок множества {1,2,…,N} всегда найдутся 1 £ i, j £ N, такие что (p1(i)- p1(j)) и (p2(i)- p2(j)) имеют разные знаки. Пусть для каждой перестановки p: tk – количество чисел p(i) больших p(k) для i>k. Легко увидеть, что p и t однозначно задают друг друга (действительно, для p(i)=N имеем t(i)=0, поэтому если мы найдем такое i, что t(i)=0, то сразу получим, что p(i)=N; далее мы ищем такое i, что t(i)=1, и получаем, что p(i)=N-1, и т.д.). Т.о. для двух различных перестановок p1 и p2 мы получим различные соответствующие t1 и t2 . Выберем i: t1(i) ¹ t2(i). Пусть, например, t1(i) > t2(i), но тогда найдется j>i, такое что p1(j)> p1(i), но p2(j)< p2(i). Получили требуемое.
. Отметим, что данную теорему можно формулировать несколько по-разному. Я привел формулировку, которая мне больше нравится, но возможны варианты.
Можно глянуть Лекцию 2 в моих лекциях (там есть ссылки на литературу): http://lectures.stargeo.ru/alg/algorithms.htm . Отмечу, что подход в этих лекциях несущественно отличается от подхода, принятого в лекциях, читаемых на мех-мате. Очень полезно понять, что это отличие несущественное.
Можно глянуть Лекции 2-3 в моих лекциях (там есть ссылки на литературу): http://lectures.stargeo.ru/alg/algorithms.htm . Повторю, что не гарантирую, что эти понятия есть во всех лекциях, читаемых на мех-мате. Если есть, то надо понять, как они соотносятся с тем, что написано у меня. Если нет – расслабляемся…
Ну, тут уж сами как-нибудь…
Можно глянуть пару моих лекций (ссылки там есть): http://lectures.stargeo.ru/add_qst/semaph.htm . Там много всего дополнительного, что необходимо понимать, отвечая на этот вопрос, но и ответ строго на данный вопрос есть. В сущности, самым главным словом, которое надо сказать при определении семафоров, это – атомарность. Операции семафора должны быть неразрывными, т.е. их надо непрерывно выполнять в текущем процессе (потоке), не пересекая с аналогичными операциями из других процессов (потоков). Следует понимать, что будет при нарушении этого принципа.
