Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Колок.docx
Скачиваний:
2
Добавлен:
26.11.2019
Размер:
77.28 Кб
Скачать

Теорминимум

Общие вопросы

  1. Какие типы данных Вы знаете?

• Численные знаковые целые o int - 4 o short - 2 o char -1 • Численные знаковые дробные o float – 4 o double – 8 o long - 4( в С ) o long long – 8 o long double - 12( в С ) )

  1. Как узнать размер типа?

Оператор sizeof(тип)

  1. Что такое модель памяти? Какие модели памяти Вы знаете?

система хранения объектов. Способ хранения объекта в языке Си определяет его время жизни — часть времени выполнения программы, во время которого объект существует или для него зарезервировано место. Существует три способа хранения объектов: автоматический, статический и динамический.[1]

  1. Назовите размеры стандартных типов в используемой Вами модели памяти.

См 1 вопрос

  1. Что такое оператор typedef?

Средство для определения имен новых типов данных. Синоним типа int – typedef int lolo;

После этого lolo можно использовать в объявлениях, привидениях типов так же, как и int.

  1. Для чего предназначена директива препроцессора #define?

#define a 10

Каждый раз когда a встретится в тексте программы, оно будет заменено на 10

  1. Что такое сигнатура функции?

Сигнатура функции — часть общего объявления функции, позволяющая средствам трансляции идентифицировать функцию среди других.

Void bubble_sort(int *a, int n)

  1. Что означает директива #include?

Включение файлов к программе #include <stdio.h> например

  1. В чем отличие использования "" от <> в директиве #include?

“” – поиск начинается с того места, где находится сама программа

< >- поиск начинается в специальном разделе подстановочных файлов

  1. Что такое #if, #ifdef, #endif? Приведите пример применения.

 if — осуществляет условную компиляцию при истинности константного выражения

 ifdef — осуществляет условную компиляцию при определённости символической константы

 endif — конец ветки условной компиляции

То есть при истинности выражения или его определенности, все последующие строки включаются в программу вплоть до endif

  1. Как можно выделить память?

Int *A=(int*)malloc(sizeof(int)) – 1-ое тип, 2-ое объем памяти

*p = new int(5); 1-тип, в скобках - объем

  1. Как можно освободить память?

Free(a);

Delete[] p;

  1. Как проверить, что память выделилась?

A==NULL

  1. Как создать массив на стеке? Любой ли массив можно создать на стеке?

Int *A=(int*)malloc(sizeof(int)) – 1-ое тип, 1-ое объем памяти

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

  1. Что такое "выделение памяти в куче"?

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

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

  1. Как получить значение, на которое указывает указатель? Как называется эта операция?

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

  1. Какой тип получается при взятии адреса переменной?

Указатель типа этой переменной

  1. Напишите функцию swap, меняющую значения двух переменных.

Void swap(int a,int b)

{

Int c;

c=a;

a=b

b=c;

}

  1. Что такое передача аргументов по ссылке и по значению?

Если мы передаем переменную по значению, то в функции используется копия этой самой переменной. Для передачи по значению пишем просто void f (int a) Если мы передаем переменную по ссылке, то в функции мы работаем с самой переменной. Для передачи по ссылке пишем void g (int* a)

Ввод-вывод

  1. Какие функции для форматированного ввода из файла Вы знаете?

int fprintf(FILE * stream, далее как обычно);

  1. Какие функции для форматированного вывода в файл Вы знаете?

int fscanf(FILE * stream, далее как обычно);

  1. Какие функции для форматированного чтения из стандартного потока ввода Вы знаете?

printf

  1. Какие функции для форматированного вывода в стандартный поток вывода Вы знаете?

scanf

  1. Как прочитать один символ из стандартного потока ввода?

int getc( FILE *stream );

  1. Как открыть файл для записи?

fopen(name, “w”)

  1. Как закрыть файл после завершения записи?

Fclose(name)

  1. Как считать строку?

Gets(char *s)

  1. Как вывести строку?

Puts(char *s);

Общее по алгоритмам

  1. Какие нотации используют для обозначения сложности алгоритмов?

O(n) – где n указывает, сколько необходимо выполнить операций

teta

  1. Затраты каких ресурсов обычно меряют при оценке сложности? Алгоритмы оцениваются по скорости выполнения и эффективности использования памяти _______________________________________________________________________________

  2. Может ли алгоритм со сложностью O(n2) работать в практической задаче быстрее, чем алгоритм со сложностью O(nlogn)? Может. Пример: быстрая сортировка (nlogn) и сортировка пузырьком (n2) при отсортированном массиве _______________________________________________________________________________

  3. Что такое рекурсия? В программировании рекурсия — вызов функции (процедуры) из неё же самой. _______________________________________________________________________________

  4. Какую опасность несет рекурсия? Наиболее очевидная опасность рекурсии заключается в бесконечной рекурсии. Другая опасность рекурсии заключается в потерях памяти. При каждом вызове подпрограммы, система выделяет память для локальных переменных новой процедуры. _______________________________________________________________________________

  5. Покажите на примере, как можно избавиться от рекурсии. n-ое число Фиббоначи можно вычислять как рекурсивным методом (с помощью рекурсии подсчитывая предыдщее число), а можно обычным циклом, считая числа Фиббоначи, начиная с первого. _______________________________________________________________________________

  6. Оцените сложность алгоритма поиска простых чисел. O(n sqrt(n) ) - пройтись по длине – n, проверка на простоту – sqrt(n)

