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

Строки

Графы

В математике графу дается следующее определение: графом называется пара множеств (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 В представлении с хранимой длиной дополнительно к самой строке хранится её длина (как правило, в первом байте). Такое представление достаточно удобно с точки зрения вычисления длины строки и обращения к её элементам. Недостаток: если для хранения длины выбрать 1 байт, нельзя хранить строки длиннее 255 символов, а если, например, 4 байта, то для небольших строк накладные расходы на хранение длины могут оказаться существенными. Это представление используется в языке Turbo Pascal и его потомках.

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: