- •1. Методы оценки сложности и эффективности алгоритмов и структур данных.
- •2. Линейный однонаправленный список, представление и реализация.
- •3. Стек, очередь и дек.
- •4.Мультисписки. Слоеные списки. Иерархические списки.
- •5.Нотации алгебраических выражений.
- •6. Поиск в линейных структурах данных (последовательный поиск, барьеры, бинарный поиск, метод интерполяций)
- •7. Хеширование при хранении и поиске данных. Возникновение и разрешение коллизий.
- •8. Представления и реализации бинарных деревьев, обходы бинарных деревьев.
- •9. Бинарные деревья поиска.
- •10. Алгоритмы построения идеально сбалансированного дерева. Алгоритм построения лозы бинарного дерева.
- •Int* keys; // An array of keys
- •Int t; // Minimum degree (defines the range for number
- •Int n; // Current number of keys
- •13. Графы, способы представления.
- •14. Сортировка вставками (включением),сортировка Шелла.
- •15. Сортировка обменами, шейкерная сортировка.
- •16.Сортировка выбором.
- •17. Сортировка подсчетом. (Требуется проверка)
- •18. Быстрая сортировка Хоара.
- •19. Карманная сортировка, поразрядная сортировка.
- •20. Турнирная сортировка.
- •21. Пирамидальная сортировка.
- •22. Внешняя сортировка, прямое слияние, естественное слияние.
- •23. Алгоритмы поиска в тексте.Прямой поиск, алгоритм Рабина-Карпа
- •24. Алгоритмы поиска в тексте, алгоритм Боуера-Мура.
- •25. Файловые структуры данных. Классификация файлов. Индексные файлы. Инвертированные списки.
5.Нотации алгебраических выражений.
Существует 3 нотации записи алгебраических выражений:
инфиксная: (2 + 2) * 2= 8
префиксная (польская нотация): * + 2 2 2= 8
постфиксная (обратная польская нотация): 2 2 + 2 * = 8
Инфиксная нотация понятна человеку. В то же время, машине ее трудно обработать (из-за скобок). Поэтому для вычисления алгебраических выражений их обычно преобразуют из инфиксной в префиксную или в постфиксную нотацию.
Вычисление с помощью постфиксной нотации гораздо проще и эффективнее префиксной нотации, и потому часто используется на практике.
Преобразование из инфиксной в постфиксную форму происходит с помощью алгоритма Дейкстры.
число в результирующую строку
оператор в стек
Выталкиваем в выходную строку из стека все операторы, имеющие приоритет выше рассматриваемого;
открывающую скобку в стек
закрывающая скобка переносит операторы (до первой открывающей скобки) в результирующую строку
Вычисление постфиксной нотации:
число - заносим в стек
бинарный оператор - убираем 2 элемента из стека, выполняем операцию, результат заносим в стек.
унарный оператор - убираем 1 элемент из стека, выполняем операцию, результат заносим в стек.
последнее значение является решением выражения
6. Поиск в линейных структурах данных (последовательный поиск, барьеры, бинарный поиск, метод интерполяций)
линейный поиск всем итак понятен.
Барьерный поиск - улучшение линейного поиска. вместо лишней проверки не вышли ли мы за границы массива добавляется “барьер” равный искомому элементу в конец массива. Если мы в него уперлись, то мы проверяем не является ли этот барьер - искомым элементом.
Бинарный поиск работает только для сортированных массивов. Ищем элемент в середине. Если он найден, то возвращаем индекс. Если элемент меньше искомого, ищем в левой половине массива, иначе в правой.
Интерполяционный поиск похож на бинарный. Он тоже работает только для сортированных массивов. Быстро работает при равномерном распределении данных. Медленнее всего работает если каждый элемент растет экспоненциально
int search_linear(int* arr, int size, int elem) {
for(int i = 0; i < size; ++i)
if(arr[i] == elem)
return i;
return -1;
}
int search_barrier(int* arr, int size, int elem) {
if(size > 0) {
int last = arr[size - 1];
arr[size - 1] = elem; // гарантируем существование элемента elem
int i = 0;
for(i = 0; i != elem; ++i) {} // обходим массив
arr[size - 1] = last;
if(i != (size - 1) || elem == last) // не уткнулись в барьер
// или последний элемент - искомый
{
return i;
}
}
return -1;
}
int search_binary(int* arr, int size, int elem) {
int l = 0; // левая граница
int r = size; // правая граница
while(l <= r) {
int m = l + (r - l) / 2; // срединный элемент
if(arr[m] == elem) return m; //элемент найден
if(arr[m] < x) l = m + 1 //элемент справа
else r = m - 1 // элемент слева
}
return -1
}
int search_interpolation(int* arr, int first, int last, int elem) {
int pos;
if(first <= last && elem >= arr[first] && elem <= arr[last])
{
pos = first + (((double) (last - first) / (arr[last] - arr[first])) * (elem - arr[last]));
if(arr[pos] == elem) return pos;
if(arr[pos] < elem) return search_interpolation(arr, pos + 1; last, elem)
if(arr[pos] > elem) return search_interpolation(arr,first; pos - 1, elem)
}
return -1;
}