КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Представление структур в памяти ЭВМ
Как же реально представить в памяти структуру данных того или иного типа? Обычно для однородных массивов постоянной длины используют последовательное представление. В этом случае логически смежные элементы массива размещаются в физически смежных ячейках памяти. Последовательное представление нетрудно распространить и на массивы более высокой размерности, располагая в последовательных ячейках памяти элементы массива в лексикографическом порядке индексов (i1,i2,..., ik). Например, если в случае двумерного массива через i1 обозначим номер строки, а через i2—номер столбца, то массив окажется расположенным в памяти по строкам. Для представления одномерного массива с элементами данных переменной длины можно или сделать их длину постоянной (из расчета на максимальную длину), добавив в конце каждого элемента особый символ — признак конца данного, или в начало каждого элемента ввести поле для хранения текущей длины данного. В последнем случае утрачивается возможность произвольного доступа, и каждый раз при необходимости извлечения одного элемента приходится прослеживать всю последовательность по порядку, начиная с первого. Поэтому лучше подготовить отдельно одномерный массив указателей, содержащий адреса размещения каждого элемента. Этот метод применим для любых многомерных массивов с элементами переменной длины и сводится к подготовке массива указателей соответствующей мерности. В случае периодического изменения числа элементов (массивов переменной длины) необходимо использовать более гибкое представление, которое рассмотрено ниже. Можно образовать кольцо, используя для этого одномерный массив постоянной длины, при обращении к элементам которого как только будет достигнут один конец массива, сразу же переходить к другому концу. На базе кольца очень просто реализовать очередь или двустороннюю очередь. Если поддерживается баланс по числу операций включения и исключения элементов очереди, то ячейки памяти, занятые очередью, последовательно перемещаются в направлении включения новых элементов. Для представления стека можно воспользоваться одномерным массивом, ограничив доступ к элементам единственным индексом, указывающим на вершину стека в данный момент. Нулевое значение индекса означает, что стек пуст.
Если для представления стеков и очередей использовать массивы с малым числом элементов, то очень велика вероятность их переполнения. Увеличение длины массивов не только ухудшает использование памяти, но и не гарантирует от переполнения. Если использовать массивы такой длины, чтобы исключить возможность их переполнения, то часть памяти, действительно занятая данными, окажется совсем небольшой. Еще большим недостатком является то, что обработка будет прекращена, как только переполнится хотя бы один массив, отведенный под стек, несмотря на наличие достаточного объема свободной памяти в других массивах. Естественно, возникают вопросы: нельзя ли всю незанятую память, отведенную для представления массивов переменной длины, использовать как общую; как это скажется на эффективности использования памяти?
Рис. 2.3. Представление кольца и очереди с использованием указателей (представление в связанной памяти): а — кольцо; б — исключение из кольца (включение в кольцо). При исключении сплошная стрелка заменяется на пунктирную, а при включении — пунктирная на сплошную; в — двусторонняя очередь Эту проблему можно решить путем придания памяти определенной структуры, связав между собой отдельные блоки (узлы) памяти с помощью указателей. Рис. 2.3а иллюстрирует идею связанного представления на примере кольца. Прямоугольниками на рисунке показаны узлы памяти. Каждый узел состоит из двух полей. Одно поле содержит элемент или более сложную структуру данных, а другое — указатель на следующий узел. Стрелки на рисунке соответствуют значениям указателей. Если последовательность представлена в связанной памяти, то операции включения и исключения элементов в последовательность выполняются так, как показано на рис. 2.3.б. Обе операции используют список свободной памяти—при включении память занимается, а при исключении возвращается в этот список. В любом случае происходит изменение трех указателей. При этом из схемы на рис. 2.3.б следует, что при заданном указателе на узел, содержащий данное S, операции включения и исключения возможны только «справа от S» и невозможны «слева от S». Операция «исключить S» также невозможна. Одним из способов, позволяющих преодолеть эти ограничения, является использование в каждом узле двух указателей, что будет рассмотрено ниже. В этом случае станет возможным производить включение и исключение справа и слева от S. Возможен и другой технически простой прием. При необходимости «исключить узел S» перепишем в него данные узла, находящегося справа от S (данное Т), а затем исключим узел справа (фактически будет исключен узел, следующий за S, — узел, первоначально содержавший данное Т). Аналогично может быть выполнена и операция «включить слева от S». Для этого вначале включим новый узел справа от S и перепишем в него данное S, затем запишем новое данное в узел, который прежде занимало данное S, и, наконец, передвинем указатель доступа к структуре на узел, который теперь содержит данное S.
Представление в памяти двусторонних очередей должно обеспечить возможность доступа с обоих концов очереди. Это может быть достигнуто использованием в каждом узле двух указателей, как показано на рис. 2.3.в. В этом случае операции включения и исключения потребуют изменения пяти указателей. Одномерный массив с возможностью его свободного изменения называется списком. Считается, что списки обеспечивают эффективное использование памяти. Надо помнить, что для хранения указателей требуется дополнительная память, а для работы с указателями—дополнительные операции.
Основной смысл применения указателей заключается не столько в повышении эффективности обработки, сколько в возможности представления более сложных структур. Использование указателей позволяет связывать между собой самые разнообразные данные, что является основой представления различных самых сложных структур, механизмов, явлений. Среди них особое место занимают сравнительно простые, но очень важные древовидные структуры. Например, если для представления узлов бинарного дерева использовать записи с двумя указателями, как показано на рис. 2.4, то можно производить обход дерева начиная от корня в направлении концевых узлов. Операции исключения или включения листа (концевого узла) выполняются очень просто—изменением всего трех указателей. В математике одним из базовых понятий является множество. В области обработки данных операции над множествами часто также весьма желательны. Однако представление в памяти множества, не имеющего структуры, представляет значительную проблему, и обычно стараются обходиться без них. Пусть, например, в трехмерном пространстве задано конечное множество, состоящее из n точек. Как представить это множество в памяти, чтобы иметь возможность выполнять соответствующие операции? Если число элементов множества постоянно и все элементы заранее известны — перенумеруем их числами от 1 до n. Сами элементы множества—координаты точек (Хi, Yi, Zi) (i= 1,2,..., п)— будем хранить в матрице из (nхЗ) элементов. Тогда для представления любого подмножества этого множества можно воспользоваться одномерным массивом из п битов (p1, р2,..., рn ), присваивая P i (i-му биту) значение 1, если точка с номером i принадлежит подмножеству, и 0, если не принадлежит. Такой логический массив обычно называют битовой картой. Операции над множествами в таком случае сводятся к логическим операциям над соответствующими логическими массивами.
Рис. 2.4. Представление бинарного дерева с использованием указателей.
Если элементы множества заранее не известны, представление в виде битовой карты становится невозможным. Такая ситуация возникает, например, когда элементы множества задаются при вводе или формируются в процессе вычислений и передаются во внешнюю память. В этом случае приходится хранить описание каждого элемента (обычно в виде записи), действительно присутствующего в этом множестве, но теперь операции над множествами потребуют поэлементного их просмотра. Например, для операции пересечения надо будет сравнивать каждый элемент одного множества со всеми элементами другого.
Дата добавления: 2014-12-16; Просмотров: 1234; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |