
- •1. Абстрактные типы данных
- •Пример 1
- •1.4. Разработка объектов
- •1.4.1. Объекты и композиция
- •Пример 3
- •1.4.3. Объекты и наследование
- •1.4.4. Наследование в программировании
- •1.4.5. Упорядоченные списки и наследование
- •1.4.6. Повторное использование кода
- •1.4.7. Спецификации класса SeqList и OrderedList
- •1.5. Приложения с наследованием классов
- •1.6. Разработка объектно-ориентированных программ
- •1.6.1. Анализ задачи/определение программы
- •1.6.2. Разработка
- •1.6.3. Кодирование
- •1.6.4. Тестирование
- •1.6.5. Иллюстрация программной разработки: Dice график
- •Замечание
- •Программа 2. Диаграмма бросания костей
- •1.7. Тестирование и сопровождение программы
- •1.7.1. Объектное тестирование
- •1.7.2. Тестирование управляющего модуля
- •1.7.3. Программное сопровождение и документирование
- •1.9. Абстрактные базовые классы и полиморфизм
- •1.9.1. Полиморфизм и динамическое связывание
- •2.1. Пользовательский тип — класс
- •2.1.1. Объявление класса
- •Пример 1.
- •2.1.2. Конструктор
- •2.1.3. Объявление объекта
- •2.1.4. Реализация класса
- •2.1.5. Реализация конструктора
- •2.1.6. Создание объектов
- •Пример 2.
- •2.2. Примеры классов
- •2.2.1. Класс Temperature
- •2.2.2. Реализация класса Temperature
- •2.2.3. Класс случайных чисел
- •Пример 3.
- •2.2.4. Реализация класса RandomNumber
- •2.3. Объекты и передача информации
- •2.3.1. Объект как возвращаемое значение
- •2.3.2. Объект как параметр функции
- •2.4. Массивы объектов
- •2.4.1. Конструктор умолчания
- •2.5. Множественные конструкторы
- •2.5.1. Реализация класса Date
- •2.6. Практическое применение: Треугольные матрицы
- •2.6.1. Свойства верхней треугольной матрицы
- •2.6.2. Хранение треугольной матрицы
- •Пример 4.
- •Пример 5.
- •2.6.3. Класс TriMat
- •2.6.5. Реализация класса TriMat
2.6. Практическое применение: Треугольные матрицы
Двумерный массив, часто называемый матрицей (matrix), предоставляет важную для математики структуру данных. В этом разделе мы исследуем квадратные матрицы (square matrices — матрицы с одинаковым числом строк и столбцов), чьи элементы данных являются действительными числами. Мы разрабатываем класс TriMat, определяющий верхние треугольные матрицы (upper triangular matrices), в которых все элементы, находящиеся ниже диагонали, имеют нулевые значения.
(пример треугольной матрицы)
В математических терминах, Аi,j=0 для j<i. Верхний треугольник определяется элементами Аi,j для j³i. Эти матрицы имеют важные алгебраическиесвойства и используются для решения систем уравнений. Реализация операций верхней треугольной матрицы в классе TriMat показывает способ эффективного хранения треугольной матрицы в виде одномерного массива.
2.6.1. Свойства верхней треугольной матрицы
Если верхняя треугольная матрица имеет n2 элементов, приблизительно половина из них являются нулевыми и нет необходимости сохранять их явно. Конкретно, если мы вычитаем n диагональных элементов из суммы n2 элементов, то половина оставшихся элементов являются нулевыми. Например, при n=25 имеется 300 элементов со значением 0:
(n2-n)/2 = (252-25)/2=(625-25)/2 = 300
Далее следует набор операций для треугольных матриц. Мы определяем сложение, вычитание и умножение матриц, а также детерминант, который имеет важное применение для решения уравнений.
Сумма или разность двух треугольных матриц А и В получается в результате сложения или вычитания соответствующих элементов матриц. Результирующая матрица является треугольной.
Сложение С = А + В
где С - это треугольная матрица с элементами Ci,j = Ai,j + Bi,j.
Вычитание С = А - В
где С - это треугольная матрица с элементами Ci,j = Ai,j + Bi,j.
Умножение С = А * В
Результирующая матрица С - это треугольная матрица с элементами Ci,j, значения которых вычисляются из элементов строки i матрицы А и столбца j матрицы В:
Ci,j=(Ai,0*B0,j)+ (Ai,1*B1,j)+ (Ai,2*B2,j)+…+ (Ai,n-1*Bn-1,j)
Для общей квадратной матрицы детерминант является сложной для вычисления функцией, однако вычислить детерминант треугольной матрицы не трудно. Просто получите произведение элементов на диагонали.
2.6.2. Хранение треугольной матрицы
Применение для хранения верхней треугольной матрицы стандартного двумерного массива требует использования всей памяти размером n2, несмотря на прогнозируемые нули, расположенные ниже диагонали. Для исключения этого пространства мы сохраняем элементы из треугольной матрицы в одномерном массиве М. Все элементы ниже главной диагонали не сохраняются. Таблица 3.1 показывает количество элементов, которые сохраняются в каждой строке.
Хранение треугольной матрицы
Таблица 1
Строка |
Число элементов |
Элементы |
0 |
n |
(A0,0…A0,n-1) |
1 |
n-1 |
(A1,1…A1,n-1) |
2 |
n-2 |
(A2,2…A2,n-1) |
… |
… |
… |
n-2 |
2 |
(An-2,n-2…An-2,n-1) |
n-1 |
1 |
(An-1,n-1) |
Алгоритму сохранения требуется функция доступа, которая должна определять местоположение в массиве М элемента Ai,j. Для j < i элемент Ai,j является равным 0 и не сохраняется в М. Для j ³ i функция доступа использует информацию о числе сохраняемых элементов в каждой строке вплоть до строки i. Эта информация может быть вычислена для каждой строки i и сохранена в массиве (rowTable) для использования функцией доступа.
Строка |
rowTable |
Замечание |
0 |
rowTable[0] = 0 |
0 элементов перед строкой 0 |
1 |
rowTable [1] = n |
n элементов перед строкой 1 (от строки 0) |
2 |
rowTable [2] = n + n-1 |
n + n-1 элементов перед строкой 2 |
3 |
rowTable[3] = n + n-l+n-2 |
элементы перед строкой 3 |
… |
… |
… |
n-1 |
rowTable[n-1] = n + n-1 + ... +2 |
|