Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги из ГПНТБ / Папернов А.А. Методы упорядочения информации в цифровых системах

.pdf
Скачиваний:
16
Добавлен:
25.10.2023
Размер:
13 Mб
Скачать

200

ГЛ. 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 несущественно.

Однако для массивов небольшого объема роль второ­ го слагаемого возрастает.

/г.'=А+/ т®

а[і-!]:=а[ы\

Конец

Рис. 5.7. Блок-схема оператора разделения по заданному значению признака с использованием циклического обмена.

5.4.2. Сложность оператора. Всего в рассматриваемом операторе выполняется п1 сравнение. Каждое срав­

нение требует таких же затрат времени, как

и для ра­

нее

рассмотренного

оператора (Га -+-Г* + Ts% +

И ). Чис­

ло

пересылок при

выполнении оператора

подсчитаем

следующим образом. Объем группы младших элементов по завершении процедуры равен k1. Частота элемен­ тов из группы младших элементов в исходном случай-

202 ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА

ft—1

ном массиве равна

Будем считать, что элементы

п — 1

 

этой группы были равномерно распределены по всему

массиву. При этом до выполнения

процедуры

на первых

k1 позициях было (k—1)

элементов,

перешед-

 

п — 1

 

 

ших впоследствии в группу старших элементов. Освобо­ дившиеся после них позиции были заполнены элемента­ ми, располагавшимися ранее на последних позициях, но по результатам сравнения отнесенными к группе млад­ ших элементов. Для выполнения этой работы потребова-

0 „ (k—l)(n — k)

лось всего 21 п

времени. (Уп — время пере­

сылки одного элемента.) Общая сложность оператора будет составлять

Т (k) = (п - 1) (Т* + Т%

+ Ts% + 2ТИ) +

 

+

( f l - l ) ( n - f t ) . П + 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

шение о том, какой из этих двух подмассивов

должен

разделяться в первую очередь, принимается исходя из соображений экономии объема запоминающего устрой­ ства. Дело в том, что в ЦВМ в каждый момент может выполняться только одно разделение. Вся же необхо­ димая информация для выполнения другого разделения должна фиксироваться в запоминающем устройстве. После проведения любого разделения (кроме конечных случаев, когда в результате получаются подмассивы, со­

стоящие не более чем из одного

элемента)

возникают

два новых подмассива, один из

которых

может быть

взят для дальнейшего деления, а

информация о втором

должна быть зафиксирована. Общее число зафиксиро­ ванных для дальнейшего разделения подмассивов до­ стигает наибольшей величины, когда процесс деления доходит до конечных вершин дерева. Для уменьшения числа фиксируемых подмассивов принимается следую­ щее правило: из всех существующих к настоящему мо­ менту подмассивов дальнейшему разделению подлежит наименьший. В этом случае число фиксируемых подмас­ сивов не может превышать log2n1 (фиксируются под­ массивы, содержащие не менее двух элементов). Дока­ жем это утверждение по индукции. Действительно, для п = 2 утверждение проверяется непосредственно. Пред­ положим, что оно справедливо для некоторого п, и по­ кажем, что в этом случае оно будет справедливо и для 2п. Действительно, при разделении массива из 2п эле­ ментов потребуется запомнить один больший подмассив, а для меньшего, размер которого не превышает п эле­

ментов, будет справедливо

индуктивное

предположение,

т. е. всего необходимо запомнить

не более l+log2« 1 =

= log2 2n—1

подмассивов,

что и

доказывает

наше ут­

верждение.

Предельное значение

числа

фиксируемых

подмассивов

достигается

в случае строгого

деления

всех подмассивов пополам, представляющего самую не­ благоприятную ситуацию.

Осуществить описанное правило обработки подмасси­ вов проще всего с использованием так называемого ма­ газинного списка индексов начальной и конечной пози­ ций каждого подмассива. В магазин помещают инфор­ мацию о большем из образовавшихся подмассивов, а так как каждый новый подмассив меньше полученного

206

ГЛ. 5. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА

на предыдущем этапе, то забираться из магазина будет всегда информация о минимальном из имеющихся под-

У = 1

к=1

1:-п

Разделение (к,1,т)

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[j1,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

Соседние файлы в папке книги из ГПНТБ