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

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

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

20

ГЛ.

3. МЕТОДЫ слияния

На рис. 3.12 приведена зависимость минимального

резерва

памяти от

объема упорядочиваемого массива.

Рассмотрим особенности процедуры упорядочения G минимальным резервом памяти. Такая процедура может быть организована с использованием единого поля по­ зиций Л[1 :п-\-Ѵ], где располагается также и исходный упорядочиваемый массив. Эта процедура может быть по­ строена многими способами. Рассмотрим один из воз­ можных. Мы будем использовать описанные ранее про­

цедуры упорядочения

и слияния.

Разобьем

исходный

случайный массив на

подмассивы,

размером

не более

2*~"2 объектов, таким

образом, чтобы он распался на

три или четыре подмассива и лишь один из них при этом

мог оказаться

неполным (т. е.

содержать менее

2k~2

объектов), а

прочие содержали

бы по 2 е - 2

объекта.

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

выполнении

этого этапа

упорядочения

следует

разме­

стить упорядоченные подмассивы

так,

как указано на

рис. 3.13, а

и 3.14, а для

массивов,

распадающихся

соот­

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

При упорядочении массива, состоящего из трех час­

тей

(рис. 3.13),

объем

резервной

части

массива

равен

2 е - 8

. Поэтому

возможно провести

обычное слияние ча­

стей

/ и //, располагая

результирующий

массив

( / + / / )

в начальные позиции. В результате получаем размеще­ ние массивов, показанное на рис. 3.13,6. Теперь доста­

точно провести обратное слияние массивов

и ///,

начав заполнение результирующего массива

с позиции

§ 3.5. О Г Р А Н И Ч Е Н И Я Р Е З Е Р В А П А М Я Т И

121

 

3

 

^, '

/

 

О

2

1

: ,

3-2

3-2

Рис. 3.12. Зависимость минимального резерва памяти от объема упо­ рядочиваемого массива п.

