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

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

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

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

предшествующее выбранному значению, так и следую­ щее за ним.

Обычно задача разделения исходного массива на два взаимно упорядоченных подмассива ставится следующим образом:

1. Для данного массива определяется (по некоторым дополнительным соображениям, о которых будет сказано

ниже)

разделяющее значение

признака яп.

 

2. Проводится разделение исходного массива на два

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

процессе которого определяется

граница

двух взаимно

упорядоченных подмассивов (т. е. опреде­

ляется значение граничного индекса k).

 

Решить данную задачу в обратном порядке, т. е. сна­

чала

задаться

значением k, а потом разделить массив

с достаточной

эффективностью

не удается, так

как весь­

ма сложно определить разделяющее значение признака яп[&] до упорядочения всего массива.

§ 5.2. Оператор разделения массива

Итак, предположим, что дан исходный массив Л [1 : п] и некоторое значение признака (яо) и необходимо про­ вести разделение этого массива на взаимно упорядочен­ ные подмассивы. Для определенности будем рассматри­ вать упорядочение в порядке возрастания. Желательно выполнить эту операцию с минимальной трудоемкостью. Оба результирующих подмассива необходимо сформиро­ вать на позициях исходного массива. В процессе разде­

ления все элементы массива

распадаются на три

груп­

пы — группу

элементов

со значением

признака,

не

пре­

вышающим

я 0 (назовем

ее

группой

младших

элемен­

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

включительно, вторая группа элементов — на

конечных

позициях массива с индексами от / до n, а третья

группа

элементов — на средних позициях с

индексами

от k+l

до / — 1. Расположение группы непроверенных

элементов

в средней части массива существенно, так как

исклю­

чает непроизводительные пересылки

(рис. 5.2).

 

§ 5.2. ОПЕРАТОР РАЗДЕЛЕНИЯ МАССИВА

191

Теперь, наверное, уже ясна идея алгоритма. Она со­ стоит в том, что путем последовательного сравнения признаков еще непроверенных элементов с п0 осуществ­ ляется расширение зон расположения элементов первой и второй групп (т. е. увеличение k или уменьшение /) до тех пор, пока не встретятся элементы с такими значе­ ниями признака, которые не допускают их включение в

Группа непроверенных злеменпюб

к

I

л

Группа младших элементов

Группа старших if элементод

Рис. 5.2. Распределение элементов по позициям в процессе выпол­ нения оператора разделения.

соответствующие группы элементов. В этом случае про­ изводится обмен элементов между позициями с индекса­ ми k-j-l и / — 1 , после чего эти элементы включаются в соответствующие группы и процедура продолжается до исчезновения непроверенных элементов. Блок-схема опе­ ратора приведена на рис. 5.3. Работает он следующим образом. Блок / присваивает индексам k и / начальные, значения, соответствующие отсутствию элементов первой и второй групп. Весь массив состоит в этом случае цели­ ком из непроверенных элементов. Блок 2 осуществляет проверку очередного элемента со стороны группы млад­

ших элементов. Если этот элемент

может

быть включен

в группу младших элементов, то

блок 3

осуществляет

эту операцию и блок 4 определяет наличие еще непрове­ ренных элементов. Если таковые остались, то программа

переходит снова к проверке очередного

элемента (к бло­

ку 2). Если же этот элемент не может

быть включен в

группу младших элементов, то программа переходит к аналогичной операции со стороны старших элементов (блок 5 осуществляет проверку очередного старшего эле­ мента, блок 6 производит включение элемента в группу старших, а блок 7 определяет наличие еще непроверен­ ных элементов).

192

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

Если же оба очередных элемента (и со стороны груп­ пы младших элементов, и со стороны группы старших элементов) не допускают включения их в соответству­ ющие группы, то программа переходит к блоку 8, осуще­ ствляющему обмен элементов а[&+1] и а[11] с по­ мощью рабочей ячейки R и включение их в соответству­ ющие группы (с помощью блока 3). Блок 4 контролирует наличие еще непроверенных элементов после описанной

R:-a[k*l];

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

а[/-/]•

Конец

Рис. 5.3. Блок-схема оператора разделения массива.

операции. Если таковые еще остались, то программа снова переходит к блоку 2 и начинает анализировать очередной непроверенный элемент. Программа закан­ чивает работу, как только один из блоков (4 или 7) обнаружит, что непроверенных элементов больше не осталось.

Выходной параметр оператора — граница

разделения

группы младших элементов и группы

старших — опреде­

ляется значениями индексов

k или / после

завершения

оператора

(возможно такое

задание

признака яо, что

одна из групп

останется пустой, т. е. после

выполнения

оператора

либо

& = 0 и / = 1 , либо k~n

и 1 =

п+\).

§ 5.3. ХАРАКТЕРИСТИКИ ОПЕРАТОРА

193

§ 5.3. Основные характеристики оператора

5.3.1. Результативность оператора. Результативность оператора равна изменению степени неупорядоченности в результате работы оператора. Исходная степень неупоря­ доченности случайного массива, содержащего п элемен­ тов, определяется как

h = n{n—1)/4

(5.1)

(см. гл. 2).

Если в результате выполнения оператора разделения размер подмассива младших элементов окажется рав­ ным k, то степень неупорядоченности двух взаимно упо­ рядоченных подмассивов составит

 

 

/

fe(fe

— !)

i

(n — k)(n — k—\) _

 

 

(5.2)

 

 

2

~"

4

 

4

 

 

 

 

 

 

 

 

Отсюда

результативность

оператора

 

 

 

Л/(^) =

/ 1 - / 2

=

 

 

 

 

 

 

_

п(п—\)

 

k{k—\)

{n — k){n — k—\)_k{n

k)

(5.3)

 

 

 

 

 

 

 

 

 

Из

(5.3)

видно, что Д/(&)

 

зависит от fe, т. е. результатив­

ность является случайной

величиной в той

же

степени,

в какой случайным является размер подмассива k. Ре­ зультативность оказывается максимальной в случае, ког­

да массив разделяется на два равных

по размеру под­

массива, т. е. при k = n/2 (рис. 5.4). В

этом случае

Д / м а к с = " 2 / 8 .

(5.4)

Математическое ожидание размера подмассива k, ес­ тественно, зависит от выбора разделяющего значения признака л0 . Целесообразно для я 0 выбирать такое зна­ чение, при котором

M[k]=n/2,

(5.5)

т. е. значение, совпадающее с априорной величиной ма­ тематического ожидания значения признака.

7 А. А. Папернов, В. Я. Подымив

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

Математическое ожидание

результативности

можно

определить по формуле

 

 

М(М) = ^М(к)р(к)=

V i i l z ± > p ( £ ) ,

(5.6)

где p(k) — априорная вероятность того, что размер под­ массива младших элементов окажется равным k.

Рис. 5.4. Зависимость результативности оператора разделения от размера k группы младших (или группы старших) элементов, полу­ ченной в результате разделения.

Представим М ( Ы ) в другом виде, непосредственно отражающем зависимость M (AI) от дисперсии величи­ ны k. Выразим k в виде

k = M(k)

+ l k =

+ Ak.

(5.7)

Подставив (5.7) в (5.6), получим

§ 5.3. ХАРАКТЕРИСТИКИ ОПЕРАТОРА

195

Принимая во внимание, что

л/2

 

)

