
книги из ГПНТБ / Папернов А.А. Методы упорядочения информации в цифровых системах
.pdf190 ГЛ. 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] и а[1—1] с по мощью рабочей ячейки 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. УПОРЯДОЧЕНИЕ ДЕЛЕНИЕМ МАССИВА
Общая сложность оператора равна |
|
|
|
|||||
Т(к) = п(Та |
+ |
Тъ + Тт + |
2Та) 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) |