- •1. Типы данных
- •2. Стандартные типы пользователя
- •3. Структуры данных
- •4. Классификация структур данных
- •Векторы
- •5. Записи и таблицы.
- •34. Сортировка методом прямого включения
- •6. Понятие списковой структуры. Стек.
- •7. Очередь.
- •Insert (q, X)
- •8) Пример работы с очередью с использованием стандартных процедур.
- •9.Кольцевые полустатические очереди. Операции над кольцевой очередью
- •10. Понятие Динамических структур данных. Организация односвяз. И двусвяз. Списков. Простейшие операции над односвяз списками
- •11. Реализация стеков с помощью (односвязных) списков
- •12. Смысл и организация операций создания и удаления элемента динамической структуры. Понятие свободного списка и пула свободных эл-ов. Утилизация освободившихся элементов
- •13. Очередь и операции над ней при реализации со связными списками.
- •14. Операции вставки и извлечения элементов из списка. Сравнение этих операций с аналогичными массивами. Недостаток связного списка по сравнению с массивом.
- •1 5. Пример алг реш зад извлечения эл-ов из списка по заданному признаку.
- •16. Пример алг решения зад. Вставки заданных элементов в упорядоченный список.
- •17. Элементы заголовков в списках; нелинейные связные структуры.
- •18. Понятие рекурсивных структур данных. Деревья, их признаки и представления
- •19. Алгоритм сведения m-арного дерева к бинарному; основные операции над деревьями; виды обхода
- •20. Понятие поиска, ключей; назначение и структура алгоритмов поиска
- •21. Последовательный поиск и его эффективность
- •22. Индексно-последовательный поиск
- •23. Переупорядочивание таблиц с учетом вероятности поиска элемента; переупорядочивание путем перестановки в начало списка
- •24) Метод оптимизации поиска путем (Переупорядочивание таблицы) перестановки найденного элемента в начало списка
- •25. Метод транспозиции при оптимизированном поиске (для переупорядочивания таблицы поиска
- •26. Бинарный поиск
- •27. Алгоритм создания упорядоченного бинарного дерева
- •29. Поиск по бинарному дереву с включением
- •33. Сортировка методом прямого выбора
- •30. Поиск по бинарному дереву с удалением
- •28. Эффективность поиска по бинарному дереву
- •31. Алгоритмы прохождения бинарных деревьев
- •32. Понятие сортировки, ее эффективность; классификация методов сортировки
- •35. Сортировка методом прямого обмена (пузырьковая).
- •36. Быстрая сортировка
- •37. Сортировка Шелла
- •38. Сортировка с помощью бинарного дерева
- •39. Сравнительный анализ эффективности методов сортировки
- •40. Нерекурсивный алгоритм обхода дерева в прямом порядке
9.Кольцевые полустатические очереди. Операции над кольцевой очередью
Рис. 2.17
Рассмотрим пример. Предположим, что очередь содержит три элемента - в позициях 3, 4 и 5 пятиэлементного массива. Этот случай, показанный на рис. 2.17. Хотя массив и не заполнен, последний элемент очереди занят.
Если теперь делается попытка поместить в очередь элемент G, то он будет записан в первую позицию массива, как это показано на рис. 2.17. Первый элемент очереди есть Q(3), за которым следуют элементы Q (4), Q(5) и Q(l).
К сожалению, при таком представлении довольно трудно определить, когда очередь пуста. Условие R<F больше не годится для такой проверки, поскольку на рис. 2. 17 показан случай, при котором данное условие выполняется, но очередь при этом не является пустой.
Одним из способов решения этой проблемы является введение соглашения, при котором значение F есть индекс элемента массива, немедленно предшествующего первому элементу очереди, а не индексу самого первого элемента. В этом случае, поскольку R содержит индекс последнего элемента очереди, условие F = R подразумевает, что очередь пуста.
Отметим, что перед началом работы с очередью, в F и R устанавливается значение последнего индекса массива, а не О и 1, поскольку при таком представлении очереди последний
элемент массива немедленно предшествует первому элементу. Поскольку R = F, то очередь изначально пуста.
Основные операции с кольцевой очередью:
Вставка элемента q в очередь x Insert(q,x);
Извлечение элемента из очереди x Remove(q);
Проверка очереди на пустоту Empty(q);
Проверка очереди на переполнение Full(q).
Операция Empty(q)
if F = R
then empty = true
else empty = false
endif
return
Операция Remove(q)
empty (q)
if empty = true
then “пусто”
stop
endif
if F =maxQ
then F =1
else F = F+1
endif
x = q(F)
return
Отметим, что значение F должно быть модифицировано до момента извлечения элемента.
Переполнение очереди происходит в том случае, если весь массив уже занят элементами очереди, и при этом делается попытка разместить в ней еще один элемент.
Исходное состояние очереди
П оместим в очередь элемент G.
Если произвести следующую вставку, то массив становится целиком заполненным, и попытка произвести еще одну вставку приводит к переполнению. Это регистрируется тем фактом, что F = R, то есть это соотношение как раз и указывает на переполнение. Очевидно, что при такой реализации нет возможности сделать различие между пустой и заполненной очередью.
Одно из решений состоит в том, чтобы пожертвовать одним элементом массива и позволить очереди расти до объема, на единицу меньшего максимального. Предыдущий рисунок иллюстрирует именно это соглашение. Попытка разместить в очереди еще один элемент приведет к переполнению.
Проверка на переполнение в подпрограмме insert производится после установления нового значения для R, в то время как проверка на потерю значимости в подпрограмме remove производится сразу же после входа в подпрограмму до момента обновления значения F.
Подпрограмма Insert(q,x) может быть записана следующим образом:
if R = maxQ
then R = 1
else R = R+1
endif
‘проверка на переполнение’
if R = F
then print «переполнение очереди»
stop
endif
q (R) =x
return
Дек
От английского DEQ - Double Ended Queue (Очередь с
двумя концами)
Особенностью деков является то, что запись и считывание элементов может производиться с двух концов (рис. 2.18).
Рис. 2.18.
Дек можно рассматривать и в виде двух стеков, соединенных нижними границами. Возьмем пример, иллюстрирующий принцип построения дека. Рассмотрим состав на железнодорожной станции. Новые вагоны к составу можно добавлять либо к его концу, либо к началу. Аналогично, чтобы отсоединить от состава вагон, находящийся в середине, нужно сначала отсоединить все вагоны или вначале, или в конце состава, отсоединить нужный вагон, а затем присоединить из снова.
Операции над деками:
Insert(d, x) - вставка элемента.
Remove(d) - извлечение элемента из дека.
Empty(d) - проверка на пустоту.
Full(d) - проверка на переполнение.