Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Infa.docx
Скачиваний:
10
Добавлен:
07.07.2019
Размер:
311.28 Кб
Скачать

Билет 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

  1. – элемент присутствует во множестве, 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. Последовательности

Под последовательностью понимается файл с последовательным доступом.

Последовательность является одним из элементарных способов структурирования. Обычно представляет собой однородную структуру, подобную массиву. Но существенная разница в том, что что у массива число элементов зафиксировано в его определении, а у последовательности – нет. То есть оно может меняться во время выполнения программы. Хотя каждая последовательность в любой момент времени имеет конкретную конечную длину, мы должны считать мощность последовательного типа бесконечной, т.к. нет никаких ограничений на потенциальную длину последовательностей.

Прямое следствие переменной длины – невозможность отвести фиксированный объем памяти под переменные-последовательности. Поэтому память выделяется в ходе выполнения программы, в частности, когда последовательность растет. Таким образом, для работы с последовательностями необходима динамическая схема выделения памяти.

Основное правило работы с последовательностями: доступ к элементам осуществляется строго в порядке их следования, а порождается последовательность присоединением новых элементов к ее концу. Следствие – невозможность прямого доступа к элементам, за исключением того элемента, который доступен для просмотра в данный момент. Это и является главным отличием последовательностей от массивов.

Операции над последовательностями:

  • Чтение текущего элемента

  • Добавление элемента в конец последовательности

  • «Перемотка» в начало

Выводы к предыдущим билетам:

  1. Массивы и записи – структуры, допускающие произвольный доступ к своим элементам. Их используют, размещая в оперативной памяти.

  2. Последовательности используют для работы с данными на внешних носителях, допускающих последовательный доступ.

  3. Необходимо проводить различие между последовательностью как структурой данных и механизмом доступа, подразумевающим определенную позицию в ней.

Билет 8. Линейные списки

Простейший способ связать набор элементов – выстроить их в простой список, т.к. в это случае каждому элементу нужен единственный указатель на следующий за ним элемент.

Линейный список – либо пустой список, либо элемент, ссылающийся на линейный список. Операции с линейным списком:

  • Вставка элемента

Имеется указатель на некий элемент p, нужно вставить элемент q:

  1. после р

  1. до р

Операция вставки элемента в голову списка сразу подсказывает, как такой список можно создать: начиная с пустого списка, нужно повторно добавлять в голову элементы.

  • Удаление элемента

  1. после p:

p.next=q.next; free(q);

  1. до р

переписать информацию из p.next в q.next , удалить p.next;

Операции удаления/вставки занимают время О(1) и не зависят от длины линейного списка. Этим они лучше массивов.

  • Поиск ключа в списке

Доступ к n-ному элементу занимает O(n)

Списки бывают:

  • Однонаправленные

  • Двунаправленные – имеются указатели в обе стороны для каждого элемента

  • Кольцевой список

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]