Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы инфа.doc
Скачиваний:
18
Добавлен:
01.08.2019
Размер:
2.55 Mб
Скачать

1)Основные понятия алгоритмов. Основные виды алгоритмов. Оценка сложности алгоритмов.

Алгоритм – это конечная последовательность строго определенных действий, приводящих к однозначному решению поставленной задачи.

Главная особенность любого алгоритма – формальное исполнение, позволяющее выполнить заданные действия (команды) не только человеку, но и различным техническим устройствам.

Объект, который будет выполнять алгоритм, обычно называют исполнителем.

Исполнитель - объект, который выполняет алгоритм.

Идеальными исполнителями являются машины, роботы, компьютеры...

Компьютер – автоматический исполнитель алгоритмов.

Множество команд, которые в состоянии выполнить данный исполнитель, называется системой команд исполнителя.

Алгоритм может быть задан :

Словесно – описание алгоритма словами и предложениями.

Таблично - описание алгоритма в форме таблиц и расчетных формул.

Графически - описание алгоритма с помощью геометрических фигур, называемых блоками.

Свойства алгоритмов:

1. Массовость – обеспечивает решение широкого класса задач данного типа;

2. Понятность – перечень команд, которые понятны исполнителю;

3. Дискретность – т.е. разбить на последовательность отдельных шагов, только выполнив один шаг, переходим к другому;

4. Определенность или детерминированность – запись должна быть полной и четкой, чтобы не было потребности домысливать;

5. Результативность – процесс вычисления прекращается за конечное число шагов.

Виды:

Алгоритм, в котором есть структура - СЛЕДОВАНИЕ называется ЛИНЕЙНЫМ.

Следование - это расположение действий друг за другом.

Алгоритм, в котором есть структура - ВЕТВЛЕНИЕ называется РАЗВЕТВЛЯЮЩИМСЯ.

Ветвление - это выбор действия в зависимости от выполнения какого-нибудь условия.

Алгоритм, в котором есть структура - ЦИКЛ называется ЦИКЛИЧЕСКИМ.

Цикл - это неоднократное повторение каких-либо действий.

Оценка сложности:

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

Пусть:

А – алгоритм решения некоторого класса задач и n-размерность одной задачи из этого клааса (в частном случае n может быть, например длинной последовательности в рассмотренном выше алгоритме, количеством слов в анализируемом тексте и т.п.);

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

Тогда алгоритм называется полиномиальным, если fA(n) растет не быстрее чем полином от n. В противном случае алгоритм А называется экспоненциальным. Так, функции типа kn, kn2,kn3,..., где k – коэфициент, могут рассматриваться как полиномиальные, а функции типа 2n, nn, n!... как экспоненциальнные.

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

Время, затраченное на реализацию алгоритма, как функция размерности задачи называется временной сложностью алгоритма и обозначается как O[fA(n)]. Применительно к решению задачи на ЭВМ это время является в большинстве случаев свойством самого алгоритма и слабо зависит от машины, на которой решается соотвтствующая алгоритму программа.

Кроме временной сложности алгортмов существуют и другие меры сложности. Так, сложность можно характиризовать числом операций N (применительно к конкретной ЭВМ) и общим объемом информации Р, т.е общим количеством слов, используемых при выполнении алгоритма. Тогда время его выполнения на конкретной ЭВМ связано с числом операций, а объем информации связан с объемом памяти, необходимой машине для реализации соответствующей программы. Следовательно, время реализации алгоритма есть функция T=f(N). При таком подходе значения Т и Р называют соответственно вычислительной и емкостной сложностью алгоритма.

2)Работа с указателями. Шаблоны типов и классов. Позднее динамическое связывание.

Кроме переменных в с++ существуют указатели, которые вместо того, чтобы "хранить" их, содержат адрес этих данных в памяти. То есть, например, у нас есть куча шариков. Где-то есть шарик с номером 5. Ну так вот, указатель - это такая переменная, которая указывает на "позицию" этого шарика, на его местоположения.

Создание указателя: тип *имя;

Пример:

int *p; // указатель на переменную типа int или первый элемент массива типа int

char *pc; // указатель на переменную или массив типа char

Теперь надо заставить указатель на что-то указывать. Для этого мы можем использовать оператор & - функция взятия адреса переменной

int *p;

int a=10;

p=&a; //теперь p указывает на переменную a.

Для записи чего-либо в память, на которую указывает указатель надо использовать оператор *, который обозначает, что мы работаем с данными, находящимися по такому-то адресу

*p=20; //теперь a==20

Также мы можем динамически выделять память под данные во время работы программы. а не во время ее разработки. Например, нам вводят число символов в строке и затем строку. С помощью указателей и выделения памяти мы можем создать массив необходимого размера во время работы программы.

Для выделения памяти служит функция new : char *c=new char(количество символов);

Вот мы создали массив типа char.Работа с ним ничем не отличается от работы с обычным массивом.

Внимание, после того, как вы поработали с массивом и вам он больше не нужно, необходимо отчистить память: delete [] имя указателя на память, которую нужно отчистить.

Шаблоны типов и классов:

Шаблон – одно из самых и мощных средств программирования, которое позволяет создать многократно используемый код. Используя шаблоны можно создавать обобщенные функции и классы.

В обобщенной функции (или классе) обрабатываемый её тип данных задается как параметр. Таким образом одну функцию или класс можно использовать для разных типов данных, не представляя явным образом конкретные версии для каждого типа данных.

Обобщенная функция – функция перегружающая сама себя. Определяет общий набор операций, которые предназначены для приgменения к данным различных типов. Тип данных передается как параметр. Обобщенная функция задается с помощью ключевого слова template:

template <class Ttype> тип имя_функции(список_параметров)

{ тело функции}

Элемент Ttype представляет собой заполнитель для типа данных, обрабатываемых функцией, вместо него компилятор подставит реальный тип данных при создании конкретной версии функции. Обобщенная функция – шаблонная функция. Когда компилятор создает определенную версию этой функции, ,то говорят, что создается её специализация – порожденная функция (конкретный экземпляр шаблонной функции). В template – инструкции можно определить несколько различных типов данных.

Можно так же определить обобщенный класс. Для этого создается класс, в котором определяются все используемые им алгоритмы; при этом реальный тип обрабатываемых в нем данных будет задан как параметр при создании объектов этого класса:

template <class Ttype> class имя_класса{тело}

Функции-члены обобщенного класса автоматически являются обобщенными.

Позднее динамическое связывание:

Класс, который наследуется называется базовым, класс, который наследует, называется производным.

Class имя_производного_класса : доступ имя_базового_класса {тело}

Доступ необязателен, но при необходимости н может быть выражен одним из спецификаторов доступа: protected, private, public. Если базовый класс наследуется как public, то его public-члены становятся public-членами производного класса. Если базовый класс наследуется как private, его public-члены становятся private-членами производного класса.

Виртуальная функция – функция, которая определяется ключевым словом virtual и переопределяется в одном или нескольких производных классах. Класс, который включает в себя виртуальную функцию, называется полиморфным. Virtual наследуется.

Чисто виртуальная функция – это виртуальная функция, которая не имеет определения в базовом классе. Любой производный класс должен переопределить такую функцию для себя.

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

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