
книги из ГПНТБ / Папернов А.А. Методы упорядочения информации в цифровых системах
.pdf240 ГЛ. 6. ПОРАЗРЯДНОЕ УПОРЯДОЧЕНИЕ
в этом случае должен быть взят новый подмассив из не
упорядоченной |
части. |
|
|
Е с л и / + т , |
то |
прежде |
всего анализируем объем |
группы младших |
элементов, |
образованной в результате |
I Начало
/,.-=/„-/
іг :=(„ + /
/к ]
а[іг-!]: = а[і,*!]
а[і, + /]••-/?
нет
У Конец
Рис. 6.1. Блок-схема оператора разделения по значению заданного разряда признака.
деления. Если эта группа содержит более одного эле^ мента, то для дальнейшего разделения выбирается имен но она. Граничные значения индексов группы старших
§ 6.2. ОРГАНИЗАЦИЯ ПРОЦЕДУРЫ |
241 |
элементов должны быть сохранены для проведения раз деления на следующих этапах процедуры. При этом на
каждом |
этапе разделения достаточно |
запомнить |
лишь |
|
одну из |
границ, а именно ік, |
так как все последователь |
||
но образуемые подмассивы |
вплотную |
примыкают |
друг |
|
к другу |
и і„ данного подмассива может быть определе |
|||
но по конечному индексу следующего |
подмассива. |
|
||
Если анализ объема группы младших элементов по |
||||
кажет, |
что в ней не более |
одного элемента и, следова |
тельно, дальнейшее разделение этой группы невозмож
но, то эта группа элементов должна быть |
включена в |
|
уже упорядоченную |
часть массива, и можно попытать |
|
ся разделить группу |
старших элементов |
подмассива. |
Для этого в свою очередь следует проверить объем груп пы старших элементов и, если в этой группе более одно го элемента, провести ее разделение по (/+1) - му раз ряду. Если же дальнейшее разделение этой группы не возможно (в ней меньше двух элементов), то последнее разделение было окончательным и группа младших эле ментов и группа старших элементов должны быть вклю чены в уже упорядоченную часть массива. Для даль нейшего разделения в этом случае должен быть взят очередной подмассив (с наибольшим значением /) из неупорядоченной части (если таковые в ней еще име^ ются).
Описанная организация процедуры обладает той осо бенностью, что начальная позиция подмассива, подле жащего разделению на данном этапе, является первой позицией еще неупорядоченной части массива. Другой характерной особенностью процедуры является то, что в списке подмассивов еще не упорядоченной части не может одновременно быть более одного подмассива, тре бующего разделения по определенному /-му разряду признака. Это свойство удобно использовать при орга низации списка границ подмассивов еще не упорядочен
ной части. |
Пусть для этого |
списка |
выделен |
массив |
|||
6[1 : m—1]. |
Индекс |
элементов |
этого массива |
пусть со |
|||
ответствует |
номеру |
разряда, |
по |
которому |
проводится |
||
разделение. |
На первой позиции |
этого |
массива |
будем |
хранить границу подмассива, запоминаемую в резуль
тате разделения по |
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 значений признака, принадлежащих каким-либо эле-