- •III. Структуры, организация, хранение и поиск данных
- •2. Организация данных
- •2.5. Деревья. Классификация бинарных деревьев
- •2. Признак строгости бинарного дерева.
- •3. Структуры хранения данных
- •3.1. Вектор.
- •3.2. Список.
- •3.3. Сети.
- •Хранение массива в виде вектора
- •3.4. Отображение структур данных в структуры хранения.
- •Представление бинарного дерева в виде массива
- •Списочное представление бинарных деревьев
- •Прохождение бинарных деревьев
- •Прошитые бинарные деревья
- •Идеально сбалансированное бинарное дерево
3.4. Отображение структур данных в структуры хранения.
1. Строки, состоящие из элементов одинакового размера, обычно хранят в памяти компьютера в виде векторов. При небольшом размере элементов в одно машинное слово упаковывают несколько элементов строки.
Строку с крупными элементами переменной длины целесообразнее хранить в виде списка, особенно, когда приходится производить операции над строками: объединение двух строк, разделение строки на части и сравнение двух строк элемент за элементом.
2. Массив, как правило, хранят в виде вектора, однако возможны исключения. Например, в задачах линейного программирования большинство элементов матрицы условий обычно равно нулю. В таких случаях лучше хранить массив в виде таблицы, содержащей лишь ненулевые элементы. Ключом каждого элемента в данном случае является набор индексов элемента массива.
Хранение массива в виде вектора
Пусть массив А[in, kn] хранится в памяти машины в виде одномерного вектора B[N], где
Элементы массива А можно отобразить в массив В двумя способами: строками, когда наиболее быстро меняется последний индекс; столбцами, когда наиболее быстро меняется первый индекс (строки и столбцы, естественно, имеют буквальный смысл только для двумерных массивов).
В отечественных трансляторах обычно используется отображение строками, а в зарубежных – столбцами. В обоих случаях можно построить функцию упорядочения, позволяющую по индексам элемента исходного массива А вычислить соответствующий индекс одного элемента массива В. Эта функция имеет вид:
где при отображении строками
Dn = 1 и Dm = (km+1 - im+1 +1) Dm+1
m=n -1,...,1,
а при отображении столбцами
D1 = 1 и Dm = (km-1 - im-1 +1) Dm-1
m=2,...,n,
Формула определения адреса хранения элемента A[j1, .... jn] в случае, когда вектор В имеет базу b (адрес):
Постоянная величина с, как и коэффициенты Dm, зависит только от значений граничных пар в описании массива А.
Для вычисления адреса элемента произвольного массива А необходимо знать базу отображающего вектора b, размерность массива N и N целых чисел.
При отображении строками это – коэффициенты:
с, D1, ..., Dn-1
коэффициент Dn всегда равен единице.
Некоторые трансляторы предусматривают контроль правильности обращений к элементам массивов при выполнении транслированной программы, для чего необходимо для каждого массива хранить нижнюю и верхнюю границы каждого индекса.
В программе может быть несколько массивов. Для распределения памяти под массивы необходимо знать число элементов N в каждом массиве.
Величину N можно вычислить из формулы
Dm = (km+1 - im+1 +1) Dm+1
при m=0
N = D0 = (k1—i1+1) D1
где N – размерность массива, с, D0, D1, ...,Dn-1 — коэффициенты, i1, k1 .., in, kn – значения граничных пар, которые зависят только от описания массива, обычно хранятся в виде, так называемого, определяющего вектора массива. Для массивов с одинаковыми описаниями определяющие векторы равны.
Таким образом, для вычисления адреса элемента массива достаточно знать базу отображающего вектора b и место хранения определяющего вектора.
3. Стек обычно хранят в памяти компьютера в виде вектора, длина которого должна быть равна максимально ожидаемой длине стека; кроме того, необходимо иметь указатель, называемый указателем стека, постоянно указывающий на вершину стека (на последнюю занятую позицию стека или на первую свободную позицию); при добавлении в стек нового элемента указатель стека увеличивается на единицу, а при исключении элемента – уменьшается на единицу.
4. Очередь хранить в виде вектора неудобно, потому что при исключении элемента (удалении элемента с выходного конца очереди) пришлось бы двигать все элементы вдоль вектора к выходному концу; обычно хранят в памяти компьютера в виде циклического списка с двумя указателями, один из которых указывает на начало, а другой – на конец очереди. При исключении из очереди первого элемента в первый указатель засылается ссылка на следующий элемент списка, содержащийся в поле указателя исключаемого элемента, а при включении в очередь нового элемента во второй указатель засылается ссылка на новый элемент.
5. Деревья и ориентированные графы удобнее всего отображать сетями (в виде мультисписков), а также, используя специальные формы записи, деревья можно хранить в виде векторов, что широко используется в трансляторах.
