
книги из ГПНТБ / Папернов А.А. Методы упорядочения информации в цифровых системах
.pdf200 |
ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА |
||
Номер |
k представляет |
собой случайную |
величину, |
изменяющуюся от 1 до п, |
со средним значением |
||
|
M{k) |
= п + 1 |
(5.15) |
Нетрудно убедиться, что при k, равном своему матема тическому ожиданию, AI(k) принимает свое максималь ное значение. Математическое ожидание результативно сти может быть определено с помощью выкладок, ана логичных выполненным в 5.3:
|
А*(А/)= |
2 |
С + Ч * - » - - ' |
p{k). |
|||
Заменив k на |
|
|
|
|
|
|
|
|
k = M(k) |
+ |
= |
_n_-h_l |
+ à |
k > |
|
получим |
n — 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
(n + 3) (n - |
1) |
|
|
||
7W(A/)=- |
2 |
|
|
||||
|
|
|
|
|
|
||
|
n— 1 |
|
|
|
|
|
|
Учитывая, что |
|
|
|
|
|
|
|
|
|
n — i |
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
2 |
|
Р ( Д * ) ~ І , |
|
||
|
Д ft |
= — |
« - 1 |
|
|
|
|
|
|
|
|
|
|
||
|
n — 1 |
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
V |
|
{\k)*p(àk) |
|
= D{k), |
||
|
д * = — n— 1 |
|
|
|
|
|
|
получим |
|
|
|
|
|
2n — 3 |
|
M (A /) = |
(rt + 3)(n — 1 ) |
D(k) |
_ |
n* |
(5.16)
(5.17)
(5.18)
(5.19a)
(5.196)
D(fe)
(5.20)
§ 5.4. РАЗДЕЛЕНИЕ ПО ПЕРВОМУ ЭЛЕМЕНТУ МЛССИВА
При больших значениях п наличие второго слагаемого /2га — 3\
(—-—J несущественно.
Однако для массивов небольшого объема роль второ го слагаемого возрастает.
1©
/г.'=А+/ т®
а[і-!]:=а[ы\
Конец
Рис. 5.7. Блок-схема оператора разделения по заданному значению признака с использованием циклического обмена.
5.4.2. Сложность оператора. Всего в рассматриваемом операторе выполняется п—1 сравнение. Каждое срав
нение требует таких же затрат времени, как |
и для ра |
||
нее |
рассмотренного |
оператора (Га -+-Г* + Ts% + |
2ГИ ). Чис |
ло |
пересылок при |
выполнении оператора |
подсчитаем |
следующим образом. Объем группы младших элементов по завершении процедуры равен k—1. Частота элемен тов из группы младших элементов в исходном случай-
202 ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА
ft—1 |
„ |
ном массиве равна |
Будем считать, что элементы |
п — 1 |
|
этой группы были равномерно распределены по всему
массиву. При этом до выполнения |
процедуры |
на первых |
|
k—1 позициях было (k—1) |
• |
элементов, |
перешед- |
|
п — 1 |
|
|
ших впоследствии в группу старших элементов. Освобо дившиеся после них позиции были заполнены элемента ми, располагавшимися ранее на последних позициях, но по результатам сравнения отнесенными к группе млад ших элементов. Для выполнения этой работы потребова-
0 „ (k—l)(n — k) |
„ |
лось всего 21 п |
времени. (Уп — время пере |
сылки одного элемента.) Общая сложность оператора будет составлять
Т (k) = (п - 1) (Т* + Т% |
+ Ts% + 2ТИ) + |
|
+ |
( f l - l ) ( n - f t ) . 2ТП + 2ТП, |
(5.21) |
|
n — 1 |
|
где последнее слагаемое учитывает пересылки «опорно
го» |
элемента. |
|
|
|
|
|
|
|
Заменяя k через Ak аналогично тому, как это сделано |
||||||
при оценке |
результативности оператора, получим |
||||||
|
|
п— 1 |
|
|
|
|
|
М(Т)= |
2 |
|
Т(\к)р(Мг) |
= |
|
|
|
|
Д ft = |
n- |
1 |
|
|
|
|
|
— |
2 |
|
|
|
|
|
|
|
|
|
n — 1 |
|
||
|
|
|
|
|
|
||
|
= ( / z - l ) T c p |
+ 2Tn + - ^ - |
|
П — Г'\2 |
|||
|
|
|
|||||
|
|
|
|
|
ль |
Л - 1 |
|
|
|
|
|
|
Д А: = |
2 |
|
|
|
|
|
|
|
|
|
_ |
(Д /г)»] p(lk) |
= |
(n-l)Tcp+ |
^±^ТП |
- |
Та, (5.22) |
|
где |
Г с р —общие |
затраты времени на сравнение призна |
|||||
ка одного элемента с разделяющим |
значением. |
||||||
|
В последнем |
операторе |
каждый |
обмен |
осуществляет |
ся фактически за две пересылки, а не за три, как в предыдущем операторе, из-за использования не парного,
§ 5.5. ОРГАНИЗАЦИЯ |
ПРОЦЕДУРЫ УПОРЯДОЧЕНИЯ |
203 |
а циклического обмена |
(см. 2.4.2). Обмен такого |
типа |
с соответствующим уменьшением затрат можно осуще ствить и в операторе разделения по заданному значению признака (рис. 5.7).
Блоки 11, 12 и 13 этого оператора служат для про верки признака того элемента, который сохранялся в рабочей ячейке, и для соответствующего изменения гра ниц группы младших или группы старших элементов.
§ 5.5. Организация процедуры упорядочения
Общая процедура упорядочения массива, основанная на использовании оператора разделения исходного мас сива на взаимно упорядоченные подмассивы, должна обеспечивать последовательное увеличение числа взаим но упорядоченных подмассивов при одновременном уменьшении объема каждого из них. В конечном итоге должно быть сформировано множество взаимно упоря доченных подмассивов, содержащих всего по одному элементу. Только в этом случае будет получен общий, полностью упорядоченный массив.
Рассмотрим существенные особенности такой про цедуры. Пусть дан исходный неупорядоченный массив объемом в п элементов. На первом этапе он будет раз
бит на два подмассива по |
заданному |
значению я 0 |
опе |
||
ратором, описанным в § 5.2, |
и на три |
подмассива |
(один |
||
из которых содержит |
лишь |
единственный |
«опорный» |
||
элемент) оператором, |
описанным в § |
5.4. В |
любом |
слу |
чае каждое разбиение порождает не более двух подмас сивов, требующих в свою очередь дальнейшего деления.
Поскольку результат деления (число элементов в |
пер |
вом и во втором из подмассивов) случаен, процесс |
упо |
рядочения можно наглядно представить в виде некото
рого |
случайного двоичного |
дерева. |
Действительно, |
пусть |
любая вершина этого |
дерева |
отображает факт |
применения оператора разделения. Тогда ребру, входя щему в вершину, можно приписать число, соответству ющее объему массива до использования оператора, а левому и правому ребру, выходящим из вершины, мож но приписать числа, соответствующие количеству эле ментов в группе младших и в группе старших элементов соответственно. Назовем эти числа весами ребер. Веса
204 ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА
ребер всегда неотрицательны. Для первого оператора сумма весов выходящих ребер равна весу входящего ребра, а для второго оператора она на единицу мень ше. Для примера на рис. 5.8 показаны деревья некото рых процессов упорядочения исходного массива из 14 элементов первым (5.8, а) и вторым (5.8, б) оператора ми. Все конечные ребра дерева должны иметь вес, рав ный единице или нулю.
Выполнение процедуры упорядочения связано с не которым последовательным обходом вершин данного
Рис. 5.8. Примеры деревьев упорядочения массива из 14 элементов.
случайного дерева. Для выполнения оператора, отобра жаемого некоторой вершиной дерева, кроме веса вхо дящего ребра, необходимо задать также и расположение
соответствующего |
этому ребру |
подмассива. |
Положение |
и объем каждого |
подмассива |
полностью |
определится |
заданием индексов его начальной и конечной позиции. Обход такого дерева должен проводиться в направле нии ориентации его ребер, так как приступать к разде лению какого-либо подмассива можно лишь в том слу чае, если он создан, т. е. проведено разделение более крупного подмассива в предыдущей вершине дерева. По этому общая процедура должна начинаться с начальной вершины или с разделения всего исходного массива на два подмассива. Затем может выполняться переход по любой из двух возможных ветвей — разделение подмас сива младших или подмассива старших элементов. Ре-
§ 5.5. ОРГАНИЗАЦИЯ ПРОЦЕДУРЫ УПОРЯДОЧЕНИЯ |
205 |
шение о том, какой из этих двух подмассивов |
должен |
разделяться в первую очередь, принимается исходя из соображений экономии объема запоминающего устрой ства. Дело в том, что в ЦВМ в каждый момент может выполняться только одно разделение. Вся же необхо димая информация для выполнения другого разделения должна фиксироваться в запоминающем устройстве. После проведения любого разделения (кроме конечных случаев, когда в результате получаются подмассивы, со
стоящие не более чем из одного |
элемента) |
возникают |
два новых подмассива, один из |
которых |
может быть |
взят для дальнейшего деления, а |
информация о втором |
должна быть зафиксирована. Общее число зафиксиро ванных для дальнейшего разделения подмассивов до стигает наибольшей величины, когда процесс деления доходит до конечных вершин дерева. Для уменьшения числа фиксируемых подмассивов принимается следую щее правило: из всех существующих к настоящему мо менту подмассивов дальнейшему разделению подлежит наименьший. В этом случае число фиксируемых подмас сивов не может превышать log2n—1 (фиксируются под массивы, содержащие не менее двух элементов). Дока жем это утверждение по индукции. Действительно, для п = 2 утверждение проверяется непосредственно. Пред положим, что оно справедливо для некоторого п, и по кажем, что в этом случае оно будет справедливо и для 2п. Действительно, при разделении массива из 2п эле ментов потребуется запомнить один больший подмассив, а для меньшего, размер которого не превышает п эле
ментов, будет справедливо |
индуктивное |
предположение, |
|||
т. е. всего необходимо запомнить |
не более l+log2« — 1 = |
||||
= log2 2n—1 |
подмассивов, |
что и |
доказывает |
наше ут |
|
верждение. |
Предельное значение |
числа |
фиксируемых |
||
подмассивов |
достигается |
в случае строгого |
деления |
всех подмассивов пополам, представляющего самую не благоприятную ситуацию.
Осуществить описанное правило обработки подмасси вов проще всего с использованием так называемого ма газинного списка индексов начальной и конечной пози ций каждого подмассива. В магазин помещают инфор мацию о большем из образовавшихся подмассивов, а так как каждый новый подмассив меньше полученного
206 |
ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА |
на предыдущем этапе, то забираться из магазина будет всегда информация о минимальном из имеющихся под-
У = 1
к=1
1:-п
Разделение (к,1,т) I©
k:=b[f-/. !}
Рис. 5.9. Блок-схема процедуры упорядочения с использованием оператора разделения по первому элементу.
массивов. Для примера на рис. 5.9 приведена |
блок-схе |
ма алгоритма упорядочения массива а [1:п], |
исполь |
зующая оператор разделения второго типа. Исходными
§ 5.5. ОРГАНИЗАЦИЯ ПРОЦЕДУРЫ УПОРЯДОЧЕНИЯ |
207 |
данными для этого оператора являются индексы началь ной позиции (k) и конечной позиции (I) подмассива, подлежащего разделению. Результатом деления являет
ся |
индекс позиции элемента, признак которого |
принят |
за |
разделяющий (т). В массиве b[l :log 2 n — 1, |
1 :2] со |
храняются данные о подмассивах, подлежащих разделе
нию в |
дальнейшем, причем элемент b[j, 1] |
определяет |
||
индекс |
начальной |
позиции подмассива, |
а элемент Ь[/, 2]— |
|
индекс |
конечной |
позиции подмассива. |
Индекс |
/ — поряд |
ковый номер подмассива, подлежащего разделению. На копление элементов в массиве организовано по принципу магазина.
Блок |
/ (рис. |
5.9) — блок подготовки. Он |
задает на |
|
чальное |
значение |
индексу / ( / : = 1 ) |
и начальное значе |
|
ние индексам k (k : = 1) и / (/ : = я ) , |
определяя |
начальное |
разделение на две части всего исходного массива. За
помним, что значению индекса / = 1 |
соответствует отсут |
ствие элементов в массиве Ь. Блок |
2 — блок разделения |
массива. Блок 3 анализирует размеры полученных час тей массива. Если группа младших элементов больше группы старших, то следующим выполняется блок 4, в
противном случае — блок 5. |
Блок 4 |
(5) анализирует |
||
размер |
большей |
из полученных групп элементов, и если |
||
размер |
большей |
из групп не превосходит |
одного элемен |
|
та, то |
осуществляется переход |
к выполнению блока 12. |
Если же размер большей группы превосходит один эле мент, то в дальнейшем выполняется блок 6 (7). Этот блок анализирует размер меньшей из групп элементов. Если размер меньшей из групп больше одного элемента, то осуществляется переход к выполнению блока 8 (9). Этот блок отсылает граничные значения индексов по зиций большей из групп элементов k и m—1 ( m + 1 и /) в массив Ь и изменяет текущее значение /. В следующем блоке 10 (11) определяется массив, подлежащий даль нейшему разделению. Блок 10 определяет дальнейшее разделение группы старших элементов, а блок / / — младших. Если же меньшая из групп элементов не тре
бует |
дальнейшего разделения |
(число |
элементов |
в ней |
|
не |
более 1), то сразу после блока 6 |
(7) |
выполняется |
||
разделение оставшейся группы |
(блок |
11 |
(10)). |
Если |
ни одна из групп элементов, полученных в результате деления, не требует дальнейшего использования операто-
208 |
ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА |
|
||||||
ра (т. е. число |
элементов |
ни в одной из них |
не |
более |
||||
1), то выполняется блок 12, где анализируется |
состояние |
|||||||
массива |
Ь. Если массив b не пуст, то в качестве |
гра |
||||||
ничных |
индексов k и |
/ |
для |
дальнейшего |
разделения |
|||
используются |
последние, |
записанные в |
b |
значения |
||||
b[j—1,1] |
и 6 [/—1,2], |
после |
чего изменяется |
текущее |
значение индекса / и осуществляется переход к блоку 2. Если же массив b пуст, то процедура закончена.
Подобным же образом организуется процедура и в случае применения оператора разделения первого типа.
§ 5.6. Выбор из массива элемента для разделения
Процедуры, рассматриваемые в этой главе, использу ют в качестве разделяющего значения признака признак одного из имеющихся в массиве элементов.
В связи с этим возникает задача выбора из массива элемента для разделения. Ранее было показано, что с целью увеличения результативности оператора жела тельно для разделения выбирать такой элемент, кото рый близок к среднему по положению элементу в упо рядоченном массиве. Чем ближе положение разделяю
щего элемента |
к |
середине |
этого |
массива, |
тем лучше, |
||
однако сложность |
определения разделяющего |
элемента |
|||||
в достаточной близости от середины массива |
велика. |
||||||
Рассмотрим |
некоторые |
характерные случаи. |
|||||
5.6.1. Определение разделяющего элемента без выбо |
|||||||
ра. Это простейший |
способ определения |
разделяющего |
|||||
элемента, известный |
как |
«метод |
Хиббарда» |
[63, 64] |
|||
(его процедура описана в § 5.5). |
|
|
|
||||
В зависимости |
от |
условий формирования |
исходного |
массива может использоваться несколько способов опре деления разделяющего элемента. Если исходная неупо рядоченность массива достаточно велика, то в качестве разделяющего может использоваться элемент на некото рой фиксированной позиции массива, подлежащего раз делению (элемент из первой, средней или последней по зиции). Если же исходное состояние массива таково, что элемент с фиксированной позиции использовать нежела тельно, то можно рекомендовать использование в каче стве разделяющего элемента элемент на некоторой слу чайной позиции. Все эти случаи характеризуются тем,
§ 5.6. ВЫБОР ИЗ МАССИВА ЭЛЕМЕНТА ДЛЯ РАЗДЕЛЕНИЯ |
209 |
что для разделения используется элемент со случайным значением признака, так что в упорядоченном массиве этот элемент может занимать любую позицию. Будем считать, что все окончательные позиции этого элемента равновероятны.
Оценим сложность процедуры в целом для этого слу чая. При случайном выборе из массива объемом п эле мента для разделения вероятность того, что окончатель
ная позиция этого элемента |
после разделения |
будет |
иметь определенный индекс |
(k), равна Г/n. Этот |
эле |
мент разделит исходный массив на группу из k—1 мень
ших элементов |
и |
группу |
из п—k больших элементов. |
|
Сложность оператора разделения была найдена выше |
||||
(5.21). Для данного |
случая |
|
||
Т0 (n, k) = (п - |
1) Г с р + 2 |
( * - ' ) ( « - * ) тл + 27п . |
(5.23) |
|
|
|
|
л — 1 |
|
Для сложности процедуры в целом можно записать сле дующее рекуррентное соотношение (при условии, что разделяющий элемент попал на позицию с индексом k) :
Т (n, k) = Т0 |
(n, k) + T(k—l) |
+ |
T(n~k), |
(5.24) |
где T(k—1)—средняя |
сложность |
процедуры |
упорядо |
|
чения массива младших элементов; |
Т(п—k) |
— средняя |
сложность процедуры упорядочения массива старших
элементов. Для |
математического |
ожидания сложности |
|||||||
процедуры в целом |
получаем |
выражение |
|
|
|||||
7 » = |
— |
У |
T(n,k) |
|
|
|
|
|
|
|
|
k= i |
|
|
|
|
|
|
|
|
2 |
|
|
T(k-\)+^T(n-k) + |
-—-пТср |
+ |
|||
|
k= |
i |
|
Ä = 1 |
|
|
|
|
|
+ |
—пТп+—-^— Tn 2 |
(k-l)(n-k)= |
( n - l ) T c p + |
||||||
n |
|
n(n |
— 1) |
k = i |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
+ |
J l ± 4 ) |
г п + |
А |
У Г ( А - І ) , |
(5.25) |
при выводе которого произведено суммирование по k