- •Билет 1. Типы и структуры данных
- •Диапазонные
- •Статические
- •Динамические
- •Перечислимые
- •Предопределенные
- •Билет 2. Простые типы. Операции. Типизация.
- •Билет 3. Массивы
- •Билет 4. Записи
- •Билет 5. Объединения
- •Билет 6. Множества
- •Билет 7. Последовательности
- •Билет 9. Стеки
- •Билет 10.Очереди
- •Линейный список, сложность операции o(1)
- •Билет 11. Динамические структуры данных.
- •Билет 12. Деревья. Общие определения
- •Билет 13. Двоичные деревья
- •Билет 14. Деревья поиска
- •Билет 15. Авл-сбалансированные деревья
- •Билет 16. Б-деревья
- •Билет 17. Дб- и сдб-деревья.
- •Билет 18. Характеристики сбалансированных деревьев.
- •Билет 19. Дерево оптимального поиска.
- •Билет 20. Splay-дерево
- •Splay (расширение)
Билет 5. Объединения
Объединение можно рассматривать как структуру, все элементы которой имеют нулевое смещение от ее начала. При таком размещении разные элементы занимают в памяти один и тот же участок, и изменение одного элемента влечет за собой изменение всех остальных.
union имя{ T1 s1; T2 s2; … ; Tn sn; };
sizeof(union)=max_size of Ti
#union = #max Ti (сумма #Ti)
Операции над объединениями:
Индексация
Присваивание (memcpy)
Извлечение адреса.
Объединения не могут быть присвоены, переданы функциям или возвращены ими. Указатели объединений можно использовать в точно такой же манере, как и указатели структур.
Обращение к элементу объединения осуществляется так же, как и в структурах:
A.name
(*A).name
(*A) -> name
Смысловое отличие объединения от структуры состоит в том, что записать информацию в объединение можно с помощью одного из его элементов, а выбрать данные из этого же участка памяти можно с помощью другого элемента этого же объединения.
Билет 6. Множества
Множество основывается на базовом типе: T: set of Tbase
#set = 2#Tbase
sizeof(set)= #Tbase/8
Операции над множествами:
Проверка на вхождение элемента в множество: a in B. Возвращает 1, если а есть в В, 0 в противном случае.
Присваивание – можем присвоить одно множество другому
Сравнение: ==, !=, проверка на включение множества во множество – аналог <=
Объединение
Пересечение
Вычитание
В множествах нет (!!!) индексации
Представление множеств:
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
– элемент присутствует во множестве, 0 – не присутствует
Множество s удобно представлять в памяти компьютера его характеристической функцией C(s) – массив логических значений, чья i-я компонента означает, что i присутствует в s. Представление множеств характеристическими функциями имеет то преимущество, что операции вычисления, объединения, пересечения и разности двух множеств могут быть реализованы как элементарные логические операции. Суждения, связывающие логические операции с операциями на множествах:
i in (x+y) = (i in x)||(i in y)
i in (x*y) = (i in x)&&(i in y)
i in (x-y) = (i in x)&&!(i in y)
Как следствие множества должны использоваться только с небольшими числами в качестве элементов, из которых наибольшее не должно превосходить длины компьютерного слова (-1).
Билет 7. Последовательности
Под последовательностью понимается файл с последовательным доступом.
Последовательность является одним из элементарных способов структурирования. Обычно представляет собой однородную структуру, подобную массиву. Но существенная разница в том, что что у массива число элементов зафиксировано в его определении, а у последовательности – нет. То есть оно может меняться во время выполнения программы. Хотя каждая последовательность в любой момент времени имеет конкретную конечную длину, мы должны считать мощность последовательного типа бесконечной, т.к. нет никаких ограничений на потенциальную длину последовательностей.
Прямое следствие переменной длины – невозможность отвести фиксированный объем памяти под переменные-последовательности. Поэтому память выделяется в ходе выполнения программы, в частности, когда последовательность растет. Таким образом, для работы с последовательностями необходима динамическая схема выделения памяти.
Основное правило работы с последовательностями: доступ к элементам осуществляется строго в порядке их следования, а порождается последовательность присоединением новых элементов к ее концу. Следствие – невозможность прямого доступа к элементам, за исключением того элемента, который доступен для просмотра в данный момент. Это и является главным отличием последовательностей от массивов.
Операции над последовательностями:
Чтение текущего элемента
Добавление элемента в конец последовательности
«Перемотка» в начало
Выводы к предыдущим билетам:
Массивы и записи – структуры, допускающие произвольный доступ к своим элементам. Их используют, размещая в оперативной памяти.
Последовательности используют для работы с данными на внешних носителях, допускающих последовательный доступ.
Необходимо проводить различие между последовательностью как структурой данных и механизмом доступа, подразумевающим определенную позицию в ней.
Билет 8. Линейные списки
Простейший способ связать набор элементов – выстроить их в простой список, т.к. в это случае каждому элементу нужен единственный указатель на следующий за ним элемент.
Линейный список – либо пустой список, либо элемент, ссылающийся на линейный список. Операции с линейным списком:
Вставка элемента
Имеется указатель на некий элемент p, нужно вставить элемент q:
после р
до р
Операция вставки элемента в голову списка сразу подсказывает, как такой список можно создать: начиная с пустого списка, нужно повторно добавлять в голову элементы.
Удаление элемента
после p:
p.next=q.next; free(q);
до р
переписать информацию из p.next в q.next , удалить p.next;
Операции удаления/вставки занимают время О(1) и не зависят от длины линейного списка. Этим они лучше массивов.
Поиск ключа в списке
Доступ к n-ному элементу занимает O(n)
Списки бывают:
Однонаправленные
Двунаправленные – имеются указатели в обе стороны для каждого элемента
Кольцевой список