STRUKTURA TË DHËNASH
Leksioni 2 – Listat dhe Implementimi i tyre
UNYT - Educating Tomorrow's Leaders
1
Listat dhe Implementimi i tyre Prezantuar nga Dr. Ervin Ramollari Departamenti i Shkencave Kompjuterike
[email protected]
UNYT - Educating Tomorrow's Leaders
2
Permbajtja • Listat • Listat e lidhura • Implementimi i listave me vektore (arrays) dhe me lista te lidhura • Listat rrethore • Listat e lidhura dyfishe
UNYT - Educating Tomorrow's Leaders
3
Lista si Tip Abstrakt te Dhenash • Veprimet (operacionet) e mundshme mbi te dhenat: – Krijo nje liste bosh – Fshije te gjithe listen – A eshte bosh ? – Num. i elementeve ne liste – Shto nje element ne nje pozicion te caktuar ne liste – Fshi nje element – Lexo vleren e nje elementi – TAD liste e renditur (i mban elementet ne rend) UNYT - Educating Tomorrow's Leaders
4
Shembull i nje TAD: Lista
UNYT - Educating Tomorrow's Leaders
5
Shembull i nje TAD: Lista
UNYT - Educating Tomorrow's Leaders
6
Listat e lidhura
UNYT - Educating Tomorrow's Leaders
7
Implementimi i listave me vektor (array) • Lista si tip abstrakt te dhenash (ADT) mund te implementohet me vektor (array) – Ka madhesi fikse – Duhet krijuar vektor me permasa te reja sa here kalohet kapaciteti – Elementet jane ngjitur me njeri tjetrin ne memorje – Sa here shtohet apo fshihet nje element, duhet zhvendosur e gjithe pjesa – Jo-eficiente ne lidhje me kohen 1-8
Ndryshimi i madhesise se vektoreve • Shembull int max_size = 50; double [] myArray = new double[max_size]; ... double [] newArray = new double[new_ capacity]; for (int i = 0; i < myArray.length; i++) { newArray[i] = myArray[i] } myArray = newArray; UNYT - Educating Tomorrow's Leaders
9
Listat e lidhura • Listat e lidhura (ang. linked lists) perdoren per te ruajtur elemente te dhenash qe nuk jane te ngjitur me njeri tjetrin – fizikisht mund te ndodhen ne vende te ndryshme te memorjes
• Cdo element lidhet me elementin pasues me ane te nje reference (ang. pointer), si ne nje zinxhir – Elementi pasues mund te ndodhet fizikisht kudo – Ky fleksibilitet lejon qe te shtohen dhe te fshihen elemente pa zhvendosur te dhenat UNYT - Educating Tomorrow's Leaders
10
Listat e lidhura • Veprimet e shtimit dhe fshirjes se nje elementi jane te shpejta dhe eficiente
UNYT - Educating Tomorrow's Leaders
11
Listat e lidhura • Cdo element ne listen e lidhur quhet nyje (ang. node) • Lista e lidhur perbehet nga nje koleksion nyjesh te lidhura me njeri-tjetren, te krijuara ne menyre dinamike • Cdo nyje perbehet nga 1. elementi i te dhenave 2. nje reference per tek nyja pasuese ne liste
• Per te patur akses ne elementet e listes, ruajme referencen per tek nyja e pare, qe quhet koka (header) • Nyja e fundit ne liste ka nje reference qe eshte null e cila shenon fundin e listes 1-12
Implementimi i nyjes ne Java (ListNode) class ListNode { Object element; ListNode next; }
1-13
Rishikim i referencave (ang. references / pointers)
UNYT - Educating Tomorrow's Leaders
14
Rishikim i referencave (ang. references / pointers) a) Deklarimi i dy variblave te referencave b) alokimi i nje objekti te ri c) alokimi i nje objekti te ri, duke e caktuar objektin e c’referencuar per fshirje
UNYT - Educating Tomorrow's Leaders
15
Rishikim i referencave (ang. references / pointers) e) alokimi i nje objekti te ri f) dhenia e vleres null nje reference g) barazimi me referencen null
UNYT - Educating Tomorrow's Leaders
16
Nje liste e lidhur bazike
Ne mund te printojme ose kerkojme ne listen e lidhur duke filluar nga nyja e apre dhe duke ndjekur zinxhirin e lidhjeve pasuese. Dy veprime baze qe duhet te kryhen jane shtimi dhe fshirja e nje elementi cfaredo, x. 1-17
Shtimi nje nyjeje
Ne kod: tmp = new ListNode( ); // Create a new node tmp.element = x; // Place x in the element member tmp.next = current.next; // x's next node is b current.next = tmp; // a's next node is x 1-18
Shtimi i nje nyjeje • Ne mund ta thjeshtojme kodin nese ListNode kane nje konstruktor qe i inicializon atributet direkt. Ne kete rast, perftojme: tmp = new ListNode( x, current.next ); current.next = tmp;
• Tani tmp nuk nevojitet me. Pra gjithcka me nje rresht kod: current.next = new ListNode( x, current.next );
1-19
Fshirja
Per ta hequr elementin x nga lista e lidhur, e vendosim referencen current tek nyja para x, dhe referencen pasuese e ndryshojme qe ta tejkaloje nyjen x.
Ne kod: current.next = current.next.next; 1-20
Nyja e pare • Supozuam se kur fshijme nje element x, ekziston nje element paraardhes, per te lejuar tejkalimin e nyjes x • Si mund ta heqim elementin e pare? Rast special. • Ne menyre te ngjashme, shtimi i nje elementi sic u pershkrua me siper, nuk na lejon ta shtojme si elementin e pare te listes . • Perseri, shtimi i elementit te pare eshte nje rast special.
1-21
Nyja e pare
Nyja e pare (header) nuk permban te dhena, por sherben per te plotesuar kushtin qe cdo nyje duhet te kete nje nyje paraardhese. Nyja e pare na lejon qe te shmangim rastet e vecanta si shtimi i nje elementi te pare dhe fshirja e elementit te pare.
1-22
Lista bosh
Me nje nyje te pare bosh, lista eshte bosh nese header.next eshte null
1-23
Implementimi
124
Pozicioni aktual (current) • Duke ruajtur pozicionin aktual ne nje liste, ne referencen current, ne sigurohemi qe aksesi eshte i kontrolluar • Meqenese aksesi ne liste behet nepermjet metodave te klases, ne mund te sigurohemi qe current gjithmone perfaqeson nje nyje ne liste, nyjen e pare, ose null.
1-25
Iteratoret • Skema me pozicionin aktual (current) ka nje problem: Me nje pozicion te vetem, rasti i dy iteratoreve qe duhet te aksesojne listen ne menyre te pavarur nuk suportohet. • Nje menyre per ta shmangur kete problem eshte te perkufizojme nje klase me vete iterator, e cila mban pozicionin aktual. • Klasa e listes me pas nuk e ruan pozicionin aktual dhe do kishte vetem metoda qe e trajtojne listen si nje njesi, si psh isEmpty dhe makeEmpty, ose qe e pranojne nje iterator si parameter, si psh insert
1-26
Iteratoret • Veprimet qe varen vetem nga iteratori, si per shembull veprimet per te avancuar iteratorin ne elementin tjeter, i perkasin klases iterator. • Aksesi ne atributet e listes mundesohet duke e bere iteratorin nje klase te brendshme. • Mbi klasen e iteratorit lejohen vetem veprimet legale, si per shembull, avancimi ne liste.
1-27
Shembull: Perdorimi i iteratorit
E inicializojme itr me elementin e pare ne listen theList (duke shmangur elementin e pare sigurisht) duke referencuar iteratorin e dhene nga List.first(). Testi itr.isValid() eshte njesoj me testin p!=null qe do kryhej nese p eshte reference e dukshme per ne nje nyje. Shprehja itr.advance() eshte njesoj me p=p.next. 1-28
Current: helps to maintain the notion of the current position
1-29
Header node
1-30
1-31
static printList(List)
1-32
find( X )
1-33
remove( X )
1-34
findPrevious( X )
1-35
insert (X )
1-36
Listat e Lidhura Dyfishe (ang. Doubly Linked Lists) • Listat e lidhura te thjeshta nuk jane eficiente per disa veprime • Per shembull, edhe pse eshte e thjeshte te shkosh ne fillim te listes, nevojitet kohe qe te arrish deri ne fund te saj • Per kete arsye, mbajme nje reference te dyte per tek elementi i fundit te listes (tail) • Ne cdo nyje kemi dy referenca, nje per tek nyja pasardhese (next) dhe nje reference per tek lista paraardhese (previous) 1-37
Nje liste e lidhur dyfishe
1-38
Lista boshe
1-39
Listat e lidhura rrethore • Ang. circularly linked list • Referenca e nyjes se fundit lidhet me nyjen e pare • Zakonisht nuk ka nevoje per nyjen e pare bosh • Navigimi ndodh ne menyre ciklike, pra nuk perfundon me “tail” por rikthehet perseri tek nyja e pare “header”
UNYT - Educating Tomorrow's Leaders
40
Per lexim • Mark A. Weiss, “Data Structures and Problem Solving Using Java”, 4/E., Addison-Wesley, 2010 – Kapitulli 17
UNYT - Educating Tomorrow's Leaders
41
Faleminderit! www.unyt.edu.al UNYT - Educating Tomorrow's Leaders
42