Примечание:
Красным цветом написаны вопросы и та часть ответов на вопросы на счет правильности которых есть сомнения.
Черным цветом написаны ответы на вопросы.
Фиолетовым цветом написаны алгоритмы и псевдокоды в ответах на вопросы.
Все что синим цветом – это дополнительная информация (не обращайте внимания)
|
Вопросы к экзамену по дисциплине |
|
|
«Алгоритмы и стуктуры данных» |
|
|
3-й семестр |
|
Оглавление |
|
|
1. |
Алгоритмическая сложность. Оценкароста функции. Оценкасверху, снизу, в среднем..... |
3 |
2. |
Алгоритмы поиска. Линейный поиск......................................................................................... |
3 |
3. |
Алгоритмы поиска. Бинарный поиск.......................................................................................... |
3 |
4. |
Поиск подстроки в строке. Простой поиск................................................................................. |
4 |
5. |
Поиск подстроки в строке.Алгоритм Кнута-Мориса-Прата..................................................... |
4 |
6. |
Поиск подстроки в строке.Алгоритм Боуера-Мура.................................................................. |
6 |
7. |
Линейные структуры данных. Списки. Динамический массив................................................ |
8 |
8. |
Линейные структуры данных. Списки. Связный идвусвязный списки................................... |
9 |
9. |
Линейные структуры данных.Очереди. Кольцевые очереди................................................. |
9 |
10.Линейные структуры данных. Стеки. Деки. Использование стека для решения задачи о
правильных скобках............................................................................................................................ |
9 |
11.Формы представления выражений. Польская и обратная польская нотации. Алгоритм
трансформации инфиксной записи в постфиксную....................................................................... |
10 |
12. Деревья. Дерево поиска и бинарное дерево поиска. Основные понятия........................ |
11 |
13.Сбалансированные деревья. Основныепонятия. Малый и большой поворотыдерева.
11
14. |
Сбалансированные деревья. АВЛ-деревья. Основные понятия........................................ |
12 |
15. |
Сбалансированные деревья. АВЛ-деревья. Алгоритм добавления нового узла............. |
12 |
16.Сбалансированные деревья. АВЛ-деревья. Алгоритм удаления существующего узла..13
17. Сбалансированные деревья.Красно-чёрные деревья. Основные понятия. |
....................14 |
18.Сбалансированные деревья.Красно-чёрныедеревья. Алгоритм добавления нового узла. 15
19.Сбалансированные деревья.Красно-чёрные деревья. Алгоритм удаления
существующего узла.......................................................................................................................... |
15 |
|
20. |
Сбалансированные деревья. B-деревья. 2-3-4 деревья. Основные понятия................... |
15 |
21. |
Сбалансированные деревья. 2-3-4 деревья. Алгоритм добавления нового ключа......... |
16 |
22.Сбалансированные деревья. 2-3-4 деревья. Алгоритм удаления существующего узла.18
23.Хэш-таблицы. Понятие хэш-функции. Хэширование делением. Хэширование
умножением. Универсальное хэширование................................................................................... |
19 |
|
24. |
Сортировка сравнениями. Пузырьковая сортировка (bubble)........................................... |
20 |
25. |
Сортировка сравнениями. Сортировка вставками (insertion)............................................ |
21 |
26. |
Сортировка сравнениями. Селекционная сортировка (selection)...................................... |
21 |
27. |
Сортировка «разделяй и властвуй». Сортировка слияниями (merge-sort)....................... |
22 |
28. |
Сортировка «разделяй и властвуй». Быстрая сортировка (quick-sort).............................. |
22 |
29. |
Сортировка с использованием деревьев. Пирамидальная сортировка (heap-sort)........ |
23 |
30. |
Сортировка больших файлов.Прямойалгоритм сортировки............................................ |
24 |
31. |
Сортировка больших файлов.Естественный алгоритм сортировки.................................. |
25 |
32. |
Графы. Основные понятия. Поиск в ширину. Поиск в глубину.......................................... |
25 |
33. |
Графы. Поиск кратчайшего пути. Алгоритм Дейкстры........................................................ |
28 |
34. |
Графы. Построение минимального остовного дерева.Алгоритм Прима......................... |
29 |
35. |
Графы. Построение минимального остовного дерева.Алгоритм Крускала..................... |
30 |
|
2 |
|
Алгоритмическая (Вычислительная) сложность – это параметр для сравнивнения быстродействия алгоритмов, чётко описывающее их поведение (время исполнения и объём необходимой памяти) в зависимости от размера входных данных.
Временная сложность алгоритма — это функция от размера входных данных, равная максимальному количеству элементарных операций, проделываемых алгоритмом для решения экземпляра задачи указанного размера.
Оценка роста функции (оценка слоности) – это оценка алгоритма (по времени
выполнения или по памяти) некоторой функцией от |
(количество входной информации), |
|
характеризующего изменение времени работы алгоритма с увеличением параметра . |
||
Оценка сверху – это оценка работы алгоритма |
в худшем случаи. |
Например для |
|
||
сортировки – обратно сортированная последовательность.
Оценкаснизу– этооценкаработыалгоритмавлучшемслучаи.Напримердлясортировки
– уже отсортированная последовательность.
Оценка в среднем – это оценка работы алгоритма в среднем случаи. Например для сортировки – частично отсортированная последовательность.
2. Алгоритмы поиска. Линейный поиск. ( )
Алгоритм поиска – последовательность операций сравнения, с искомым экземпляром данных, где очередные элементывструктура данных (где выполяется поиск) выбираюстя исходя от алгоритма поиска. Если после завершения алгоритма искомым экземпляром данных не был обнаружен в структуре данных, алгоритм завершает работу.
Линейный, последовательный поиск — алгоритм нахождения заданного значения в произвольной структуре данных. Данный алгоритм является простейшим алгоритмом поиска и работает за линейное время – с увеличением данных время выполнения увеличивается прямопропорционально. ''Метод поиска в лоб'' – перебирать все элементы в структуре данных начиная с первого (или с последнего) элемента и сравнить с искомым значением.
Псевдо код:
ЦИКЛ пока не закончились элементы, для каждого элемента ЕСЛИ очередной элемент совпадает с искомым, ТО
нашли, выходим из цикла Конец ЕСЛИ
Конец ЦИКЛА
3. Алгоритмы поиска. Бинарный поиск. ( )
Алгоритм поиска – последовательность операций сравнения, с искомым экземпляром данных, где очередные элементы в структура данных (где выполяется поиск) выбираюстя исходя от алгоритма поиска. Если после завершения алгоритма искомым экземпляром данных не был обнаружен в структуре данных, алгоритм завершает работу.
Двоичный (бинарный) поиск – классический алгоритм поиска элемента в отсортированном массиве (векторе), использующий дробление массива на половины. В каждой итерации работы алгоритма в массиве данных выбирается средний элемент и сравнивается с
3
искомым элементом, исходя из того будет элемент болше или меньше искомого, поиск продолжается в соответствующей половине.
Псевдокод:
Пусть есть некий отсортированный массив. Рекурсивно выполнить. ФУНКЦИЯ ПОИСКА (МАССИВ, НАЧАЛО, КОНЕЦ)
вычислить СРЕДНИЙ элемент, // средний = (int)(НАЧАЛО+КОНЕЦ / 2) сравнить с искомым ЕСЛИ ИСКОМЫЙ < СРДНЕГО
ФУНКЦИЯ ПОИСКА (МАССИВ, НАЧАЛО, СРЕДНИЙ) Конец ЕСЛИ ЕСЛИ ИСКОМЫЙ > СРДНЕГО
ФУНКЦИЯ ПОИСКА (МАССИВ, СРЕДНИЙ, КОНЕЦ) Конец ЕСЛИ ИНАЧЕ
нашли Конец ИНАЧЕ Конец ФУНКЦИИ
Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками,
которые позволяют найти паттерн (pattern) в тексте (text). Простой поиск подстроки в строке из себяпредставляет''примитивныйметодпоискавлоб''(brutе-force,наивныйалгоритм):накаждом
шагуберетсяочереднойкусокизстроки(длинойискомойстроки) исравнивается,еслирезультат
стравнения false( то −двигаемся) на−однусреднийпозициюслучайвперед иснова( 2) −сравниваемхудшийслучайи так до конца строки.
|строка| -- длина строки |
|подстрока| -- длина подстроки |
find(String
failed:
for (int i = 0; i < |строка| - |подстрока|; i++) { for (int j = 0; j < |подстрока|; j++) {
if (строка[i + j] != подстрока[j]) { goto failed;
}
}
return i; // нашли, вернули начальную позицию подстроки в строке
}
return -1; // не нашли
}
Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (pattern) в тексте (text).
Алгоритм Кнута — Морриса — Пратта (КМП-алгоритм) — эффективный алгоритм, осуществляющий поиск подстроки встроке. Времяработы алгоритмалинейнозависит от объёма входныхданных,тоесть разработатьасимптотическиболееэффективныйалгоритмневозможно.
4
|
|
|
|
ней |
|
|
|
|
|
= # |
|
# |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Посчитаем на |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
Дана цепочка |
|
|
и образец |
|
. Требуется найти все позиции, начиная с которых входит в T. |
|
|
|||||||||||||||||||||
|
Построим строку |
|
|
|
, где |
|
— любой символ, не входящий в алфавит |
|
и . |
|||||||||||||||||||
|
подстроки : [ ] |
| | |
|
|
|
|
|
|
|
. |
Благодаря |
|
|
|
> | | и [ ] = |
|||||||||||||
| | |
|
|
|
|
|
|
|
значение префикс-функции |
0 |
разделительному символу |
, |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
−| | + 1 |
|
|
|
|
|
|
# |
||||
выполняется |
|
|
|
|
|
|
|
. Заметим, что по |
определению префикс-функции при |
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
| | + 1 |
|
|
|
|
||||||||||||
словами, |
− | | + 1 |
|
|
|
|
|
|
|
|
|
|
|
и |
|
|
|
|
|
|
|
||||||||
|
|
|
|
длины |
|
, начинающиеся с позиций |
|
|
|
|
, совпадают. Соберем все такие |
|||||||||||||||||
очередное вхождение образца в цепочку |
. |
|
|
|
|
|
[ ] = | | |
|
, это и будет ответ. Другими |
|||||||||||||||||||
позиции |
|
|
|
|
|
строки |
|
, вычтем из каждой позиции |
|
|
|
|||||||||||||||||
( |
есливкакой-топозиции выполняетсяусловие |
|
|
|
,товэтойпозицииначинается |
|||||||||||||||||||||||
+ ) |
− среднийихудшийслучай |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
int find(String p, String s) { String c = p + "#" + s;
int[] prefix = new int[c.length()]; for (int i = 1; i < c.length(); i++) {
int j = prefix[i - 1];
while (j > 0 && c[i] != c[j]) { j = prefix[j - 1];
}
if (c[i] == c[j]) { prefix[i] = j + 1;
}
if (prefix[i] == p.length()) { return i - 2 * p.length();
}
}
return -1;
}
+++++++++++++++++++++++++++++++++++++++++++++++++
Пусть дан текст в виде массива T[n] и образец (то что ищем) P[1…m]; m
n. Символы принадлежат
алфавиту
в бинарном коде;
в текстовом файле.
Р входит в Т со сдвигом S, если T[S+1…S+m]=P[1…m]; S от 0 до n-m, такой сдвиг называется допустимым. #T=abcabaabc;
P=abaa;
P
abaa, сдвиг S=3.
Пусть дана строка символов X[1…n], тогда для любой пары i, j; 1
определяем подстроку
X[i…j]=X[i] X[i+1]…X[j].
Будем говорить, что подстрока X[i…j], начинается с позиции i и её длина равна j-i+1, если величина меньше чем n, то подстрока называется собственной подстрокой строки X.
(сигма) X=
Для произвольного целого j от 0 до n подстрока X[1…j] называется префиксом подстроки. Если j<n собственный префикс подстроки X.
Для произвольного целого i от 1 до n+1 подстрока X[i…n] называется суффиксом строки X. Если i>1 то подстрока называется собственным суффиксом X.
Например, X=abaab
-префиксы a, ab, aba, abaa, abaab; -суфиксы b, ab, aab, baab, abaab=X.
Алгоритм поиска образца:
5