Константные строки

Строки

Графы

Множества

Множества, графы

Обход дерева

Для выполнения некоторой операции над каждым узлом дерева используются так называемые алгоритмы обхода дерева.

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

Наиболее распространены два способа реализации множеств:

а) на основе бинарного дерева;

б) если размер множества ограничен, то наилучшим решением будет использование массива битов, в котором 1 соотвествует присутствию элемента со значением, соответствующим номеру бита в массиве; в этом случае сложность вставки, удаления и поиска =1, а расходы памяти составляют N/8 байт.

В математике графу дается следующее определение: графом называется пара множеств (V,E), где V - конечное множество элементов, называемых вершинами графа, а E - конечное множество упорядоченных пар e = (A,B), называемых дугами, где A и B - вершины. Говорят, что дуга e выходит из вершины A и входит в вершину B. Вершины А и В называют инцидентными дуге е, а дугу е - инцидентной вершинам А и В.

Структуру графа можно описать, сопоставив каждой вершине множество дуг, выходящих из неё, причем каждая дуга, выходящая из вершины, идентифицируется своим концом - номером вершины, в которую эта дуга входит. Такое описание называют S-графом (set-graph).

Пусть в графе N вершин, а класс Set реализует множество чисел от 0 до N-1, тогда S-граф можно представить следующим образом:

struct SGraph

{

Set vertex[N];

};

Для такого графа достаточно легко реализуется добавление и проверка принадлежности дуг. Задача подсчета количества дуг решается полным перебором всех вершин.

Другим распространенным способом представления графа является представление в виде матрицы смежности размера NxN. В этой матрице в элементе с индексом (i,j) указывается наличие дуги из i в j. Такое представление называют M-графом (matrix-graph). При таком представлении графа может быть указано не только наличие дуги, но и её вес. Недостатком такого представления является большой занимаемый объем памяти. Если число дуг невелико, то размер памяти, занимаемый M-графом будет сущесвенно больше, чем занимаемый S-графом.

struct MGraph

{

char vertex[N][N];

};

Если число исходящих из вершин дуг невелико, их удобно представлять в виде связанного списка. Такое представление называют L-графом (list-graph).

Это такие строки, под которые выделяется единая область памяти, определяемая исходя из длины строки. При переприсваивании значения строки память, как правило, перевыделяется.

Есть два основных представления константных строк.

1 В представлении с хранимой длиной дополнительно к самой строке хранится её длина (как правило, в первом байте). Такое представление достаточно удобно с точки зрения вычисления длины строки и обращения к её элементам, но неэффективно для представления строк длинее 255 символов. Это представление используется в языке Turbo Pascal и его потомках.

Пример: |6|'с'|'т'|'р'|'о'|'к'|'а'|

2. В представлении с символом-терминатором длинна строки отдельно не хранится, а сама строка завершается специальным символом. Если код такого символа 0, то её ещё называют строкой с завершающим нулем. При таком представлении нет ограничения на длину строки (кроме размера непрерывного свободного блока оперативной памяти, конечно), но вычисление длины строки имеет сложность O(N). Также, если по каким-то причинам символ-терминатор будет потерян, это приведет к неприятным последствиям. Такое представление используется в Си-подобных языках.