Лiтература
1. Карашецкий В.П. Расчет коэффициента Картера при наличии магнитного клина в пазу электрической машины методом конечных элементов// Электромеханика: Изв. вузов СССР. - 1988, № 2. - С. 14-19.
2. Никитенко А.Г., Пеккер И.И. Расчет электромагнитных механизмов на вычислительных машинах. - М.: Энергоатомиздат, 1985. - 215 с.
3. Шимони К. Теоретическая электротехника. - М.: Мир, 1964. - 773 с.
УДК 681.3.06 Студ. Ю. Т. Ликтей; доц. Ю.1. Грицюк, канд. техн. наук -
НЛТУ Украти, м. Львiв
ПРОЕКТУВАННЯ РОЗР1ДЖЕНИХ МАСИВ1В ДЛЯ РОБОТИ З ЕЛЕМЕНТАМИ ТОПОЛОГ1ЧНИХ МАТРИЦЬ
Розглянуто питання створення структурованого типу даних - розргджених ма-cueie (sparse arrays) для здшснення ефективно'1 роботи з матрицями великих розмiрiв, у яких значна кшьюсть елеменпв не використовусться. Здатшсть розрщжених маси-BiB оптимiзувати доступ до таких даних робить ix надзвичайно корисними в багатьох задачах, яю виникають пiд час розроблення сучасних програмних продуктiв. До таких задач належить робота з тополопчними матрицями, яю використовуються для вiдображення зв'язюв елементiв у електронних схемах, що асоцiюються з ii кл^ина-ми. Завдяки використанню розрiджених масивiв пам'ять для збер^ання кожно'' з таких кл^ин видiляeться з пули вшьно'1' пам'ятi тiльки в мiру потреби.
Stud. Yu.T. Lyktej, assist. prof. Yu.I. Grytcyuk-NUFWTof Ukraine, L'viv
Organization of disperse an array is for work with the elements of topology matrices
The question of creation of the structured type of information is considered - disperse (sparse arrays) an array for realization of effective work with the matrices of ageneses which the far of elements is not utilized in. To optimize ability of disperse an array access to such information does them extraordinarily useful in many tasks which arise up during development of modern software products. To such tasks work belongs with topology matrices, which are utilized for displaying of connections of elements in electronic charts which are associated with its cages. Due to the use of disperse an array memory is for storage each of such cages selected from pools of free space only to the extent of necessity..
Вступ
Пщ час виконання р1зних шженерних розрахунюв часто доводиться мати справу з так званими розрщженими масивами, значна кшьюсть елемен-т1в яких фактично не використовусться. У середовишд фах1вщв [1, с. 112], робота яких пов'язана з дослщженням розрщжених масив1в, у об1гу широко вживають два термши: лопчний i ф1зичний масиви. Лопчний масив с уяв-ним, ф^уруе тшьки у математичних записах i графiчних представленнях, а фiзичний - фактично юнуе тшьки в программ Наприклад, якщо певна елек-тронна схема описуеться тополопчною матрицею (сумiжностi чи шциденцш) розмiром 100x5000 елеменлв, то лопчний масив складатиметься з та^ ж са-моi кшькост елеменпв навггь у тому раз^ якщо цей масив у програмi фiзич-но не юнуе. Якщо у цш матриц фактично використовуються тшьки 100 еле-менлв, то саме вони i займатимуть фiзичну пам'ять комп'ютера.
Поодинок елементи чи навiть структури (записи), як зберiгаються у звичайному масивi (чий iндекс е аналогом ключа), можуть бути знайдеш ду-же швидко i без будь-яких порiвнянь. Якщо вiдомо ключ (тобто шдекс маси-ву), розмiр запису i початкову адресуа масиву, то адресу потрiбного запису обчислюемо за допомогою множення i додавання. Зазвичай, це питання стае щкавим тiльки тод^ коли нам потрiбно зберiгати значну кшьюсть записiв. Нехай, замiсть 100 елемент1в у нас е 5 000, а розмiр тополопчно! матриц за-лишаеться попереднiм. Наш гшотетичний масив, який складаеться з тако! кiлькостi елементiв, все ще на 99 % порожнш, тобто ми тепер не можемо знехтувати проблемою пошуку потрiбного запису серед !х швмшьйонно! кiлькостi. Структурований тип даних, який мае назву розрiджений масив, як-раз i призначений для вирiшення таких неоднозначних ситуацiй шляхом ефективного пошуку вщповщних об,ектiв.
Для збер^ання розрiдженого масиву, як правило, використовують одну з динамiчних структур даних - переважно однозв'язш списки. Зазвичай кожен об'ект такого списку мютить як мiнiмум два поля: лопчний iндекс еле-мента i його значення. Розгляд основних особливостей проектування одно- i двовимiрних розрiджених масивiв для роботи з матрицями, бшьшють елемен-тiв яких не використовуеться, е актуальним, становить науковий i практич-ний штерес, е основною метою дано! роботи.
1. Проектування розрщжених масив1в
Бшьшють питань, якi виникають у програмю^в пiд час обробляння матриць великих розмiрiв, стосуються в реалiзацil мехашзму iндексування елементiв масивiв. Деякi з сучасних прикладних програм працюють з дуже великими масивами, значна частина елеменлв яких дорiвнюе нулю або вщ-повiдае якомусь iншому значенню за замовчуванням. У процес розроблення таких програм випдним е усунення витрат пам,ятi не тiльки для !х збер^ан-ня, але й для здiйснення ефективного пошуку потрiбного елемента. Розрщже-нi масиви [5, с. 118] е динамiчними структурами об'еклв, якi поводяться як масиви, але не вимагають мюця в пам'ят комп'ютера для зберiгання значень даних, як мiстять нулi або певш значення за замовчуванням.
Рис. 1. Розподл пам 'ятi у одно-вимiрному розрiдженому масив^
а) структура об'екта; б) схема динам1чно1 структури об'ект1в
Заголовний об'ект Об'ект 0 Об'ект 2
На рис. 1 показано розподш пам'ят у одновимiрному розрщженому масив^ об'екти якого збер^ають значення цших чисел. Кожен об'ект ще! ди-намiчноl структури мае три поля: номер стовпця, самi данi i покажчик, який посилаеться на наступний об'ект справа. Заголовний об'ект, крайнш злiва, мае номер стовпця -1 i не мютить даних. Перший значущий об'ект ( з номером 0) мютить значення 4. Другий об'ект (з номером 1) у структурi не показаний взагаль В цьому випадку вважаетъся, що об'ект 1 збершае значення за замовчуванням. Третш об'ект (з номером 2) збер^ае значення 12.
На рис. 2 показано розподш пам'ят у двовимiрному розрщженому ма-сивi цiлих чисел. Незважаючи на те, що це пряме узагальнення одновимiрно-
го розрщженого масиву, кожен об'ект ще! структури входить у два списки ^ о^м номера стовпця, мае ще i номер рядка. Хоча двовимiрний варiант масиву е дещо складнiшим у реашзаци порiвняно з одновимiрним, проте вiн наба-гато випдшший для економного зберiгання значень даних. У деяких випад-ках найбшьш важливою частиною розрiджених масивiв е мдiрким - об'екти, яю явно не зберiгаються в пам'ят комп'ютера.
Рис. 2. Розподт пам 'nmi у deoeuMipHOMy p03pidM;eH0My Macuei:
а) структура об'екта; б) схема динам1чно1 структури об'ект1в
Проектуючи динамiчну структуру даних - одновимiрний розрщжений масив, зазвичай використовують перевантаження операторно!' функци opera-tor[](), яка одночасно реашзуе запис i зчитування об'екпв. Проте такий пiдхiд мае сво! недолiки, !х вдало усувають шд час реашзаци роботи двовимiрного розрщженого масиву, у якому ця функщя взагалi не використовуеться.
1.1. Реал1защя одновим1рного розр1дженого масиву
Найчастiше реаизащя одновимiрного розрiдженого масиву здшсню-еться у виглядi однозв'язного списку. У нього немае фжсованого розмiру i вш зростае у мiру додавання об'екпв. Оскiльки для зчитування i запису значень даних використовуеться одна операторна функщя operator[](), то i! внутршнш код повинен правильно управляти доступом у обох випадках, не знаючи наперед, яка саме дiя виконуеться в конкретний момент. Мшмальним допусти-мим iндексом для ще!" функци е нуль, тобто у нш спочатку вiдбуваеться пере-вiрка на заборону застосування негативних шдекЫв.
Як уже було наголошено, головний недолiк реалiзацii операторно!' функци operator[]() полягае в тому, що вона наперед не знае, для чого викли-каеться - зчитування чи запису. Щоби зрозумiти важливють таких дiй, спро-
буeмо розрiзнити окремо доступи для зчитування i запису. Проте нав^ь для нефахiвцiв з областi програмування, очевидно, що тд час роботи програми дда доступу для зчитування даних потрiбно робити не так вже й часто. Якщо у процес пошуку необхiдний об,eкт знайдено, то операторна функщя маe по-вернути посилання на його поле даних. 1накше вона маe повернути значення даних за замовчуванням.
Стосовно дп доступу для запису, то операторна функщя, знайшовши необхщний об,eкт, маe поводитися точно так, як i при зчитуванш, тобто маe повернути посилання на його поле даних. Якщо ж потрiбний об^кт не знайдено, то функщя повинна його створити, шакше просто шкуди буде за-писати чергове значення даних. Це питання вирiшуeться шляхом надання кожному виклику операторно1' функцiï статусу доступу для запису. Як тшьки запрошуeться неiснуючий об,eкт, то в потрiбному стовпцi створюeться новий об^кт, який iнiцiалiзуeться значенням за замовчуванням.
1.2. Peaлiзaцiя двовимiрного розр1дженого мacивy
Хоча двовимiрний розрiджений масив не e "концептуальним прори-вом" у створенш динамiчних структур даних порiвняно з одновимiрним, проте сумшву не викликаe i те, що реалiзацiя операторно1' функцiï operator[]() не особливо вдало узагальнюeться на двовимiрний випадок. Однieю з причин e неможливють розрiзнити дiю зчитування вщ дй' запису, що шкодить ефектив-нiй ïï роботi. Згадаймо, щоразу, коли у одновимiрному розрiдженому масивi зчитувався неiснуючий об,eкт, то треба було створювати новий та iнiцiалiзу-вати його данi значенням за замовчуванням. Якщо це трапляeться часто, то зазнаe краху вся щея використання розрiдженого масиву. Очевидно, шд час реалiзацiï двовимiрного розрiдженого масиву це питання стаe набагато серйозшшим.
Друга причина полягаe в тому, що операторна функщя operator[]() може приймати тшьки один аргумент. Це примусило б нас реалiзувати двовимiрну модель розрщженого масиву як масив масивiв. Як на перший погляд, такий шдхщ вартий уваги, але згодом можна потрапити у безвихщь, як тшьки спро-буeмо визначити значення за замовчуванням. Однieю з вимог шд час реалiза-ци розрiдженого масиву e також те, щоб введений користувачем тип об^кта, як i в одновимiрному випадку, мав тип tType. Проте, якщо взяти за модель нашу просту одновимiрну реалiзацiю, то масив масивiв повинен мати за замовчуванням тип масив.
Для ефективного виршення цих питань, зазвичай у двовимiрнiй моде-лi зовсiм вщмовляються вiд операторноï функцiï operator[]() i замшюють ïï дво-ма функщями доступу - окремо для зчитування i для запису. Це даe змогу акуратному користувачевi уникнути створення непотрiбних нових об,eктiв та iнiцiалiзацiï \х даних значенням за замовчуванням. Iншi мало зацiкавленi ко-ристувачi можуть застосовувати функцiю доступу винятково тшьки для запису значень даних.
З метою спрощення програмноï реалiзацiï зарезервований двовимiр-ний розрщжений масив може мати фiксованi розмiри, якi перед виконанням встановлюe користувач. Вводячи об^кт у двовимiрний масив, спочатку ство-
рюеться рядок заголовних стовпщв "над" рядком 0 i стовпець заголовних рядкiв '^iBa" вiд стовпця 0. За потреби, такий пщхщ можна модифiкувати так, щоб розмiр масиву встановлювався на програмному piBm. 1нше можливе удосконалення - не створювати зaголовнi рядки (стовпщ) доти, доки в цей рядок (стовпець) не буде дшсно помщено об'ект.
Розpобленi функци доступу для зчитування i запису мають приймати як аргументи шдекси рядка i стовпця. Функщя доступу для зчитування по-вертае const tType &. Шсля пеpевipки дiaпaзону змши iндексiв масиву функцiя пеpевipяе список заголовних рядюв доти, доки не знайде той об'ект, який вка-зано аргументом row. По^м вона пеpевipяе рядок злiвa направо у пошуках об'екта, який вiдповiдaе apгументовi col. Якщо функцiя зчитування потрапляе на об'ект, поле col якого е бшьшим вiд вказаного аргументу або сягае кшця списку, то вона повертае значення даних за замовчуванням.
Функщя доступу для запису повертае tType & i слщуе схожому алгоритму пошуку, як i у функци зчитування. Проте, коли функщя запису виявляе, що шуканого об'екта не юнуе, то вона його створюе, iнiцiaлiзуе дат значен-ням за замовчуванням i вставляе його у потpiбне мюце масиву. Оскiльки це мiсце визначаеться шляхом перегляду вщповщного рядка, то функщя мае достатньо шформаци, щоб за потреби вставити у цей рядок новий об'ект. Але ця функщя повинна ще вставити цей об'ект i в другий однозв'язний список -в його стовпець. Вона робить це так: спочатку переглядаюся заголовш стовпщ, вщшукуючи серед них потpiбний. Знайшовши його, дaлi виконуються ди, аналопчш перегляду рядка. За ди перегляду стовпця вщповщае внутрш-нiй цикл while, який е вщсутшм у функци доступу для зчитування.
За бажанням користувача, можна мiнiмiзувaти кшьюсть заголовних об'екпв i надати масиву здатшсть програмно мiняти сво1 pозмipи. Ц змiни здiйснюються шляхом модифiкувaння параметризованого конструктора i двох функцш доступу. Модифжований конструктор матиме тiльки один параметр (const tType &) i, заметь того, щоб створювати вс заголовш рядки i стовпщ, створить тшьки головний заголовний об'ект у рядку -1 i стовпщ -1. Модифжоваш функци доступу переглядатимуть заголовш об'екти не шляхом шдрахунку, а шукатимуть рядок або стовпець з номером, бшьшим вщ нього або який доpiвнюе потpiбному. За потреби буде створено новий заголовний об'ект. Такий шдхщ iмiтуе наявну пеpевipку рядка i створення об'екта з дани-ми у мipу потреби.
2. Приклади створення розрщжених масив1в
Розглянемо процес створення двовимipних розрщжених мaсивiв на конкретному навчальному приклад^ який, для pозумiння цього мехашзму, мае невелику кiлькiсть рядюв i стовпцiв. Хоча тaкi приклади не завжди вщпо-вiдaтимуть реальним iнженеpним розрахункам, проте у нашому випадку роз-роблена програма здатна працювати з надзвичайно великими масивами.
Отож, основне завдання тополопчного опису будь-яко1 електронно1 схеми (рис. 3, а) полягае в тому, щоби перевести гpaфiчну шформащю про з'еднання ïï компонент у фоpмaльнi математичш позначення, якi потiм вико-ристовуються для написання алгебричних piвнянь та неpiвностей [1, с. 114].
Основою тополопчного опису е граф, який складаеться з гшок - сукупност вiдрiзкiв довшьно! довжини i форми, а також вершин - точок перетину вершин. Важливим поняттям теори графiв е дерево графу (рис. 3, б), яке складаеться з сукупност гшок електронно! схеми, охоплюе усi И вузли, але не мiстить жодного контура. Графiчне подання зв,язкiв у електроннш схемi переводиться у формальш математичнi позначення за допомогою тополопчних матриць (рис. 3, в).
-1 1 1
-1 -1 1 2
1 -1 -1 -1 3
1 -1 4
в)
Рис. 3. Топологiчний опис електронного ключа: а - екв1валентна електронна схема; б - дерево графу; в - тополог1чна матриця
До тополопчних належать структуры матрищ (з'еднань - шциденцш), як вперше запропонував Клрхгоф. Для !х побудови попередньо нумерують вузли i гiлки графу, а по^м довiльно вибирають додатнi напрямки його гшок. У матрищ шциденцш (рис. 3, в) рядки вщповщають рiзним вузлам графу, а стовпщ - гшкам графу. Кожен ¿-ий рядок матрицi показуе, якi гшки з,еднанi з ¿-им вузлом, а кожен}-ий стовпець показуе, з якими вузлами з'еднана}-а гшка графу. Кожен а}} елемент ще! матрицi набувае значення +1, якщо }-та гiлка пiдходить до ¿-го вузла, або -1, якщо }-та гшка виходить з ¿-го вузла; а також 0, якщо }-та гшка не мае спшьно! точки з ¿-им вузлом. Матриця шциденцш дае змогу записати шформащю про зв'язки в електроннш схем^ яка мютиться в граф^ у векторно-матричному виглядi.
Наприклад, використовуючи 1-ий закон Юрхгофа у матричному виглядi
А х / = 0 ^ { а$ • = 0, $ = 1,п; / = 1,т }, (1)
отримаемо систему лiнiйних рiвнянь для знаходження струмiв () у гшках електронно! схеми. Використовуючи такий матричний запис
АА = и аТ -де = и$, I = 1, т; $ = 1, п }, (2)
отримаемо систему лшшних рiвнянь для знаходження напруг (и$) мiж вузлами ще! схеми, де де - електричний потенцiал у вузлi.
У фаховш лiтературi [3, 4] з моделювання електронних схем детально розглянуто питання побудови та алгоритми розв'язання алгебро-тополопчних рiвнянь з використанням комп'ютерно! техшки. У них також зазначено, що, використовуючи у топологiчних матрицях певш закономiрностi розмiщення нульових елементiв, шд час розроблення програми можна ютотно зменшити об'ем використано! пам,ятi комп'ютера i водночас скоротити тривалiсть про-цесу розрахунку. Скорочення тривалостi розрахунку електронних схем дося-гаеться як шляхом зменшення кiлькостi обчислень (не виконуючи арифме-тичних операцiй з нульовими елементами), так i за рахунок замши довгих операцш короткими. Основна властивють тополопчно! матрицi полягае в тому, що у нш кшьюсть нульових елемент1в е достатньо великою, водночас як ус ненульовi елементи дорiвнюють або +1, або -1. О^м того, тополопчна матриця складно! електронно! схеми мае, як правило, блочну структуру. Це дае змогу замшити довп операцн множення i додавання операцiями порiв-няння, додавання i вiднiмання, тобто бшьш короткими операцiями, i значно зменшити кшьюсть виконуваних дш.
З огляду на сказане вище, останне завдання ще! роботи полягае в тому, щоби за допомогою розробленого програмного проекту зберегти тополо-гiчну матрицю (рис. 3, в) i забезпечити ефективний доступ до И елемент1в, тобто реалiзувати роботу двовимiрного розрiдженого масиву. Оскiльки у ви-
разах (1) i (2) матрицю шциденцш елементiв представлено у звичайному А
та транспонованому Ат виглядах, то перед введенням об'екпв у двовимiрний розрiджений масив необхщно спочатку для значущих елементiв матрищ за-писати значення !хтх шдекЫв.
Отож, фрагмент результатiв роботи розробленого програмного проекту, який показуе збереження значущих об'екпв у двовимiрному розрщжено-му масиву мае такий вигляд:
Як на перший погляд, збереження у пам'ят комп'ютера об'екпв, яю вь дображають елементи тpaнспоновaноï мaтpицi iнциденцiй, е бiльш компак-тним, нiж у звичaйнiй матрищ. Проте - це тшьки екранне представлення об'екпв у вщповщних двовимipних pозpiджених масивах, водночас як у пам'ят комп'ютера з 32 булевих елемент1в кожноï з матриць збер^аеться тiльки 11 значущих.
Висновки
1. Розглянуто питання застосування динaмiчноï структури даних - розр1-джених масивгв (sparse arrays) для роботи з тополопчними матрицями, значна бшьшють елеменпв яких не використовуеться.
Звичайний вигляд матрищ Транспонований вигляд матрищ
[(1,1) -1]
[(2,1) 1] [(2,2) -1]
[(3,2) -1] [(3,3) 1]
[(1,1) -1] [(1,2) 1] [(2,2) -1] [(2,3) -1] [(2,4) 1] [(3,3) 1] [(3,5) -1] [(3,6) -1] [(3,7) -1] [(4,7) 1] [(4,8) -1]
[(4,2) 1] [(5,3) -1] [(6,3) -1]
[(7,3) -1] [(7,4) 1] [(8,4) -1]
Табл. 1. Значення шдекав та елементiв матриц шциденцш у звичайному та транспонованому виглядi при т = 4 i п = 8 (всього 32 булевих елементи)
№ Звичайний вигляд матриц! Транспонований вигляд матриц!
п/п / / / /
1 ® 1 -1 1 ® -1
2 (I) 1 1 1 © 1
3 (1) 2 -1 2 ® -1
4 ® 2 -1 2 ® -1
5 (I) 3 1 2 ® 1
6 ® 2 1 3 ® 1
7 (I) 3 -1 3 ® -1
8 ® 3 -1 3 ® -1
9 ® 3 -1 3 ® -1
10 ® 4 1 4 ® 1
11 ® 4 -1 4 ® -1
2. З'ясовано, що розрщжет масиви мають здаттсть як компактно зберiгати вщповщт об'екти, так i здiйснювати ефективний доступ до них, що ро-бить 1х надзвичайно корисними в багатьох ситуацiях, як виникають тд час розроблення сучасних програмних продукив.
3. Наведено приклади зберiгання об'екпв, яю представляють елементи матрицу шциденцш електронного ключа у звичайному та транспонованому виглядах, що свщчить про придатнютъ роботи розробленого програмного проекту.
4. Встановлено, завдяки використанню розрщжених масивiв пам'ять для зберiгання кожного з об'екпв (елементiв булево! матрищ) видiляeться з пули вшьно! пам'ят комп'ютера тiльки в мiру потреби.
Лггература
1. Молчанов А.А. Моделирование и проектирование сложных систем. - К.: Вища шк., 1988. - 360 с.
2. Павловская Т. А., Щупак Ю.А. С++. Объектно-ориентированное программирование: Практикум. - СПб.: Питер, 2005. - 265 с.
3. Сигорский В.П., Петренко А.И. Алгоритмы анализа электронных схем. - М.: Сов. радио, 1976. - 608 с.
4. Ильин В.Н. Основы автоматизации схемотехнического проэктирования. - М.: Энергия, 1979. - 392 с.
5. Фридман А., Кландер Л., Михаэлис М., Шильт Х. С/С++. Алгоритмы и приемы программирования. - М.: ООО "Бином-Пресс", 2007. - 560 с.