Искусство программирования на Си (984073), страница 45
Текст из файла (страница 45)
Если размер целых чисел игра "Жизнь Конная" представляет собой спсцифичсснять код, оазработанныи для разреженных матриц. Это режсииой матрице. сасгш ~яст 4 байта и длина указателей составляет столько кую задач> в области клеточных автоматов, в настоящем делает код очень сложным для понимания и модифи- же, цчда требуемый дополнительный объем памяти со- разлсле буд>т рассмотрены некоторые лругис, более Оряанимяция дацньо ! Часть () Ра лреяеяцяая матрица Глава 15 Направленные графы могут быть представлены в области лишь очень немногие ячейки булут содержать Целесообразные операции Метод Гаусса — это ллетод решения системы )л( ли- виде дв>мерной разреженнои матрицы (одно измерение значения.
В общем случае ланныс будут группировазь- нейных алгебраических уравнений с )Ч неизвестными. для отправной точки связи, а второе — для ес конечной ся вокруг основных районов стока воды в озеро или в Кроме структуо данных, хаоактерных лля опоелслснно( ' ° УктУР ' о " ° В этой главе не будет рассматриваться исключение ме- точки), в кюкдом измерении которой содержатся назва- реку.
го твпа залачи, существуют операции, которые сами по У У Р Р да Гау ния городов. Другими словами, строки б>дуг отправной Эффект сгруппироаанности данных чрезвычайно ссбс могут оправдать использование разреженной мат- Поскольку одним из многочисленных приложений точкой пути, а столбцы — конечной его точкои. Вес пути важен лля такого типа картографирования. Кроме того, овцы.
Очевидно, что функции для работы со стандарт- Р * " Р Р разреженной матрицы является решение систем уравне- (или расстояние между городами) будет предсгзалсн зна- очень важно иметь возможность просмотреть обласп, ныон массивами, которые характерны и для разрсжсн- Р Р Р Р Р ний, важно иметь возможность эффективно хранить и чением, храняшимся в узле разреженной матрицы. волосбора и определить основные источники воды, что нои матрицы, являются целесообразными операциями.
выполнять операции над диагональными и мономиазьМаршруты между городами являются направленны- упростит охрану водной среды или позволит сяедить за В настоящем разделе рассмотрены и другие цслесооб- Р т)' РУ ' ными мззрггцами. ра.шые операции. мн за счет расположения городов в разных измерениях состоянием водосбора. Используя разреженную струк- (строка, столбец).
Каждый город считается упорядочен- т>ру, ллохгно вычислить плотность отдельнь~х групп и ной парой, вследствие чего обрашение к маршруту (Го- определить объемы волы на территории большой пло- Основные операции нал матрицами включают сложе- род 4, Город 2) не обязательно дает то же значсш1е, что шали, не выполняя вычислений с учасэсм ячеек, в ко- Облод графа начиная с извес~ной точки и поиск извесние, вычитание, умножение, обрашенис и прсобразова- (Город 2, Город 4). В нашем примере маршрут (Город 4. >орых сток воды ото>тсзв»ет ние к ступенчатой форме (которос выполняется с помо- Горол 2) равен )4, а вызов (Город 2, Город 4) вообше даст ошибку (нет такого маршрута). Поскольку в разреженной матрице довольлю легко Графы, которые содержат опрелслснный тип многосвязкоторыс используются лля работы с графами, и, кроме ря на сложность реализации разреженной матрицы.
Все увеличить размер каждого измерения (лобавнть или ных узлов, также удобно прслставлять в виде разрсжснтого, в заголовке разреженной матрицы хранится ин- Р Р ' Р Р указанные операции рассмотрены в главе!К убрать города) и матрица нс содержи~ ланных о ком- ных лштриц. Если люжно считать, что граф имеет по- форчация о начальной и конечной точках. В случае Помимо указанных станлартных операций, выполнаправленного лРафа выполнить обход очень пР(атом, Оргини тцнн ааннег $Щ Часть Н Разренгеннан татр ца ЯЯЦЯ Глава 15 лителя матрицы, относится к разряду сложных.
В дсй- Если по какой-либо причине необходимо нанти "ну- являстся более сложной, а упростить ее можно без осо- Номера ошибок и их описания приведены в файле ствительности вычисление определителя включает пе- лепыс" значения, т.е. значения О, то для выполнения был усилий. Так что пристегните ремни, мы начинаем! арагае.й, который находится на %еЬ-сайте издательства рсмножение значений, связанных по диагонали (в двух такой операции разреженная матрица оказывается нс Поскольку, как правило, выделение памяти проис- "ДиаСофт". измерениях). В разреженной матрице нет связей по самой лучшей структурой представления ленных. Это ходит динамически, необходимо иметь функции, кото- Указатели стека будут рассмотрены в последующих диагонали, поэтому определение значений, находящих- справедливо по целому ряду причин, из которых мы рыс бы могли высвобождать выделенную ранее память разделах.
ся на диагонали, достаточно сложно н требует много рассмотрим лишь несколько: перед очередным выделением памяти пол указатели на разреженную мазрицу. Поэтому в данном разделе будет ПОСТРОЕНИЮ ЗВГОЛОВОЧНЫХ СПИСКОВ ° Если данные разрежены, результат поиска "нулеиагональные ма ицы соде жат значения только на рассмотрен вопрос создания и удаления компонентов вых" значений будет давать большее значение, чел1 В разреженной матрице заголовочный список исполь- свое иагонали. чем же азница по с авнснию с про- разоеженной матоиша.
размер самой разреженной матрицы, по которой про- зуется для задания компонентов измерения. Для каж- сто разреженной матрицей? Диагональная матрица со- изводи ся поиск! СтРУктУРа ланных длЯ саман РазРеженнои матРицы дого измерения имеется заголовочный список, и каж- дсржит только одно ненулевое значение в каждой паре п оста и не з еб ет объяснений: Р 7 у дый такой список может иметь любое требуемое ° Поиск "нулевых- значений означает, что необходистрока/столбец.
Это позволяет легко распознать диагоеурегзея пегасе арагее ааггв» ( количество компонентов. Каждый компонент заголовоч- нальную матрицу, даже несмотря на то, что значения мо будет интерполнровать позиции внутри разревр ввв вьвмвмг ьвдг псас«; с ложены по диагонали. Но это не относится к вы- женной матрицы, котореле находятся между сушегпс еггог по, В стандартных массивах элементы являются целы- числению определителя матрицы, когда диагональные ствуюшими позициями. Это довольно сложный и .еЗзаепагопв, утомительный процесс программирования, в кото- ми числами от О до величины "длина измерения — П. элементы умножаются в определенном порядке. Так, например, трехмерный стандартный массив с чеРом можно наделать много ошибок.
Все эти операции требуют многократного прохожтырьмя элементами в каждом измерении объявляется дания массива данных, и ни одна из них нс получает ° Поиск необходимо проводить как по узлам, так и по Здесь бег вГаск указывает не на один указатель заследующим о разом: б никакого преимущества от того, что в массиве имеются заголовкам, поскольку могут отсутствовать целые головочного списка, а на стек указателей заголовочно- Ор:аннзаянн данных )у(ЕЬе пагггх.еггог по )= Яр Всддя) е1ае е1ве разделенная натаяла часть и Глава хз недостатки.
Поскольку память вьщеляется динамичес- скольку основополагающим принципом разреженной ки, существует вероятность того, что используемая па- матрицы является небольшое количество ланных по урггпеу(ведегг, ' ар атее Ьеадег ) рвъз Вггог Ъд оп геппеве уог дгпепв1пп Ьеае)ег Ъдп мять не будет высвобождена требуемым образом, что сравнению с доступным для них пространством, исехзе(паеггх.еггог по); приведет к ее утечке. Кролзе того, необходимо будет пользование в заголовочных списках двусвязных списотслеживать возвращаемые значения всех функций, ков представляется особенно целесообразным. которые могут использоваться для выделения памяти, Использование олносаязных списков может значина случай, сели объем памяти недостаточен или вьще- тельно сократить требования к дополнительной памяГргупгг(аедопг, ио ха1пев спггепе1у гп гье врагве лагг) хп ); ление памяти проходит неудачно по какой-либо другой ти.
Тем не менее, в общем случае требуемый объем допричине. Поэтому описанный выше тип данных разре- полнитсльной памяти составляет незначительную часть женной матрицы включает поле ошибки, значение ко- от объема памяти, занимаемого ланными, да;ке при торо~о устанавливается в случае возникновения ошиб- использовании двусвязных списков. И хотя двусвязныс Грггпег(агдопе, Бпссеаауп11у геег1езед Еье Ьеадег гог дгпепвгоп Хд" Гье Дгпепадоп)Г ки при работе с элементами матрицы. Каждая функция списки усложняют сопровождение каждого списка, лучпсрсд началом работы лолжна обнулить поле ошнбюь ше сразу рассмотреть более сложный случаи; его упрочтобы предотвратить возвращение номера ошибки, воз- шенис оставляю вам в качестве задания для самостояникзпсй при выполнении прсдылушсй функции.
тельной г!)зо)заботки. Односввзные или двусввзные списки? Добавление новых измерений Обычно вызывать эту функцию напрямую не гребу- Это можно сделать, вставив перел объявлением ется, но она часто используется в библиотеке функций стрултуры ВР НЕАВЕВ ВАТА пользователя следую- В этой рсатизации разреженной мазрицы используют- Перед вставкой ланных в разреженную матрицу можно Ретро>теииаоиатреецо Глава 15 Ореаишациа давних Часть 11 Присоединение Получить заголозочлзей список для требуемого ) измерении Присоединение элемента заголовочною списка к лву данта в заголовочном списке требуеммй связному списку — это то жс самос, что вставка элемен- порядховмв номер о16 Ьеабег->ргеч1опз->лент = о1б Ьеабег->пехх) та в лвусвязный список.