1,

 

у

 

(5.9а)

Д k = —л/2

 

 

 

 

 

 

 

(5.96)

Д ft= — л/2

 

 

 

 

где D(k) —дисперсия

величины k, получим

 

M(H)

=

^—\-D(k).

(5.10)

 

о

<L

 

 

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

5.3.2. Сложность оператора. Всего в операторе про­

водится п циклов сравнения, требующих:

вычисления

адреса элемента

(7"а ), выделения

признака

( Т К ) , срав­

нения

признака

с ло 5ж), изменения

одного

индекса

(Т„),

сравнения

индекса

с конечным значением

и пере­

хода

(примем это время

также

равным

ТИ).

 

 

Математическое

ожидание количества

выполняемых

обменов

определим

из следующих

соображений: пусть

после

завершения

процедуры

 

размер

подмассива

младших

элементов

оказался равным

k.

Частота

по­

явления младших элементов в исходном

массиве

рав­

на k/n.

 

 

 

 

 

 

 

 

 

 

Будем считать, что в исходном массиве

младшие и

старшие

элементы

равномерно

распределены

пс

всем

его позициям. Тогда до выполнения процедуры на пер­

вых k позициях в среднем было

k2/n

элементов,

оставшихся и впоследствии в группе младших

элементов,

и k(n—k)/n элементов, впоследствии

'перешедших в

группу старших элементов. Следовательно, в

процессе

выполнения

процедуры

необходимо в среднем

провести

k(n—k)/n

обменов,

требующих по три пересылки

каждый.

 

 

j

7*

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

Общая сложность оператора равна

 

 

 

Т(к) = п(Та

+

Тъ + Тт +

а) 4-

k { n ~ k ) ЗТП =

 

 

 

 

 

= п Т е

р + ¥ 1 ^ Т п ,

(5.11)

 

 

 

 

ѵ

 

п.

 

 

где Г с р

—общие

затраты

времени

на

один

цикл

срав­

нения,

ТП—общие

затраты времени на

одну

пересылку.

Для

оценки

математического

ожидания

сложности

представим

k в

виде k =

-^- -4- A k