Рис. 3.13. Порядок слияния подмассивов на последних этапах про­ цедуры при 2А 1 < п <[3.2*—».

Рис. 3.14. Порядок слияния подмассивов на последних этапах про­ цедуры при 3 - 2 * - » < п < 2*.

ГЛ. 3. МЕТОДЫ слияния

под индексом п, чтобы получить окончательный упоря­ доченный массив, расположенный на первых п позициях

выделенного

поля.

 

 

 

При упорядочении массива, состоящего из четырех

частей (рис. 3.14, а), следует начать

упорядочение

с пря­

мого или обратного слияния частей

/ / /

и IV массива с

размещением

результата (///+/ V )

в

резервной

части,

объем которой в этом случае равен сумме полной и не­ полной частей массива (рис. 3.14,6). Затем необходимо провести обратное слияние частей I я II массива, рас­ полагая результат (7+77) с позиции под индексом п (рис. 3.14,в). При этом первые V позиций поля освобо­ дятся. Теперь достаточно провести обычное слияние по­

лученных частей

( / + / / )

и

(777+71/),

начав

располагать

результирующий

массив

с

позиции

под

индексом 1,

чтобы получить

окончательный упорядоченный массив

на первых п позициях выделенного поля.

3.5.2. Алгоритмы слияния, использующие сокращен­ ные объемы резервной памяти. До сих пор мы рассмат­ ривали варианты процедуры упорядочения с предель­ ной для слияния скоростью упорядочения. Такие вари­ анты требуют значительных объемов резервной памяти. А как же использовать процедуры слияния, когда в рас­ поряжении программиста нет необходимого объема сво­ бодной памяти? Для таких случаев может быть исполь­ зован, например, следующий вариант процедуры упоря­

дочения. Пусть

задано поле

позиций Л [ 1 : д + Ѵ ] ,

но

число позиций

V недостаточно

для проведения всех

эта­

пов процедуры с максимальной эффективностью. В этом

случае разбиваем исходный случайный массив на

части

по V позиций в каждой (одна часть может быть

непол­

ной) и проводим упорядочение каждой из частей, ис­ пользуя V резервных позиций и размещая упорядочен­ ные части, как показано на рис. 3.15, а. Используя обыч­ ное слияние, объединяем первые две части, располагая объединенный массив на первых позициях поля. Резерв­ ная зона переместится в этом случае на следующие за полученным массивом V позиций (рис. 3.15,6). Затем проводим обратное слияние полученного массива со сле­ дующей упорядоченной частью, начиная заполнение но­ вого массива с последней позиции резервной зоны. В результате получаем упорядоченный массив, объединив-

§ 3.5. ОГРАНИЧЕНИЯ РЕЗЕРВА ПАМЯТИ

123

ший три части и расположенный на первых позициях выделенного поля (рис. 3.15, в). Резервная зона опять переместится на следующие за полученным массивом V

Рис. 3.15. Порядок слияния подмассивов при сокращенном объеме резервной памяти.

позиций, и обратным слиянием можно включить в фор­ мируемый массив новую упорядоченную часть. Так мож­ но постепенно наращивать массив частями по V объек­ тов, пока не дойдем до последней неполной части мас­

сива. В этом случае

обратное слияние надо

проводить

с размещением результирующего массива, начиная

с по­

зиции под индексом

п (рис. 3.15). Оценим

сложность

этой процедуры. Пусть выделена резервная

зона

в V

позиций, а исходный

массив имеет n — sV позиций.

Тог­

да для образования s упорядоченных частей массива не­

обходимо затратить время

 

T^sVT.log.V

(3.55)

(без учета возможной экономии времени на первом

этапе). Затем последовательно

проводятся

этапы слия­

ния с образованием

массивов

в

2V, ЗѴ, 4Ѵ,

sV = n

объектов.

При

оценке

сложности будем

считать, что

V > s. Тогда сложность

этих этапов Т2 будет

опреде­

ляться как

 

 

 

 

 

 

 

Т2 =

2 ѴТ0 +

3 ѴТ0

+ ... + sVT0

= *2 + *~2

VT0,

(3.56)

а общая

сложность Т

(учитывая,

что n = sV, и

считая

124

 

 

ГЛ. 3. МЕТОДЫ

слияния

 

 

 

V >

s)

составит

 

 

 

 

 

 

 

T = T1

+ Tz = nT0 log2

sa + s — 2

 

 

 

 

2s

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

log,n +

s* +

s —2

_

log2s

 

(3.57)

 

 

 

 

2s

 

 

 

 

На

рис. 3.16 приведена зависимость

второго

слагаемого

в

квадратных

скобках

предыдущей

формулы,

т. е.

/(s)

=

sa + s — 2

logjjS, от s. В

[14] описана

другая

раз­

 

 

2s

 

 

 

 

 

 

 

новидность метода слияния при ограниченном резерве памяти.

3.5.3. Алгоритм метода вставки. Интересно рассмот­ реть частный случай этой процедуры с предельным ог-

9 10 II 12

Рис. 3.16. Зависимость добавочного слагаемого сложности от отно­ сительного объема резервной памяти s — nV.

раничением используемого резерва памяти до одной сво­ бодной позиции (Ѵ=1) . В процессе выполнения процеду-

§ 3.5. ОГРАНИЧЕНИЯ РЕЗЕРВА ПАМЯТИ

125

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

Если внимательно рассмотреть отдельный этап дан­

ной

процедуры, то можно заметить, что

для каждого

і-го

элемента проводится серия сравнений

и пересылок

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

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

Данный алгоритм является одной из разновидностей

известного

алгоритма,

реализующего

так

называемый

«метод

вставки». Его отличие от известных

алгоритмов

в том,

что

в процессе

упорядочения

происходит сдвиг

всего массива на одну позицию. Алгоритм метода встав­ ки имеет две разновидности. В первой из них очеред­ ной объект до сравнения пересылается на резервную по­ зицию, после чего производится серия сравнений с этим объектом и пересылок элементов упорядоченной части массива, пока не будет найдено место этого очередного объекта в упорядоченной части массива. Он пересылает­ ся на найденное место, и процедура переходит к рас­ смотрению нового объекта из неупорядоченной части массива (рис. 3.17).

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

126

ГЛ. 3. МЕТОДЫ слияния

массива на одну позицию несуществен, то описанная ранее процедура предпочтительнее).

Сложность этой процедуры определяется следующи­ ми факторами.

Начало

і

і: =2

t '

i-1

нет

да

Г-Н

да

Рис. 3.17. Блок-схема алгоритма метода вставки (вариант № 1).

п

При выполнении основного цикла по і

(повторяемого

1 раз) надо:

 

 

 

вычислить адрес очередного объекта

(ТА)',

 

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

( 2 Г П ) ;

 

 

 

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

операции (ЗГ И );

R(TK).

 

выделить признак у объекта в рабочей

ячейке

 

При выполнении цикла сравнений по /

(повторяемого

столько раз, сколько инверсий у данного объекта с упо­ рядоченной частью массива, и еще один раз) надо:

вычислить адрес очередного объекта (ТА) ДЛЯ срав­ нения;

§ 3.5. ОГРАНИЧЕНИЯ РЕЗЕРВА ПАМЯТИ

127

выделить признак очередного объекта (Г*);

 

провести сравнение признаков

е т );

 

