Implementacija sparsnih matrica upotrebom listi u programskom jeziku C

Similar documents
GUI Layout Manager-i. Bojan Tomić Branislav Vidojević

SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan.

Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije

Podešavanje za eduroam ios

Struktura indeksa: B-stablo. ls/swd/btree/btree.html

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd,

SAS On Demand. Video: Upute za registraciju:

BENCHMARKING HOSTELA

Port Community System

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings

Upute za korištenje makronaredbi gml2dwg i gml2dgn

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB.

Nejednakosti s faktorijelima

PROJEKTNI PRORAČUN 1

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri.

1. Instalacija programske podrške

Uvod u relacione baze podataka

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020.

1.7 Predstavljanje negativnih brojeva u binarnom sistemu

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE

Da bi se napravio izvještaj u Accessu potrebno je na izborniku Create odabrati karticu naredbi Reports.

Tutorijal za Štefice za upload slika na forum.

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA

OBJEKTNO ORIJENTISANO PROGRAMIRANJE

Otpremanje video snimka na YouTube

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY

JEDINSTVENI PORTAL POREZNE UPRAVE. Priručnik za instalaciju Google Chrome dodatka. (Opera preglednik)

PODSUSTAV ZA UPRAVLJANJE SPREMNIKOM UGRADBENOG RAČUNALA

STRUČNA PRAKSA B-PRO TEMA 13

UNIVERZITET U BEOGRADU RUDARSKO GEOLOŠKI FAKULTET DEPARTMAN ZA HIDROGEOLOGIJU ZBORNIK RADOVA. ZLATIBOR maj godine

Statistička analiza algoritama za dinamičko upravljanje spremnikom

Advertising on the Web

Bušilice nove generacije. ImpactDrill

int[] brojilo; // polje cjelih brojeva double[] vrijednosti; // polje realnih brojeva

MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE

Ciljevi. Poslije kompletiranja ove lekcije trebalo bi se moći:

ECONOMIC EVALUATION OF TOBACCO VARIETIES OF TOBACCO TYPE PRILEP EKONOMSKO OCJENIVANJE SORTE DUHANA TIPA PRILEP

Naredba je uputa računalu za obavljanje određene operacije.

Tema 2: Uvod u sisteme za podršku odlučivanju (VEŽBE)

SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA. SEMINARSKI RAD U OKVIRU PREDMETA "Računalna forenzika" 2016/2017. GIF FORMAT (.

Strukture podataka. Strukture podataka su složeni tipovi podataka

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a

PROGRAMIRANJE I ALGORITMI

Struktura i organizacija baza podataka

RANI BOOKING TURSKA LJETO 2017

IZRADA TEHNIČKE DOKUMENTACIJE

Programiranje. Nastava: prof.dr.sc. Dražena Gašpar. Datum:

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU

DEFINISANJE TURISTIČKE TRAŽNJE

Sveučilište Jurja Dobrile u Puli Odjel za informacijsko-komunikacijske tehnologije ANTONIO VUK DATOTEKE U PROGRAMSKOM JEZIKU C++ Završni rad

3D GRAFIKA I ANIMACIJA

ENR 1.4 OPIS I KLASIFIKACIJA VAZDUŠNOG PROSTORA U KOME SE PRUŽAJU ATS USLUGE ENR 1.4 ATS AIRSPACE CLASSIFICATION AND DESCRIPTION

24th International FIG Congress

Korak X1 X2 X3 F O U R T W START {0,1}

PE FORMAT (.EXE,.DLL)

TEHNO SISTEM d.o.o. PRODUCT CATALOGUE KATALOG PROIZVODA TOPLOSKUPLJAJUĆI KABLOVSKI PRIBOR HEAT-SHRINKABLE CABLE ACCESSORIES

Modelling Transport Demands in Maritime Passenger Traffic Modeliranje potražnje prijevoza u putničkom pomorskom prometu

ANALIZA PRIMJENE KOGENERACIJE SA ORGANSKIM RANKINOVIM CIKLUSOM NA BIOMASU U BOLNICAMA

KABUPLAST, AGROPLAST, AGROSIL 2500

OTVARANJE BAZE PODATAKA I IZRADA TABLICE U MICROSOFT ACCESS-u

Windows Easy Transfer

ANALIZA PRIKUPLJENIH PODATAKA O KVALITETU ZRAKA NA PODRUČJU OPĆINE LUKAVAC ( ZA PERIOD OD DO GOD.)

ELEKTROTEHNIČKI FAKULTET UNIVERZITETA U BEOGRADU

Programiranje za internet zimski semestar 2013/2014. Java kroz primjere (skripta je u fazi izradi)

CommLab 00. CommLab /2017 ( ) Osnove Matlab-a. 1. Uvod

CRNA GORA

Trening: Obzor financijsko izvještavanje i osnovne ugovorne obveze

MS Excel VBA za studente kemije

MikroC biblioteka za PDU format SMS poruke

Nizovi. Sintaksa. ili. var pera,mika,laza,...,zoran1,zoran2,...,pera1254:real;

Služi za brisanje prethodno upisanih sadržaja u čitavom worksheetu. Opcija nije nužna, ali je korisna.

RJEŠAVANJE BUGARSKOG SOLITERA

Univerzitet u Novom Sadu. Fakultet tehničkih nauka. Odsek za računarsku tehniku i računarske komunikacije. Uvod u GIT

- Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ

Pravljenje Screenshota. 1. Korak

Mogudnosti za prilagođavanje

MEĐIMURSKO VELEUČILIŠTE U ČAKOVCU RAČUNARSTVO ROBERT PRAŠNIČKI

TEHNIKA I INFORMATIKA U OBRAZOVANJU 3. Internacionalna Konferencija, Tehnički fakultet Čačak, 7 9. maj 2010.

Programiranje baza podataka

Uputstvo za pravljenje i korišdenje biblioteka sa dinamičkim povezivanjem (.dll)

VBA moduli. mr Milovan Milivojević dipl. ing. Visa Poslovno Tehnička Škola - Užice

Bear management in Croatia

Office 365, upute za korištenje elektroničke pošte

CAME-LISTA USKLAĐENOSTI SA PART M CAME-PART M COMPLIANCE LIST

MASKE U MICROSOFT ACCESS-u

UPUTE ZA INSTALACIJU PROGRAMA FINBOLT 2007 tvrtke BOLTANO d.o.o.

Elektrotehnički fakultet Operativni sistemi 1 u Beogradu. File System

Adapted for classroom use by

DOSTAVUANJE PONUDA ZA WIMAX MONTENEGRO DOO PODGORICA

Slobodni softver za digitalne arhive: EPrints u Knjižnici Filozofskog fakulteta u Zagrebu

JavaScript podrska u radu sa greskama

Klasterizacija. NIKOLA MILIKIĆ URL:

LabVIEW-ZADACI. 1. Napisati program u LabVIEW-u koji računa zbir dva broja.

Projekat iz predmeta Računarska elektronika

ARHITEKTURA RAČUNARA

- Italy. UNIVERZALNA STANICA ZA ZAVARIVANJE, SPOTER - sa pneumatskim pištoljem sa kontrolnom jedinicom TE95-10 KVA - šifra 3450

Kako instalirati Apache/PHP/MySQL na lokalnom kompjuteru pod Windowsima

Transcription:

INFOTEH-JAHORINA Vol. 10, Ref. E-I-15, p. 461-465, March 2011. Implementacija sparsnih matrica upotrebom listi u programskom jeziku C Đulaga Hadžić, Ministarstvo obrazovanja, nauke, kulture i sporta Tuzlanskog kantona Nermin Sarajlić, Fakultet elektrotehnike Univerzitet Tuzla Sadržaj U radu su date osnovne karakteristike sparsnih matrica kao i mogućnosti njihove implementacije u računarskim sistemima. U radu je opisana i demonstrirana implementacija sparsnih matrica upotrebom listi u programskom jeziku C. Ovakvim načinom se u značajnoj mjeri smanjuju potrebni resursi (memorija) računarskih sistema za memorisanjem ovakvih matrica a i brzina izvođenja određenih operacija nad njima se značajno povećava. Na kraju rada su dati konkretni rezultati usporedbe korištenja resursa računarskih sistema implementacijom sparsnih matrica na standardni način i implementacijom na način opisan u ovom radu. Ključne riječi sparsne matrice, programski jezik C, elementi, struktura, lista, pokazivač, alokacija, dealokacija, adresa. S I. UVOD PARSNE matrice su matrice izuzetno velikih dimenzija sa relativno malim brojem elemenata različitih od nula. Memorisanjem svih elemenata sparsne matrice na standardni način u dvodimenzionalnom obliku zahtjeva ogromnu količinu memorije računarskg sistema. S toga se javila potreba da se memorišu samo oni elementi sparsnih matrica koji su različiti od nula, a elementi matrice koji nisu memorisani imaju nula. Na ovaj način se značajno smanjuje broj elemenata matrice koje je neophodno memorisati kao i broj operacija koje je neophodno izvršiti prilikom izvođenje osnovnih operacija nad sparsnim matricama kao što je : sabiranje, oduzimanje i množenje matrica. Implementacija sparsnih matrica na predhodno opisani način je moguća uz upotrebu listi. U nastavku se demonstrira kako upotrebom listi raditi sa ovakvim matricama., odnosno kako formirati (inicijalizirati) jednu sparsnu matricu, dodavati, mijenjati i brisati elemente matrice i čitati tražiti elemente u matrici. Takođe, prezentira se kako sabrati dvije sparsne matrice i kako vršiti dealokaciju elemenata matrice, odnosno čitave matrice. U ovom primjeru elementi sparsne matrice su realni brojevi. Za implementaciju sparsnih matrica upotrebom listi korišten je programski jezik C. Lista je konačni niz (od nula ili više) podataka istog tipa[1]. Podaci koji čine listu nazivaju se njeni elementi. U teoretskim razmatranjima lista se obično bilježi na sljedeći način [2]: (a1, a2,...,an). Ovdje je n 0 i predstavlja dužinu liste. Ako je n = 0, onda je lista prazna. Za n 1, a1 je prvi element, a2 drugi,..., an zadnji element. Identitet elementa određen je njegovom pozicijom (rednim brojem) a ne njegovom vrijednošću. Važno svojstvo liste je da su njeni elementi linearno uredeni s obzirom na svoju poziciju. Tako je ai ispred ai+1, a ai iza ai 1. Broj elemenata u listi nije fiksiran: elementi se mogu ubacivati ili izbacivati na bilo kojem mjestu te na taj način lista može rasti ili se smanjivati. Vezane liste se prikazuju nizom ćelija gdje svaka ćelija sadrži jedan element liste i pointer na istu takvu ćeliju koja sadrži idući element liste [3]. Postoji i polazna ćelija (header) koja označava početak liste i ne sadrži nikakav element. U radu su definisane dvije vezane liste: 1. Lista redova matrice struct Cvor struct Cvor int ; struct Cvor *slijedeci; struct Red *start; 1. Lista elemenata matrice u jednom redu (po kolonama) struct Red struct Red int BrojKolone; float ; struct Red *; Struct Cvor sadrži: Broj u kome se element nalazi - Pokazivač na slijedeci red - * Pokazivač na prvi element u redu - *start. struct Red sadrži: Broj kolone u kojoj se element nalazi - BrojKolone Vrijednost elementa (realan broj) - Pokazivač na slijedeću kolonu odnosno na sljedeći element u listi datog redu - *. 461

PRVI KRAJ start start start Slika 1. Primjer opšte strukture sparsne matrice upotrebom listi U listama Red se mogu nalaziti samo elementi matrice koji nisu nula. Elementi u listama Red su sortirani po broju kolone, od najmanje ka najvecoj. Primjer opšte strukture jedne sparsne matrice implementirane upotrebom listi prikazan je na slici 1. II. PROGRAM Program napisan u programskom jeziku C, koji definiše navedenu strukturu podataka kao i sve navedene operacije nad sparsnim matricama se sastoji od tri datoteke: glavni.c u kome se nalazi main funkcija i dvije funkcije koje ne rade direktno nad matricama. matrica.h u kome je deklarisana struktura listi i funkcije koje rade nad matricama i koje se koriste u main funkciji. matrica.c u kome se nalazi definicija svih funkcija deklarisanih u matrica.h a koje se pozivaju na izvršenje u main funkciji. Kada se program pokrene prvo se definišu tri globalne varijable tipa struct Cvor: prvia, prvib i prvic. Zatim se vrši inicijalizacija matrica A i B preko inicijalizacije globalnih varijabli prvia i prvib vršeći alokaciju memorijskog prostora i postavljajući njihovu na 0 (KRAJ), kao na slici 2. Nakon toga se unose dimenzije sparsne matrice, broj redova (m) i broj kolona (n). PRVI KRAJ Slika 2. Inicijalizacija matrice Nakon inicijalizacije matrica A i B dobija se izbornik u kome se može odabrati operacija za izvršenje. U izborniku postoji mogućnost da se dodaju elementi u matrica A i B, traži i vrši ispis i pojedinih elemenata u matricama A i B, vrši ispis matrica A i B i da se vrši sabiranje matrica A i B i smještanje njihovog zbira u matricu C. Program vodi računa o alokaciji i dealokaciji memorije, prilikom brisanja elementa iz matrice (brisanje elementa matrice se vrši tako što se kao elementa matrice unese nula) kao i prilikom izlaska iz programa kada se vrši dealokacija svih postojećih elemenata u matrici (svim listama) kao i sami redovi (lista Cvorova). Matrica C se inicira pilikom sabiranja matrica A i B, a dealocira odmah nakon sto se rezultat sabiranja matrica A i B, tj sadržaj matrice C prikaže na ekranu. Matrice A i B se dealociraju prilikom izlaska iz programa. III. FUNKCIJE Definicija svih funkcija vezanih za rad nad matricama su smještene u datoteci matrica.c, a njihova deklaracija je smještena u datoteku zaglavlja matrica.h. U nastavku je data deklaracija i opis svih funkcija navedenih u zaglavlju datoteke matrica.h. void inicmatricu(struct Cvor **prvi,int m); Ova funkcija vrši inicijalizaciju matrice na osnovu proslijeđene adrese pokazivača na prvi element (**prvi). Ovdje je bitno istaći da se funkciji inicmatricu kao i drugim funkcijama koje rade nad matricom proslijeđuje adresa pokazivača na prvi element iz razloga što se samo tako radi nad stvarnom matricom (listama) tj. neće se praviti kopija pokazivača na prvi element. Međutim, da bi funkcija došla do pokazivača na prvi element potrebno je prvi definisati kao pokazivač na pokazivač **prvi (dobija adresu pokazivača prvi, a prvi sadrži adresu prvog elementa). Funkcija vrši alokaciju memorije za varijablu tipa Cvor i postavlja je na 0 (KRAJ) (Slika2). void dodajcvor(struct Cvor **prvi,int r); Prilikom dodavanje novog elementa matrice u listu Red neophodno je provjeriti da li uopšte postoji Cvor koji predstavlja početak liste Red. Ukoliko ne postoji navedeni Cvor, funkcija vrši njegovu inicijalizaciju, postavljanje i varijable i njegovo dodavanje u listu Cvor. Dodavanje cvora, odnosno liste koja predstavlja određeni red matrice (lista Red) se vrši na osnovu proslijeđene adrese pokazivača na prvi element (**prvi) i broja (r). Pokazivač se postavi na početak liste Cvor i prolazeći kroz tu listu provjerava stanje u njoj i na osnovu toga radi sljedeće: ako je lista prazna dodaje čvor na početak; 462

ako lista ima samo jedan čvor provjerava da li je broj tog čvora manji, ili veći od broja (r) u koji se element dodaje. Ukoliko je manji, čvor liste se ubacuje iza prvog čvora kao zadnji, a ako nije manji, tj veći je, čvor se ubacuje kao prvi čvor liste Cvor. ako lista ima više čvorova (više od 1) onda se provjerava gdje će čvor liste biti ubačen između čvorova liste (zadati broj veći od broja jednog čvora a manji od broja čvora koji ga slijedi). ako je proslijeđeni broj (r) funkciji veći od broja zadnjeg čvora u listi onda se čvor dodaje na kraj liste Cvor. void dodaj(struct Cvor **prvi,int r, int k,float vr); Ova funkcija vrši dodavanje elementa matrice u listu Red na osnovu proslijeđene adrese pokazivača na prvi element (**prvi), broja (r), broja kolone (k) i i elementa matrice (vr). Dodavanje elementa matrice se vrši tako što se prvo postavi pokazivač na Cvor čiji redni broj u listi jednak zadatom redu (r) u koji se element dodaje. Zatim se postavlja na početak tog (*start) i prolazeći kroz listu Red provjerava stanje u toj listi i na osnovu toga radi sljedeće: ako je lista prazna dodaje element na početak liste Red. ako lista Red ima samo jedan element provjerava da li je broj kolone (BrojKolone) tog elementa manji, jednak ili veći od broja kolone koji je zadat (k). Ukoliko je manji element matrice se ubacuje iza prvog elementa kao zadnji, ukoliko je jednak onda se provjerava da li je zadata (vr) nula, ako nije onda se za prvi element mijenja elementa, a ako je (vr) 0 onda se prvi element briše iz liste (vrši se dealokacija) i pokazivač na početak liste (*start) postavlja na nulu. ako lista Red ima više elemenata (više od 1) onda se provjerava kada će element matrice biti ubačen između elemenata liste gdje je zadati broj kolone (k) veći od broja kolone jednog elementa a manji od broja kolone elementa koji ga slijedi. Ukoliko se pronađe element matrice sa istim brojem kolone koji je proslijeđen funkciji dodaj onda se u zavisnosti da li je različit od nula ili je jednak nula vrši operacia promjene i elementa matrice ili se taj element matrice briše i vrši se njegova dealokacija. ako je proslijeđeni broj kolone (k) funkciji dodaj veći od broja kolone zadnjeg elementa u listi Red onda se elemenat matrice dodaje na kraj liste. void ispiskaolista(struct Cvor **prvi); na prvi element (**prvi), vrši ispis sadržaja matrice u obliku listi (slika 3). Znači, ovdje se ispisuju samo elementi matrice koji su različiti od nula. Takođe elementi lista Cvor i Red su ispisani sortirano u zavisnosti od broja () odnosno broja kolone (BrojKolone) u kojoj su postavljeni i to od najmanje ka najvećoj. Slika 3. Primjer ispisa matrice kao listi void ispiskaomatrica(struct Cvor **prvi,int m, int n); na prvi element (**prvi), broj redova (m) i broja kolona (n), vrši ispis sadržaja matrice u standardnom dvodimenzionalnom obliku (mxn) (slika 4) i ovdje su prikazani svi elementi matrice i oni koji imaju nula i oni koji su različiti od nule. Slika 4. Primjer ispisa matrice na standardni način int trazicvor(struct Cvor **prvi,int r); na prvi element (**prvi) i broja (r) provjerava da li postoji čvor koji predstavlja zadati red (r) matrice. Ukoliko postoji funkcija vraća 1, ukoliko ne postoji vraća 0. Na osnovu i koju ova funkcija vraća, program odlučuje da li će dodati ili ne novi čvor koji predstavlja red matrice. Ako je koju vraća funkcij trazicvor 0 čvor se dodaje, a ukoliko je 1 čvor se ne dodaje jer već postoji. float trazi(struct Cvor **prvi,int r, int k); na prvi element (**prvi) i broja (r) i broja kolone (k) vraća elementa u zadatom redu i koloni matrice. Ukoliko funkcija trazi u listama ne pronađe elemenat u zadatom redu (r) i koloni (k)onda vraća nula. void saberimatrice(struct Cvor ** prvia1, struct Cvor ** prvib1, struct Cvor ** prvic1); Ova funkcija na osnovu proslijeđenih adresa pokazivača na prve elemente matrica A,B i C (**prvia1, **prvib1, **prvic1), vrši sabiranje elemenata matrice A i matrice B i njihov zbir smješta u matricu C. Sabiranje matrica A i B se vrši tako što se: 1. Prvo se prolazi kroz liste Cvor i Red matrice A i za svaki element matrice A se provjerava da li postoji 463

odgovorajući element u matrici B koji se nalazi u istom redu i koloni kao i dati element u matrici A. Ukoliko odgovorajući element u matrici B postoji, onda se elementa u matrici A i elementa u matrici B saberu i nakon toga se vrši dodavanje elementa u matricu C u red i kolonu u kome se nalaze elementi u matricama A i B sa vrijednoću elementa jednakom predhodno izračunatom zbiru i elemenata matrica A i B. Ukoliko ne postoji odgovarajući element u matrici B, onda se element matrice A dodaje u matricu C u red i kolonu u kome se nalazi element matrice A i sa vrijednošću elementa matrice A. 2. Nakon što se prođe kroz sve liste Cvor i Red matrice A, onda se prolazi kroz sve liste Cvor i Red matrice B i za svaki element u matrici B se provjerava da li postoji element matrice A u istom redu i koloni kao i dati element u matrici B. Ukoliko ima odgovarajući element u matrici A, ne radi ništa, jer je zbir i ovih elemenata već dodat u matricu C. Ukoliko nema odgovarajućeg elementa u matrici A (nije pronađen element u matrici A) onda izvrši dodavanje novog elementa u matricu C u red i kolonu u kome se nalazi element matrice B sa vrijednošću elementa matrice B. void dealocmatricu(struct Cvor **prvi,int m) na prvi element (**prvi) i broja redova (m) vrši dealokaciju čitave matrice. Ova funkcija se pokreće prilikom izlaska iz programa za dealokaciju matrica A i B, i nakon što se izvrši sabiranje matrica A i B i njihov zbir smjesti u matricu C i prikaže sadržaj matrice C, za dealokaciju matrice C. void unosredkolona (int * r, int * k, int m, int n); Ova funkcija ne radi direktno nad matricom već služi kao funkcija koja se više puta poziva prilikom dodavanja novog elementa matrice i citanje-trazenje elementa matrice. Funkciji se prosljeđuju adrese zadatog broja (*r) i broja kolone (*k) jer će se i ovih varijabli proslijediti funkciji dodaj i dodajcvor za dodavanje elementa ili funkciji trazi i trazicvor za čitanje (traženje) elementa u matrici. int izbornik(void); Funkcija izbornik ne radi direktno nad matricom i daje početnu masku za izbor operacije za rad (slika 5). Slika 5. Izbornik IV. REZULTAT Osnovni cilj korištenja vezanih listi u implementaciji sparsnih matrica je ušteda memorije i upravljanje memorijom na jedan kvalitetniji način što je od izuzetne važnosti za velike programe koji obrađuju ogromne količine podataka. U programskom jeziku C postoje četiri osnovna tipa podataka: char, int, float i double. Količine memorije koju zauzimaju pojedini tipovi podataka zavise od računara na kome se program izvršava. U nastavku su date tipične i i biće korištene za analizu rezultata [3]. int: cjelobrojni podatak zauzima 4 bajta char: znakovni podatak i predstavlja jedan znak i zauzima 1 bajt float: broj s pokretnim zarezom u jenostrukoj preciznosti i zauzima 4 bajta double: broj s pokretnim zarezom u dvostrukoj preciznosti i zauzima 8 bajtova Pokazivači na sljedeći element u vezanim listama sadrže adresu memorijske lokacije na kojoj je alociran sljedeći element u vezanoj listi. Adresa memorijske lokacije je cjelobrojni podatak što znači da i on zauzima 4 bajta memorije. Elementi vezanih listi Cvor i Red, koje se koriste za implementaciju sparsnih matrica, alociraju sljedeće količine memorije: struct Cvor int ; //4 bajta struct Cvor *slijedeci; //4 bajta struct Red *start; //4 bajta Ukupna memorija koju alocira jedan element vezane liste Cvor je 12 bajtova. struct Red int BrojKolone; //4 bajta float ; // 4 bajta struct Red *; //4 bajta Ukupna memorija koju alocira jedan element vezane liste Red je 12 bajtova. Inicijalizacijom sparsne matrice, implementirane vezanim listama, se vrši alokacija memorije za pokazivač (struct Cvor **prvi) na prvi element vezane liste Cvor (slika 2). Ovaj pokazivač u suštini predstavlja adresu 464

pokazivača koji sadrži adresu prvog elementa vezane liste Cvor. Pokazivač na adresu prvog elementa je cjelobrojni podataka i alocira 4 bajta memorije. Takođe postoje elementi koji određuju završetke vezanih listi Cvor () i Red (Reda) koji imaju nula i oni alociraju po 4 bajta memorije (slika 1). Shodno predhodnom u nastavku je data analiza alokacije memorije jedne sparsne matrice veličine 5x5 implementirane upotrebom vezanih listi. Na slici 6 je dat primjer jedne takve sparsne matrice. Slika 6. Sparsna matrica 5x5 upotrebom listi Inicijalizacijom sparsne matrice alocirana je memorija za PRVI i KRAJ od 8 bajtova (2x4 bajta). Za dva elemnta liste Cvor koji predstavljaju 2 i 3 red matrice alocirana je momorija od 24 bajta (2x12 bajtova). Za krajeve (Reda) je alocirana memorija od 8 bajtova (2x4 bajta). Za tri elementa liste Red alocirana je ukupna memorija od 36 bajtova (3x12 bajtova). Ukupna alocirana memorija za sparsnu matricu kao na slici 6 je 76 bajtova. Matrice na standardan način u programskom jeziku C se implementiraju upotrebom dvodimenzionalnih polja. Na primjer, matrica m veličine 5x5 (slika 7) čiji elementi su realni brojevi se u programskom jeziku C deklariše na sljedeći način: float m[5][5]; Na ovaj način je za 25 (25x4) elementa matrice ukupno alocirano 100 bajtova memorije. Slika 7. Sparsna matrica 5x5 upotrebom dvodimenzionalnih polja Deklaracijom dvodimenzionalnog polja, kao u predhodnom primjeru, se u suštini formira 5 jednodimenzionalnih polja sa oznakama m[0], m[1], m[2], m[3] i m[4] a koji predstavljaju pokazivače i sadrže adresu na prvi element u redu matrice kojeg predstavljaju. Naprimjer, m[0] sadrži adresu memorijske lokacije na kojoj se nalazi element m[0][0]. Dakle pored memorijske alokacije od 200 bajtova koju su izvršili elementi matrice (njih 25), memorijsku alokaciju vrše i predhodno navedeni pokazivači koji sadrže adrese lokacija na koje pokazuju, a za predhodni primjer njih je ukupno 5 što alocira dodatnu memoriju od 20 bajta (5x4 bajta). Ukupna alocirana memorija za sparsnu matricu m veličine 5x5 kao na slici 7 je 160 bajtova. Usporedbom predhodno opisana dva načina implementacije sparsne matrice, i sa ovako malim dimnezijama (5x5), pokazuje veliku razliku u alociranju memorije od 84 bajta u korist implementacije sparsnih matrica upotrebom listi (slika 6). Pretpostavimo sada da trebamo implementirati sparsnu matricu veličine 1000x1000 (milion elemenata) u kojoj se u 200 redova nalaze elementi različti od nula (0) a ukupan broj elemenata različitih od nula je 3000. Implementacijom predhodno zadate sparsne matrice upotrebom listi kao na slici 6, vrši se ukupna alokacija memorije od 39208 bajtova, a njena implementacija upotrebom dvodimenzionalnih polja kao na slici 7, vrši se ukupna alokacija memorije od 4004000 bajtova. Znači, za memorisanje navedene sparsne matrice upotrebom listi neophodno je 0,98% od ukupne memorije potrebne za memorisanje iste sparsne matrice upotrebom dvodimenzionalnih polja. Razlika bi bila još veća da su se za i elemenata matrice koristili brojevi s pokretnim zarezom u dvostrukoj preciznosti (double). DODATAK Datoteke sa izvornim kodom kao i izvrsni program se može preuzeti sa linka : www.bih5.net/djulaga.hadzic/nir/sparsnematrice.zip LITERATURA [1] Aho A.V., Hopcroft J.E., Ulman J.D., Data Structures and Algorithms, 2nd edition. Addison-Wesley, Reading MA, 1987 [2] Horowitz E., Sahni S., Anderson-Freed S., Fundamentals of Data Structures in C. W.H. Freeman& Co., New York, 1992. [3] By Brian W. Kernighan and Dennis M. Ritchie, Prentice-Hall, 1988 [4] B. S. Gottfried, Theory and Problems of Programming with C, Schaum's outline series, McGraw-Hill, 1996 [5] S. P. Harbison III, G. L. Steele Jr., C, A Reference Manual, Fifth Edition, Prentice Hall, 2002 ABSTRACT This paper gives the basic elements of spars matrices and possibilities of its implementation in computer systems. This paper describe and demonstrate implementation spars matrices use linked lists in compute language C. On this way, the requirement resources (memory) of computer systems for allocation this matrices are lesser, and the speed of execute some operations on one is considerably increase. In the end of paper, there are some results which are achieved comparative use of resources of computer systems by implementation of spars matrices in standard way like 2Ddimension, and by implementation of spars matrices on way described in this paper. IMPLEMENTATION OF SPARS MATRICS USE LISTS IN PROGRAM LANGUAGE C Đulaga Hadžić, Nermin Sarajlić 465