(как

и

при

выводе

оценки математического ожидания результативности оператора).

Имеем

я/2

М(Т)=

2

T(k)p(-f+bk\

=

 

Д * =

я/2

 

= п ( Т с р + - І Т П ) - Т П 3 - ^ . (5.12)

Влияние дисперсии случайной величины k на среднюю сложность оператора определяется соотношением вре­ мени выполнения операции пересылки и времени выпол­ нения операции сравнения. В случае, когда 7'с р > Тп,

сложность оператора будет практически постоянна, в то время как при Т п ^> Тср характер изменения слож­ ности от D(k) будет аналогичен характеру зависимости

результативности от

D(k). Практически времена Тср и

Тп

соизмеримы

друг

с другом, и поэтому при уменьше­

нии

дисперсии

D(k)

сложность возрастает

медленнее,

чем результативность, т. е. эффективность

оператора

увеличивается.

 

 

 

§ 5.4. РАЗДЕЛЕНИЕ ПО ПЕРВОМУ ЭЛЕМЕНТУ МАССИВА

197

§ 5.4. Разделение по первому элементу массива

Рассмотрим один из широко распространенных ва­ риантов оператора разделения массива, в котором в ка­ честве разделяющего признака л 0 обязательно исполь­ зуется значение признака одного из элементов исходного массива. Предположим, что данный элемент, в дальней­ шем называемый «опорным», расположен на позиции с

Рис. 5.5. Блок-схема оператора разделения по первому элементу массива.

индексом 1 в исходном массиве (это ограничение несу­ щественно, так как за три пересылки можно всегда до работы алгоритма осуществить обмен элемента, при­ знак которого принят за разделяющий, с первым элемен­ том массива). Блок-схема оператора разделения мас­ сива для данного случая изображена на рис. 5.5. Блок / производит подготовительные операции. При их выпол­ нении «опорный» элемент а [1], значение признака ко­ торого принято за разделяющее, пересылается в рабо­ чую ячейку R, а индексам k и / присваиваются их на-

198

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

чальные

значения. Далее оператор в циклическом ре­

жиме начинает последовательный просмотр элементов массива, начиная с последней позиции, до определения первого элемента, не входящего в группу старших эле­ ментов массива, или до момента исчерпания группы не­ проверенных элементов массива (блок 2 осуществляет сравнение признаков, блок 3 изменяет значение индекса /, отделяющего группу старших элементов массива от группы еще непроверенных элементов, и блок 4 анализи­ рует наличие еще непроверенных элементов). При об­ наружении элемента, принадлежащего группе младших элементов массива, производится пересылка этого эле­

мента на свободную начальную позицию массива

(блок

5). Далее оператор также

в циклическом режиме про­

изводит последовательный

просмотр элементов

масси­

ва со стороны начальных позиций до обнаружения пер­ вого элемента, не входящего в группу младших элемен­ тов массива, или до момента исчезновения группы непроверенных элементов массива (блок 6 изменяет зна­ чение индекса k, отделяющего группу младших элемен­ тов массива, блок 7 анализирует наличие еще непроверенных элементов и блок 8 осуществляет срав­ нение признаков). При обнаружении элемента, принад­ лежащего группе старших элементов, производится его

пересылка

на

свободную

позицию,

примыкающую к

группе позиций

старших

элементов

(блок 9),

и опера­

тор вновь

возвращается

к последовательному

анализу

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

мент,

по признаку которого производилось деление

(блок

10).

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

s Оценим основные характеристики данного оператора.

§ 5.4. РАЗДЕЛЕНИЕ ПО ПЕРВОМУ ЭЛЕМЕНТУ МАССИВА

199

5.4.1. Результативность оператора. Результативность данного оператора определим аналогично тому, как это было осуществлено в п. 5.3.1.

Если после выполнения оператора «опорный» элемент получил номер k, т. е. из исходного массива, кроме вза­ имно упорядоченного с остальным массивом опорного

Ось

признакоі

 

 

 

Ось

 

к-1

\к+1

позиции

 

 

Гоуппа

 

 

Группа

младших

элементов

старших элементоо

 

 

Опорный

элемент

Рис. 5.6. Структура подмассивов, полученных при разделении по опорному элементу.

элемента, выделились два взаимно упорядоченных под­ массива с размером в (k—1) и (п—k) элементов, то сте­ пень неупорядоченности после выполнения оператора оказалась равной

Іг (£) = ( * - ! ) ( * - 2 ) + (n-k)

(n~k-\)

 

(5.13)

 

 

 

 

 

 

а следовательно,

результативность

оператора

равна

Д / (£) = " ( я ' ~ 1 }

_

— ')(* —2) _

(n — k)(n

— k —

\)

 

 

(n +

l)k-

ki—l

.

(5.14)

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