
- •IV Алгоритмы, структуры данных и программирование
- •1. Понятие информационной системы. Основные задачи курса, простейшая задача поиска. Эффективность решения задач поиска для простейшего случая.
- •2. Двоичный поиск, оценка эффективности и её обоснование. Программа bin_search и её особенности.
- •3.Бинарное дерево поиска, особенности его построения. Примеры.
- •4. Структура данных дерево(не обязательно бинарное). Кодировка в виде списковой структуры. Бинарное дерево поиска, длина ветви, баланс вершины.
- •5. Операции над бинарными деревьями поиска: вставка, удаление вершины и др. Операции.
- •7. Быстрая сортировка и её особенности. Эффективность.
- •8. Операции над бинарными деревьями поиска. Симметричный, прямойи обратный
- •9. Хеширование. Эффективность хеширования.Схема закрытого хеширования.
- •Закрытое хэширование или Метод открытой адресации – это технология разрешения коллизий, которая предполагает хранение записей в самой хэш-таблице.
- •11. Графы. Реализация представления структуры графа. Списочное и матричное представление графов. (http://school29.Smoladmin.Ru/arbuzov/vvedenie.Html)
- •12. Динамические структуры данных. Связные списки. Односвязные списки. Кольцевой односвязный список
- •13. Деревья. Представление деревьев. Бинарные деревья. Сведение m-арного дерева к бинарному. (http://pro-prof.Com/archives/682)
- •Зачем нужны деревья?
- •Заключение:
- •15. Алгоритм создания дерева бинарного поиска. Прохождение бинарных деревьев.
- •Infix_traverse ( f ) — обойти всё дерево, следуя порядку (левое поддерево, вершина, правое поддерево). Элементы по возрастанию
- •16. Алгоритм Дейкстры.
- •17. Динамические структуры данных. Стек. Процедуры создания, удаления.
- •18. Динамические структуры данных. Очередь. Процедуры создания, удаления.
- •Применение очередей
- •Формирование очереди
- •Алгоритм удаления первого элемента из очереди
- •19. Динамические структуры данных. Дек. Процедуры создания, удаления.
- •Типовые операции
- •20. Дважды связные списки (понятия, операции, использование).
- •21. Алгоритмы обхода бинарных деревьев
- •22. Основное дерево минимальной стоимости. Алгоритм Прима, Крускала. Поиск в ширину, в глубину.
- •Вход: Связный неориентированный граф g(V,e) Выход: Множество t рёбер минимального остовного дерева
- •23. Трудоемкость алгоритмов: наилучший случай, наихудший случай, трудоемкость в
- •24. Принцип «Разделяй и властвуй». Примеры решения задач с использованием данных методов и их трудоемкость.
- •25. Основные структуры данных. Множества. Массивы. Записи.
- •26. Алгоритмы поиска. Линейный поиск.
- •27. Поиск делением пополам (двоичный поиск).
- •28. Прямой поиск строки.
- •Алгоритм прямого поиска
- •29. Алгоритм Кнута, Мориса и Пратта.
- •Постановка задачи
- •Префикс-функция. Определение
- •30. Алгоритм Боуера и Мура
- •10.1. Основные понятия сортировки
- •10.2. Оценка алгоритмов сортировки
- •10.3. Классификация алгоритмов сортировок
- •32. Внутренняя сортировка и ее виды.
- •Алгоритм и особенности этой сортировки таковы:
- •36. Сортировка вставками
- •Псевдокод
- •Псевдокод
- •Пример[править | править исходный текст]
- •38. Динамические структуры данных. Указатели. Динамическое выделение памяти.
- •Типы указателей, описание указателей
- •Пример использования типизированного указателя.
- •39. Понятие рекурсии. Рекурсивные
- •40. Динамический тип данных – список. Определение. Основные понятия.
- •Однонаправленные (односвязные) списки
- •41. Основные операторы для работы со списками. Способы реализации списков.
- •42. Методы ускорения доступа к данным. Хеширование и его варианты.
Применение очередей
Очередь в программировании используется, как и в реальной жизни, когда нужно совершить какие-то действия в порядке их поступления, выполнив их последовательно. Примером может служить организация событий в Windows. Когда пользователь оказывает какое-то действие на приложение, то в приложении не вызывается соответствующая процедура (ведь в этот момент приложение может совершать другие действия), а ему присылается сообщение, содержащее информацию о совершенном действии, это сообщение ставится в очередь, и только когда будут обработаны сообщения, пришедшие ранее, приложение выполнит необходимое действие.
Формирование очереди
Формирование очереди состоит из двух этапов: создание первого элемента, добавление нового элемента в конец очереди.
Создание первого элемента очереди
Этот этап заключается в создании первого элемента, для которого адресная часть должна быть нулевой (^ NULL). Для этого нужно:
1) ввести информацию для первого элемента (целое число i);
2) захватить память, используя текущий указатель:
t = (Spis*) malloc(sizeof(Spis)); или t = new Spis;
в результате формируется конкретный адрес (^ А1) для первого элемента;
3) сформировать информационную часть:
t -> info = i; (обозначим i1 )
4) в адресную часть занести NULL:
t -> Next = NULL;
5) указателям на начало и конец очереди присвоить значение t:
begin = end = t;
На этом этапе получим следующее:
Добавление элемента в очередь
Рассмотрим алгоритм добавления только для второго элемента.
1. Ввод информации для текущего (второго) элемента – значение i .
2. Захватываем память под текущий элемент:
t = (Spis*) malloc (sizeof(Spis)); или t = new Spis;
3. Формируем информационную часть (обозначим i2):
t -> info = i;
4. В адресную часть созданного элемента (текущего) заносим NULL, т.к. этот элемент становится последним:
t -> Next = NULL;
5. Элемент добавляется в конец очереди, поэтому в адресную часть бывшего последнего элемента end заносим адрес созданного:
end -> Next = t;
бывший последний элемент становится предпоследним.
6. Переставляем указатель последнего элемента на добавленный:
end = t;
В результате получим
Для добавления в очередь любого количества элементов организуется цикл, включающий пункты 1– 6 рассмотренного алгоритма. Завершение цикла реализуется в зависимости от поставленной задачи.
Обобщим рассмотренные этапы, тогда функция формирования очереди из данных объявленного типа с добавлением новых элементов в конец может иметь следующий вид:
void Create(Spis **begin, Spis **end) {
Spis *t = (Spis*) malloc(sizeof(Spis));
printf(“\n Input Info ”);
scanf(“%d”, &t -> info);
t -> Next = NULL;
if(*begin == NULL) // Формирование первого элемента
*begin = *end = t;
else {
(*end) -> Next = t; // Добавление в конец
*end = t;
}
}
Алгоритм удаления первого элемента из очереди
Предположим, что очередь создана, т.е. begin не равен NULL (рекомендуется организовать проверку на равенство NULL с соответствующей обработкой данной ситуации).
1. Устанавливаем текущий указатель на начало очереди: t = begin;
2. Обрабатываем информационную часть первого элемента очереди, например, выводим на экран.
3. Указатель на начало очереди переставляем на следующий (2-й) элемент
begin = begin->Next;
4. Освобождаем память, захваченную под 1-й элемент: free(t);
5. Выводим сообщение, например, «Элемент удален!».