Сортировки

  1. В чем заключается задача сортировки?

Отсортировать элементы массива по возрастанию или убыванию

  1. Какова наименьшая сложность алгоритма сортировки?

Если мы знаем диапазон значений, то O(n), в общем случае O(nlog n)

  1. Какова сложность алгоритма сортировки пузырьком?

O(n^2)

  1. Какова сложность алгоритма сортировки пузырьком в лучшем случае?

И так и так O(n^2)

  1. Какова сложность алгоритма сортировки Шелла?

O(n log2 n)

  1. Какова сложность алгоритма сортировки вставками?

O(n2)

  1. Какова сложность алгоритма быстрой сортировки?

O(n log n), худший случай – O(n^2)

  1. Какие оптимизации быстрой сортировки Вы знаете?

При выборе опорного элемента из данного диапазона случайным образом худший случай становится очень маловероятным и ожидаемое время выполнения алгоритма сортировки — O(n lg n).

Выбирать опорным элементом средний из трех (первого, среднего и последнего элементов). Такой выбор также направлен против худшего случая.

Во избежание достижения опасной глубины рекурсии в худшем случае (или при приближении к нему) возможна модификация алгоритма, устраняющая одну ветвь рекурсии: вместо того, чтобы после разделения массива вызывать рекурсивно процедуру разделения для обоих найденных подмассивов, рекурсивный вызов делается только для меньшего подмассива, а больший обрабатывается в цикле в пределах этого же вызова процедуры. С точки зрения эффективности в среднем случае разницы практически нет: накладные расходы на дополнительный рекурсивный вызов и на организацию сравнения длин подмассивов и цикла — примерно одного порядка. Зато глубина рекурсии ни при каких обстоятельствах не превысит log2n, а в худшем случае вырожденного разделения она вообще будет не более 2 — вся обработка пройдёт в цикле первого уровня рекурсии.

Разбивать массив не на две, а на три части.

замена реального стека программной эмуляцией

  1. Какова сложность пирамидальной сортировки?

O(n log n)

  1. Какова сложность сортировки слиянием?

O(n log n)

  1. Какова сложность поразрядной сортировки?

O(n·k); требуется O(k) дополнительной памяти.

  1. Что такое задача выбора (k-я порядковая статистика)? Какова ее сложность?

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

Сложность O(n)

  1. Какова сложность алгоритма бинарного поиска

В уже отcортированном массиве – O(log n), иначе – O(n)

14. Можно ли применить алгоритм бинарного поиска к списку?

Нет, т.к. нам надо двигастья по порядку

Структуры данных

  1. Что такое структура?

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

Struct point

{

Int x;

Int y;

};

  1. Как выделить массив структур?

MyStruct* my_structs_array = new MyStruct[n];

  1. Что такое список?

спи́сок — структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и одну или две ссылки («связки») на следующий и/или предыдущий узел списка.

  1. Как устроен односвязный список?

Он состоит из узлов, которые содержат данные и ссылку на следующий узел списка (или предыдущий).

  1. Что такое стек? Как он устроен, какие операции в нем есть?

Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last infirst out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.

Операции: Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.

  1. Что такое очередь? Как она устроена? Какие операции в ней есть?

О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел». Добавление элемента возможно лишь в конец очереди, выборка — только из начала очереди, при этом выбранный элемент из очереди удаляется.

  1. Что такое куча (пирамида, Heap)?

ку́ча, пирами́да[1], или сортиру́ющее де́рево — такое двоичное дерево, для которого выполнены три условия:

Значение в любой вершине не меньше, чем значения её потомков.

Каждый лист имеет глубину (расстояние до корня) либо d либо d-1. Иными словами, если назвать слоем совокупность вершин, находящихся на определённой глубине, то все слои, кроме, быть может, последнего, заполнены полностью.

Последний слой заполняется слева направо.

  1. Какова стоимость операций с кучей?

Добавить элемент в кучу. Сложность O(logn) Исключить максимальный элемент из кучи. Время работы O(logn) Изменить значение любого элемента. Время работы O(logn) На основе этих операций можно выполнять следующие действие: Отсортировать массив путём превращения его в кучу, а кучи в отсортированный массив. Время работы O(nlog n)

  1. Как устроена очередь с приоритетами?

Очередь с приоритетом (priority queue) — абстрактный тип данных в программировании поддерживающий три операции: InsertWithPriority: добавить в очередь элемент с нaзначенным приоритетом GetNext: извлечь из очереди и вернуть элемент с минимальным приоритетом (другие названия "PopElement(Off)" или "GetMinimum") PeekоAtNext (необязательная операция): просмотреть элемент с наивысшим приоритетом без извлечения

  1. Какова стоимость операций в очереди с приоритетами?

O(log n)

Билеты