
- •1. Временная сложность алгоритмов. Примеры алгоритмов с различной временной сложностью.
- •2. Процедурное и объектно-ориентированное программирование. Основные концепции объектно-ориентированного программирования.
- •3. Класс как тип данных. Поля и методы класса. Создание класса на основе структурного и объединяющего типов данных.
- •6. Классы. Принцип наследования. Создание иерархии классов.
- •7. Наследование полей и методов. Изменение статуса видимости полей и методов при наследовании.
1. Временная сложность алгоритмов. Примеры алгоритмов с различной временной сложностью.
Обычно для решения одной и той же задачи могут быть использованы различные алгоритмы. Возникает проблема выбора и сравнения алгоритмов между собой. В качестве критериев сравнения алгоритмов могут быть использованы различные показатели, но, как правило, на практике наиболее важным оказывается последний критерий, от которого напрямую зависит время, требуемое для получения результата. Поэтому чаще всего программистов интересует временная сложность алгоритмов. Очевидно, что время выполнения алгоритма будет разным и при разных объемах входных данных, поэтому временную сложность нужно рассматривать как функцию от количества элементов N во входных данных. При этом можно абстрогироваться от некоторых сложных факторов, если оценивать не само время выполнения алгоритма, а скорость его изменения при увеличении объема входных данных. Кроме того, такая оценка должна быть асимптотической, т.е. выполняться при достаточно больших значениях N, и усредненной по различным наборам данных с тем, чтобы устранить влияние особенностей той или иной комбинации входных значений. Существует стандартная форма записи характеристики временной сложности алгоритма, которая называется "О большое". Основной параметр этой записи – размер входных данных N, а сложность или время работы алгоритма выражается как функция от N.
Примеры:
Алгоритм быстрой сортировки имеет минимальную сложность порядка О(N*log2N) и максимальную сложность порядка О(N2)
void QuickSort (int a[], int L, int R)
{
int i =L; int j = R;
int x = a[(L + R)>>1];
do {
while (a[i]<x) i++;
while (a[j]>x) j--;
if(i<=j) {
x = a[i];
a[i] = a[j];
j
] = x;
i++; j--;
}
}
while (i<=j);
if (i<R) QuickSort(a,i,R);
if (j>L) QuickSort(a,L,j);
}
Анализ сортировки Шелла показывает, что порядок ее алгоритма O(N1.3). Это значительное улучшение по сравнению с «родительской» сортировкой простыми включениями, имеющей порядок O(N2).
void ShellSort (int a[], int n)
// Усовершенствованный метод включения
{
int x, k;
for (int h = n>>1; h>=1; h = 3*h/5) {
k = h;
for (int i = k; i<n; i++) {
x = a[i];
int j = i-k;
while(j>=0 && a[j]>x) {
a[j+k] = a[j];
j-=k;
}
a[j+k] = x;
}
}
}
void InsertionSort (int a[], int n)
// Простой метод включения
{
int x;
for (int i = 1; i<n; i++) {
x = a[i];
int j = i-1;
while(j>=0 && a[j]>x) {
a[j+1] = a[j];
j--;
}
a[j+1] = x;
}
}
2. Процедурное и объектно-ориентированное программирование. Основные концепции объектно-ориентированного программирования.
Парадигмой называется система принципов и методологий, определяющих характер деятельности человека в той или иной сфере. В настоящее время в сфере программной инженерии существуют две парадигмы, определяющих два подхода к разработке программных средств:
процедурно-ориентированное программирование,
объектно-ориентированное программирование
Процедурно-ориентированное программирование:
Классический подход, основанный на конструировании программ в виде набора процедур, выполняющих обработку данных. При этом, процедуры и данные формально никак не связаны между собой, так что отдельная процедура может выполнять обработку любых передаваемых ей данных. По этой причине классический подход к проектированию программных средств основывается на моделировании предметной области в виде наборов структур данных (массивов, структур, простых переменных).
Пример:
Программа работы с картотекой сотрудников компании. Модель картотеки представляется в виде массива структур, каждая из которых содержит необходимые данные об отдельных сотрудниках компании. Для обработки этих данных разрабатываются процедуры создания и удаления записей, их редактирования, поиска по ключу и т.д. Но каждая из процедур может не быть привязанной именно к этим данным
Объектно-ориентированное программирование:
Основано на идее объединения данных и процедур их обработки, создания формальной связи между ними. Способ создания такой связи подобен тому, что используется для агрегирования простых переменных в структуры, а именно, создание пользовательских типов – классов, включающих как данные, так и процедуры их обработки. При таком подходе к проектированию программных средств модель предметной области строится в виде наборов объектов (экземпляров класса) – программных аналогов существующих в ней предметов и процессов.
Пример:
Картотека сотрудников компании создается в виде переменной класса, содержащего массив структур с записями о сотрудниках и процедуры его обработки. Эти процедуры не могут быть использованы для обработки каких-либо других массивов. Переменная класса называется также экземпляром класса или объектом.