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

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

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

240 ГЛ. 6. ПОРАЗРЯДНОЕ УПОРЯДОЧЕНИЕ

в этом случае должен быть взят новый подмассив из не­

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

части.

 

Е с л и / + т ,

то

прежде

всего анализируем объем

группы младших

элементов,

образованной в результате

I Начало

/,.-=/„-/

іг :=(„ + /

/к ]

а[іг-!]: = а[і,*!]

а[і, + /]••-/?

нет

У Конец

Рис. 6.1. Блок-схема оператора разделения по значению заданного разряда признака.

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

§ 6.2. ОРГАНИЗАЦИЯ ПРОЦЕДУРЫ

241

элементов должны быть сохранены для проведения раз­ деления на следующих этапах процедуры. При этом на

каждом

этапе разделения достаточно

запомнить

лишь

одну из

границ, а именно ік,

так как все последователь­

но образуемые подмассивы

вплотную

примыкают

друг

к другу

и і„ данного подмассива может быть определе­

но по конечному индексу следующего

подмассива.

 

Если анализ объема группы младших элементов по­

кажет,

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

одного элемента и, следова­

тельно, дальнейшее разделение этой группы невозмож­

но, то эта группа элементов должна быть

включена в

уже упорядоченную

часть массива, и можно попытать­

ся разделить группу

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

подмассива.

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

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

ной части.

Пусть для этого

списка

выделен

массив

6[1 : m1].

Индекс

элементов

этого массива

пусть со­

ответствует

номеру

разряда,

по

которому

проводится

разделение.

На первой позиции

этого

массива

будем

хранить границу подмассива, запоминаемую в резуль­

тате разделения по

1-му разряду, на второй— по

2-му

и т. д. до (m—1)-го

разряда (при делении по m-му

раз-

242

 

ГЛ. 6. ПОРАЗРЯДНОЕ

УПОРЯДОЧЕНИЕ

ряду

границу

запоминать не

требуется). Поскольку в

этом

случае

имеется жесткое

соответствие «разряд —

граница», то независимо от результата разделения при

любом переходе от деления по

/-му разряду к делению

по (/+1)-му разряду

в ячейку

b[j]

должна записывать­

ся нижняя граница

подмассива,

разделенного по /-му

разряду. Поскольку

фиксация

границ проводится без

Рис. 6.2. Блок-схема процедуры поразрядного упорядочения.

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

Блок-схема процедуры поразрядного упорядочения с описанной выше организацией приведена на рис. 6.2. Назначение отдельных блоков следующее.

 

§ 6.2. ОРГАНИЗАЦИЯ ПРОЦЕДУРЫ

 

243

Блок /

присваивает

начальные

значения

внутренним

параметрам процедуры

(/„,

/к , / ) .

элементов

в

массиве.

Блок 2

проверяет общее

число

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

Блок 3— оператор разделения.

Блок 4 контролирует номер разряда, по которому проведено разделение. Если разделение прошло по по­

следнему разряду

(і — т),

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

выборка

очередного подмассива из

неупорядоченной части (бло­

ки 10, 11, 12, 13 и

14).

 

 

Блок 5 контролирует число элементов в группе млад­

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

больше

одного, то осуществляется переход к блоку 7, в против­ ном случае — к блоку 6.

Блок 6 контролирует число элементов в группе стар­ ших элементов подмассива. Если этих элементов меньше одного, то осуществляется выборка очередного подмас­ сива из неупорядоченной части (блоки 10—14).

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

Блок 8 служит для запоминания границы подмасси­ ва, оставляемого в неупорядоченной части, и для изме­ нения индекса (і н ) при переходе к разделению группы старших элементов массива.

Блок 9 изменяет значение индекса /.

Блок 10 изменяет значение начального индекса под­ массива при переходе к разделению нового подмассива из неупорядоченной части.

Блок 11 осуществляет проверку конца упорядочения. Блок 12 изменяет значение конечного индекса при переходе к разделению подмассива из неупорядоченной

части.

Блок 13 контролирует объем очередного подмассива из неупорядоченной части. Если в очередном подмассиве число элементов больше одного, то проводится раз­ деление. В противном случае изменяется значение ин­ декса / (блок 14) и алгоритм переходит к следующему подмассиву из неупорядоченной части.

244

ГЛ. 6. ПОРАЗРЯДНОЕ УПОРЯДОЧЕНИЕ

§ 6.3. Упорядочение по группе разрядов

Ускорение

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

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

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

Пусть для анализа выбрана группа из m разрядов признака. Для этой группы разрядов существует s —2м различных возможных значений. Исходный подмассив должен быть разбит при этом на s взаимно упорядочен­ ных частей. Пусть число элементов в исходном подмас­ сиве равно п. Для выполнения разделения выделим резервные объемы памяти, состоящие из массива в п элементов для формирования результата разделения и из вспомогательного массива в s элементов для хране­ ния результатов подсчета числа элементов в подмассивах на первом просмотре исходного подмассива и для распределения элементов по текущим позициям на вто­

ром

просмотре.

 

 

 

 

 

п

 

 

Обозначим

исходный

подмассив

из

элементов

А[іл

: 4 ] . подмассив для

формирования результата раз­

деления— В[ін

: ік]

и

вспомогательный

подмассив

из

s элементов —

C [ l

: s ] .

В

результате

первого

этапа

во

вспомогательном массиве должна быть сформирована последовательность С[і], С [2],..., С [у],..., С [s], опреде-

§ 6.3. УПОРЯДОЧЕНИЕ ПО ГРУППЕ РАЗРЯДОВ

