Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СД.doc
Скачиваний:
212
Добавлен:
19.03.2015
Размер:
1.81 Mб
Скачать

3 A b d 8 p q r s t u V w

Рис. 5.5. Представление строк переменной длины со счетчиком.

В двух предыдущих вариантах обеспечивалось максимально эффективное расходование памяти (1-2 «лишних» символа на строку), но изменчивость строки была крайне невысока. Поскольку вектор – статическая структура, каждое изменение длины строки требует создания нового вектора, пересылки в него неизменяемой части строки и уничтожения старого вектора, что сводит на нет преимущества работы со статической памятью. Поэтому наиболее популярным способом представления строк в памяти являются вектора с управляемой длиной.

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

Размер строки может изменяться от 0 до значения максимального индекса вектора. «Лишняя» часть отводимой памяти может быть заполнена любыми кодами – она игнорируется. Поле конечного индекса может быть использовано для контроля превышения строкой объема отведенной памяти. Представление строк в виде вектора с управляемой длиной (при максимальной длине 10) показано на рис. 5.6.

Хотя такое представление строк не обеспечивает экономии памяти, проектировщики систем программирования, как видно, считают это приемлемой платой за возможность работать с изменчивыми строками в статической памяти.

Рис. 5.6. Представление строк вектором с управляемой длиной.

Символьно-связное представление строк. Списковое представление строк в памяти обеспечивает гибкость в выполнении разнообразных операций над строками (операций включения и исключения отдельных символов и целых цепочек) и использование системных средств управления памятью при выделении необходимого объема памяти для строки. Однако при этом возникают дополнительные расходы памяти. Другим недостатком спискового представления строки является то, что логически соседние элементы строки не являются физически соседними в памяти. Это усложняет доступ к группам элементов строки по сравнению с доступом в векторном представлении строки.

Однонаправленный линейный список. Каждый символ строки представляется в виде элемента связного списка. Элемент содержит код символа и указатель на следующий элемент (рис. 5.7). Одностороннее сцепление представляет доступ только в одном направлении вдоль строки. На каждый символ строки необходим один указатель, который обычно занимает 2-4 байта.

A

B

D nil

Рис. 5.7. Представление строки однонаправленным связным списком.

Двунаправленный линейный список. В каждый элемент списка добавляется указатель на предыдущий элемент (рис. 5.8). Двустороннее сцепление допускает двустороннее движение вдоль списка, что может значительно повысить эффективность выполнения строковых операций. При этом на каждый символ строки необходимо два указателя, т.е. 4-8 байт.

nil A

B

D nil

Рис. 5.8. Представление строки двунаправленным связным списком.

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

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

В процессе обработки строки из любой ее позиции могут быть исключены или в любом месте вставлены элементы, в результате чего звенья могут содержать меньшее число элементов, чем было первоначально. По этой причине необходим специальный символ, который означал бы отсутствие элемента в соответствующей позиции строки. Обозначим такой символ 'emp', он не должен входить в множество символов, из которых организуется строка. Пример многосимвольных звеньев фиксированной длинны по 4 символа в звене показан на рис. 5.9.

Представление обеспечивает более эффективное использование памяти, чем символьно-связное. Операции вставки/удаления в ряде случаев могут сводиться к вставке/удалению целых блоков. Однако при удалении одиночных символов в блоках могут накапливаться пустые символы emp, что может привести даже к худшему использованию памяти, чем в символьно-связном представлении.

A B D emp nil

P Q R S

T U V W nil

Рис. 5.9. Представление строки многосимвольными звеньями постоянной длины.

Многосимвольные звенья переменной длины. Переменная длина блока дает возможность избавиться от пустых символов и экономить память для строки. Однако появляется потребность в специальном символе – признаке указателя (на рис. 5.10 он обозначен символом 'ptr').

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

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