1 Сравнение данных произвольной структуры


Основная проблема, возникающая при сортировке данных произвольной структуры ¾ неопределенность операции сравнения. Если исходный массив А заполнен числами, то в качестве операции сравнения могут быть использованы стандартные операции сравнения. Если структура сортируемых данных не соответствует простым встроенным типам языка, то необходимо переопределить операции сравнения с помощью логических функций. Например, пусть массив А ¾ телефонный справочник, каждый элемент которого является записью с полями Name (фамилия абонента) и Phone (номер телефона):


A:            

Рисунок 26 - Список абонентов

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


function less ( x,y: <тип записи>): boolean;

    begin

       less:=x.Name <y.Name;

    end;


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

function less ( x,y: <тип записи>): boolean;

   begin

      IF (x.phone<y.phone)

         less:=true

      ELSEIF (x.phone>y.phone )

         less:=false

      ELSE less:=(x.name<y.name)

      FI

      FI

   end;


Кроме того, нужно переопределить операцию сравнения и при организации поиска элементов в отсортированном массиве. Изменение направления упорядочивания массива достигается путем замены операций сравнения на противоположные, т. е. в самой функции меняем “<” на “>”.Операция пересылки не требует переопределения и выполняется путем побитового копирования.


2 Сортировка по множеству ключей. Индексация


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

Вначале построения индексный массив В заполняется целыми числами от 1 до n. Затем производится сортировка, но при условии, что в операциях сравнения элементы массива А индексируются через массив В. Перестановки делаются только в массиве В. Тогда при доступе к элементам массива А через индексный массив В А[B[i]] можно работать с массивом А как с упорядоченным по возрастанию (например, производить быстрый поиск элементов), в то время как сами элементы А физически не переставляются.

Пример. Рассмотрим создание индексного массива, который упорядочивает массив целых чисел A=(7,1,6,3,2,8,5).Чтобы упорядочивать массив А по возрастанию, пронумеруем его элементы. Введем новый массив В и запишем в него номера массива А в последовательности, соответствующей условию упорядочиванию (по возрастанию). Получим следующий индексный массив В=(2,5,4,7,3,1,6)


Алгоритм на псевдокоде

(на примере пузырьковой сортировки)


B:=(1,2,…,n)

DO (i=1,2,…,n-1)

   DO(j=n,n-1,…,i+1)

      IF(a[bj]< a[bj-1]) bi↔bj-1 FI

   OD

OD


Отметим ряд положительных свойств индексации.

  1. Индексация дает возможность построения нескольких различных индексов, которые можно использовать по мере необходимости.
  2. Исключается копирование больших массивов данных (физический массив остаётся на месте, а индексы занимают мало места).
  3. Имеется возможность фильтрации данных. Фильтрация означает, что при работе с базами данных используются не все элементы, а только те, которые отвечают определённым условиям. В индекс включаются физические номера тех элементов, которые удовлетворяют условию фильтра.

3 Индексация через массив указателей


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


Контрольные вопросы

  1. Что такое индексный массив?
  2. Назовите основные достоинства индексный массивов.
  3. Что такое фильтрация данных?
  4. Каким образом строится индексный массив?