245

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

единица. Операцию выделения данной

группы

разрядов

у элемента запишем в виде / : =Sk{Aгде

индекс

k

обозначает номер данной группы разрядов.

 

 

Блок-схема оператора разделения,

основанного

на

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

массива

по значению выделенной группы разрядов признака, при­ ведена на рис. 6.3. Подготовительный этап оператора со­ стоит в очищении вспомогательного массива в цикличе­ ском режиме (блоки 1, 2, 3 и 4). Затем проводится пер­ вый просмотр исходного подмассива и подсчет во вспомогательном массиве числа элементов, имеющих определенное значение выделенной группы разрядов признака. Результат подсчета накапливается в ячейках С[у] массива С, адрес которых определяется вычислени­ ем индекса у по значению выделенной группы разрядов признака. Этот этап проводится в циклическом режиме по индексу і (блоки 5, 6, 7, 8 а 9).

Далее проводится подготовка ко второму просмотру исходного подмассива. В ячейках С[у] при этом форми­ руются индексы начальных позиций соответствующих групп результирующего массива. Расчет удобнее прово­ дить, начиная с конечных групп. В этом случае исполь­

зуется соотношение

 

С[/]: = С [ / + 1 ] - С [ / Ъ

(6.22)

так как в C[j+l] содержится рассчитанное ранее на­ чальное значение индекса следующей (/+1) - й группы элементов, в С [у]—число элементов в данной группе, полученное на первом просмотре, и в результате в С [у] будет образовано значение индекса начальной позиции данной группы элементов. В противном случае (при рас­ чете, начинающемся с начальных групп) следует прини­ мать дополнительные меры, исключающие наложение в одной и той же ячейке C[j] результата расчета началь­ ного индекса позиции данной группы и числа элементов

246

ГЛ. б. ПОРАЗРЯДНОЕ УПОРЯДОЧЕНИЕ

=!

p

 

o[J]--o

©

 

 

 

=S

да/77

©

 

 

= 'н

©

 

 

 

*

 

 

If

®

 

C[j].-C[j]+!

 

 

 

 

нет

/.- = / + /

 

 

y.-=s-/

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

§ 6.3. УПОРЯДОЧЕНИЕ ПО ГРУППЕ РАЗРЯДОВ

247

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

щим значениям /. Блок

10

задает

начальное

значение

/ и определяет значение

индекса начальной позиции по­

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

С [s]

по

индексу

конечной

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

ік и по числу эле­

ментов в последней группе.

 

 

 

 

Последний этап оператора состоит в новом просмотре исходного подмассива в цикле по индексу і с пересыл­ кой каждого элемента исходного подмассива А на соот­ ветствующую позицию результирующего подмассива В и с изменением значения, соответствующего C[j], с тем, чтобы в C[j] постоянно содержались индексы первых свободных позиций в каждой из групп элементов (если свободные позиции в группе еще имеются). При этом также 'используется вычисление адреса элементов мас­ сива C[j] по значению выделенной группы разрядов при­ знака (см. блоки 14, 15, 16, 17 и 18).

Сложность оператора оценим, исходя из следующих предположений: сложность всех операций с элементами массива С примем равной сложности индексных операций

Т и , сложность

определения / примем

равной

Ts,

а слож­

ность пересылки — Тп.

Тогда

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

Г =

( б Т и +

Г п +

2 Г > + б

7 н . 2 т ,

 

(6.23)

так как s = 2m-.

Отметим следующие основные особенности оператора: 1. Для выполнения разделения оператор требует ре­ зерва памяти, равного сумме объемов исходного подмас­

сива и вспомогательного массива С.

2.Результирующий подмассив образуется на новом участке памяти.

3.Оператор не нарушает порядка расположения эле­ ментов каждой из групп результирующего подмассива по отношению к их порядку в исходном подмассиве.

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

248 ГЛ. 6. ПОРАЗРЯДНОЕ УПОРЯДОЧЕНИЕ

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

чения с анализом отдельных

разрядов признака (см.

§ 6.2.)). В этом случае, помимо

резерва памяти, необходи­

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

будет

проводиться на более поздних

этапах

процедуры.

В результате

каждого разделения

может

возникнуть

s = 2m

новых

подмассивов, из которых только один мо­

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

(6.24)

которая существенно увеличивается с ростом m и может потребовать значительных объемов запоминающего уст­ ройства.

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

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

иэлементов по основному и дополнительному объемам памяти в единый упорядоченный массив.

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

§ 6.3. УПОРЯДОЧЕНИЕ ПО ГРУППЕ РАЗРЯДОВ

249

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

новую позицию.

 

 

 

 

Сложность

процедуры в

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

случае

определяется

выражением

 

 

 

 

Т = (6 Та + Тп + 2 Ts) n — + 6 7И 2m - ^ ^ ( 6 . 2 5 )

 

 

 

m

m

 

которое имеет

минимум по m,

но этот минимум достигает­

ся

только тогда, когда 2™ становится соизмеримым с п.

 

Для случая, когда число разрядов у признака

велико,

а

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

что

n <С^2г,

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

Пусть проведено k этапов разделения, т. е. просмот­ рена группа старших km разрядов признака. Будем счи­ тать, что значение признака у элементов массива равно­ мерно распределено во всем диапазоне возможных значений. При проведении указанного числа этапов раз­ деления весь диапазон возможных значений признака разбивается на 2km интервалов равной длины. В этих условиях в отдельный интервал попадает случайное число t значений признака, принадлежащих каким-либо эле-

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