выполнить одну пересылку (Гп );

 

выполнить две индексные операции (27и ).

 

Общая сложность

 

 

Т = ( / і - 1 ) [ 2 Г А + 2 Г х + Т $ х + 2Та + ЪТа] +

 

+ 1[ТА + Тъ+Тп

+ Тп + 2ТИ),

(3.58а)

так как сумма всех инверсий объектов определяет сте­ пень неупорядоченности /.

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

ииндексные операции.

Вэтих обозначениях

Т = (л - 1) (Тс р + 2 Тв) + I (Тср + Тш).

(3.586)

Итак, выражение общей сложности процедуры состо­ ит из двух частей: постоянной, не зависящей от состоя­

ния массива

(первое

слагаемое), и переменной, пропор­

циональной

степени

исходной

неупорядоченности

мас­

сива.

 

 

 

 

 

Для

случайного

массива

преобладающим

будет

второе

слагаемое, имеющее в

этом случае порядок гіг.

Однако для почти

упорядоченного массива (при / ч х п)

сложность будет

определяться первым

слагаемым.

В другой разновидности процедуры отсылка очеред­

ного объекта на резервную позицию

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

только при обнаружении неупорядоченности этого объ­ екта с уже упорядоченной частью (рис. 3.18).

В этой разновидности процедуры в основной цикл по I введено сравнение признака объекта на позиции і с признаком объекта на позиции і—1 и пересылка осуще­ ствляется только при инверсии этих элементов. Посколь­ ку это сравнение происходит между очередным неупо­ рядоченным элементом и последним упорядоченным, то инверсия будет отсутствовать лишь при упорядоченности очередного объекта со всеми объектами, расположенны-

128

Г Л . 3.

М Е Т О Д Ы С Л И Я Н И Я

ми в массиве до

него.

Среднее число таких объектов

обозначим пу.

Сложность этой процедуры будет отличаться от слож­

ности предыдущей на величину

 

пу(2Тп),

(3.59)

так как, хотя в каждом цикле по і надо добавить вычис­ ление адреса предыдущего элемента, выделение его при­ знака и сравнение признаков, зато число циклов по j

. да/7? ж

Конец

Рис. 3.18. Блок-схема алгоритма метода вставки (вариант № 2).

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

Оценим величину пу для случайного массива. В этом случае вероятность отсутствия инверсии і-го элемента со всеми і—1 предшествующими элементами равна (1/2)' - 1 . Математическое ожидание числа элементов массива, не

§ 3.5. ОГРАНИЧЕНИЯ РЕЗЕРВА ПАМЯТИ

129

имеющих инверсии с предшествующими элементами, со­ ставит

т. е. для случайного массива рассматриваемый выиг­ рыш второй процедуры незначителен. Для неслучайного массива выигрыш может быть существенным (см. § 4.5).

В литературе известна процедура (называемая часто процедурой фон Неймана), определяющая границы зон упорядоченности сливаемых подмассивов автоматически, в процессе выполнения слияния [27]. Для этого прово­ дятся дополнительные сравнения значения признаков у объектов на соседних позициях в исходных подмзссивах. Тем самым на каждый элемент, помещаемый в резуль­ тирующий массив, приходится не одно сравнение, а два: сравнение с элементом из другого подмассива и срав­ нение с соседним элементом своего подмассива. Время сравнения увеличивается вдвое, что, конечно, снижает эффективность процедуры. Предполагаемый при этом вы­ игрыш от использования начальной (априорной) упоря­ доченности (т. е. не полной случайности) исходного мас­ сива получается небольшим из-за того, что процедуре необходим противоположный характер упорядоченности начальных и конечных элементов массива. На практике такой характер начальной упорядоченности, по-видимо­ му, весьма маловероятен.

3.5.4. Процедура слияния, не требующая резервных объемов памяти. Объем резервной памяти, требуемой для упорядочения массива, в принципе можно сократить до одной ячейки (или даже до нуля), сохранив общую структуру алгоритма, описанного в § 3.4, т. е. сохранив те же log2« этапов, содержание каждого этапа в смысле количества пар сливаемых подмассивов и размера каж­ дого из них. Изменяется только алгоритм операторов слияния двух упорядоченных подмассивов таким обра­ зом, чтобы это слияние могло быть выполнено без ис­ пользования резервных объемов памяти.

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

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

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