Algorytmy i Struktury Danych. - Liniowe struktury danych
Transkrypt
Algorytmy i Struktury Danych. - Liniowe struktury danych
Algorytmy i Struktury Danych. Liniowe struktury danych - Lista uporzadkowana. ˛ Wartownicy. Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 1 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej Algorytm dołaczania ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 2 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej Algorytm dołaczania ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; ˛ Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Dołaczany ˛ element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 2 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej Algorytm dołaczania ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: List-Insert(L,x) if head [L] = NIL then head [L] := x; next[x] := NIL; else y := head [L]; z := NIL; while (y! = NIL) and (key[x] > key[y]) do z := y; y := next[y]; end while next[x] = y; next[z] = x; end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 3 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej Złożoność Procedura List-Insert(L, x) przyłacza ˛ element x (dla którego pole key zostało wcześniej zainicjowane) na wskazane porzadkiem ˛ miejsce listy jednokierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć miejsce dla elementu x, to pesymistyczny czas działania procedury List-Insert na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 4 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej - pewna implementacja Definicja listy jednokierunkowej typedef long T; typedef struct NODE { T value; struct NODE* next; } Node; typedef struct { Node* first; Node* last; } List; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 5 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy jednokierunkowej - pewna implementacja int insert (List *L, T nazwa); int insert (List *L, T value) { Node *new, *curr, *prev; new= (Node*)malloc(sizeof(Node)); /* Utwórz element Node*/ if(new == NULL){ /* weryfikacja przydzielonej pamieci*/ printf("Nie udalo sie przydzielic pamieci"); return 1; } else{ /* Ustal dane elementarne w Node*/ new-> value = value; new-> next= NULL; } if( L->first == NULL) { L->first = new; } else{ /* Znajdz miejsce wstawienia */ curr = L->first; prev = NULL; while((curr!= NULL) && (value > curr->value)){ prev= curr; curr= curr-> next; } /*Wstaw element w miejsce miedzy prev a curr*/ new->next= curr; if (prev != NULL) prev->next= new; else L->first = new; } return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 6 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej Algorytm dołaczania ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 7 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej Algorytm dołaczania ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; ˛ Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Dołaczany ˛ element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 7 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej Algorytm dołaczania ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: List-Insert2(L,x) if head[L] = NIL then head[L] := x ; next[x ] := NIL; prev [x ] := NIL else y := head[L]; while (y ! = NIL) and (key [x ] > key [y ]) do y := next[y ]; end while if y ! = NIL then next[x ] := y ; prev [x ] := prev [y ]; next[prev [y ]] := x ; prev [y ] := x ; end if else next[x ] := NIL; prev [x ] = tail[L]; next[tail[L]] := x ; tail[L] := x ; end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 8 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej Złożoność Procedura List-Insert2(L, x) przyłacza ˛ element x (dla którego pole key zostało wcześniej zainicjowane) na wskazane porzadkiem ˛ miejsce listy dwukierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć miejsce dla elementu x, to pesymistyczny czas działania procedury List-Insert2 na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 9 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej - pewna implementacja Definicja listy dwukierunkowej typedef long T; typedef struct NODE { T value; struct NODE* next; struct NODE* prev; } Node; typedef struct { Node* first; Node* last; } List2; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 10 / 28 Dołaczanie ˛ elementu do uporzadkowanej ˛ listy dwukierunkowej - pewna implementacja int insert (List2 *L, T value); int insert (List2 *L, T value) { // Zadanie na ćwiczenia // Napisz definicje !!! } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 11 / 28 Usuwanie elementu z uporzadkowanej ˛ listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy jednokierunkowej Cel: Usuniecie ˛ danego elementu z uporzadkowanej ˛ listy jednokierunkowej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 28 Usuwanie elementu z uporzadkowanej ˛ listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy jednokierunkowej Cel: Usuniecie ˛ danego elementu z uporzadkowanej ˛ listy jednokierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 28 Usuwanie elementu z uporzadkowanej ˛ listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy jednokierunkowej Cel: Usuniecie ˛ danego elementu z uporzadkowanej ˛ listy jednokierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Algorytm - schemat Jeżeli dane sa˛ zgodne z danymi pierwszego elementu listy, usuń pierwszy element listy; Znajdź element do usuniecia ˛ na liście; Jeżeli znaleziono, usuń znaleziony element z listy; Jeżeli nie znaleziono elementu, generuj komunikat; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 28 Usuwanie elementu z uporzadkowanej ˛ listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy jednokierunkowej List-Del(L,x) 1: if head[L]! = NIL then 2: if head[L] = x then 3: head[L] := next[x ]; 4: else 5: y := head[L]; 6: while (next[y ]! = x ) do 7: y := next[y ]; 8: end while 9: next[y ] := next[x ]; 10: end if 11: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 13 / 28 Usuwanie elementu z uporzadkowanej ˛ listy jednokierunkowej Złożoność Procedura List-Del(L, k) usuwa element o kluczu k z uporzadkowanej ˛ listy jednokierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element o kluczu k, to pesymistyczny czas działania procedury List-Del na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 14 / 28 Usuwanie elementu z uporzadkowanej ˛ listy jednokierunkowej - pewna implementacja int delete(List *L, T value); int delete(List *L, T value){ Node *prev, *curr, *temp; if(L->first== NULL) return 1; /* Lista pusta */ else{ if(value == L->first->value){ temp = L->first; L->first = L->first->next; free(temp); }else{ /* znajdz w liscie element do usuniecia*/ prev = L->first; curr = L->first->next; while(curr != NULL && curr->value != value) { prev= curr; curr = curr->next; } if(curr == NULL) return 1; /* element nie zostalznaleziony */ else{ /* Usun znaleziony element */ temp = currPtr; prev->next= curr->next; free(temp); } } } return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 15 / 28 Usuwanie elementu z uporzadkowanej ˛ listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy dwukierunkowej Cel: Usuniecie ˛ danego elementu z uporzadkowanej ˛ listy dwukierunkowej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 28 Usuwanie elementu z uporzadkowanej ˛ listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy dwukierunkowej Cel: Usuniecie ˛ danego elementu z uporzadkowanej ˛ listy dwukierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 28 Usuwanie elementu z uporzadkowanej ˛ listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy dwukierunkowej Cel: Usuniecie ˛ danego elementu z uporzadkowanej ˛ listy dwukierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Algorytm - schemat Jeżeli dane sa˛ zgodne z danymi pierwszego elementu listy, usuń pierwszy element listy; Znajdź element do usuniecia ˛ na liście; Jeżeli znaleziono, usuń znaleziony element z listy; Jeżeli nie znaleziono elementu, generuj komunikat; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 28 Usuwanie elementu z uporzadkowanej ˛ listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej ˛ listy dwukierunkowej List-Insert2(L,x) 1: if head[L]! = NIL then 2: if key [head[L]] = key [x ]; then 3: head[L] := next[x ]; prev [head[L]] := NIL 4: else 5: y := head[L]; z := NIL; 6: while (key [x ]! = key [y ]) do 7: z := y ; y := next[y ]; 8: end while 9: if y ! = NIL then 10: next[z] := next[y ]; prev [next[y ]] := z; 11: end if 12: end if 13: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 17 / 28 Usuwanie elementu z uporzadkowanej ˛ listy dwukierunkowej Złożoność Procedura List-Del2(L, k) usuwa element o kluczu k z uporzadkowanej ˛ listy dwukierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element o kluczu k, to pesymistyczny czas działania procedury List-Del2 na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 18 / 28 Usuwanie elementu z uporzadkowanej ˛ listy dwukierunkowej - pewna implementacja int delete (List2 *L, T value); int delete (List2 *L, T value) { // Zadanie na ćwiczenia // Napisz definicje !!! } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 19 / 28 Wartownicy Wartownik jest sztucznym elementem, który pozwala uprościć warunki brzegowe. Przyjmijmy dla przykładu, iż z dwukierunkowa˛ lista˛ L jest zwiazany ˛ element nil[L], który odgrywa role stałej NIL, ale jest rekordem o takich samych polach jak wszystkie zwykłe elementy listy. Każde wystapienie ˛ stałej NIL w naszych procedurach zamieniamy na wskaźnik do wartownika nil[L]. Sprawia to, że zwykła lista dwukierunkowa staje sie w istocie lista˛ cykliczna, w której wartownik nil[L] znajduje sie˛ miedzy ˛ głowa˛ a ogonem. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 20 / 28 Wartownicy Pole next[nil[L]] wskazuje na głowe listy, a pole prev[nil[L]] wskazuje na ogon listy. Ponieważ pole next[nil[L]] wskazuje na głowe˛ listy nie ma potrzeby pamietania ˛ atrybutu head[L]. Wystarczy zastapić ˛ wszystkie odwołania do niego przez next[nil[L]]. Lista pusta składa sie˛ z samego wartownika i wtedy oba pola next[nil[L]] oraz prev[nil[L]] wskazuja˛ na nil[L]. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 21 / 28 Wartownicy Wartownik zaznaczony został kolorem ciemnoszarym. Jest to cykliczna lista dwukierunkowa, w której wartownik znajduje sie˛ zawsze miedzy ˛ głowa˛ a ogonem. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 22 / 28 Wartownicy Wartownik zaznaczony został kolorem ciemnoszarym. Jest to cykliczna lista dwukierunkowa, w której wartownik znajduje sie˛ zawsze miedzy ˛ głowa˛ a ogonem. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 23 / 28 Wstawianie elementu do listy dwukierunkowej z wartownikiem Algorytm wstawienia elementu do listy dwukierunkowej z wartownikiem Cel: Wstawianie danego elementu do listy dwukierunkowej z wartownikiem; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 28 Wstawianie elementu do listy dwukierunkowej z wartownikiem Algorytm wstawienia elementu do listy dwukierunkowej z wartownikiem Cel: Wstawianie danego elementu do listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do wstawienia; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 28 Wstawianie elementu do listy dwukierunkowej z wartownikiem Algorytm wstawienia elementu do listy dwukierunkowej z wartownikiem Cel: Wstawianie danego elementu do listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do wstawienia; Ponieważ można pominać ˛ warunki brzegowe dotyczace ˛ głowy i ogona listy, treść procedury List-Insert-Begin(L, x) znacznie sie˛ uprościła: List-Insert-Begin(L,x) 1: prev[next[nil[L]]] := x; 2: next[nil[L]] := x; 3: prev[x] := nil[L]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 28 Usuwanie elementu z listy dwukierunkowej z wartownikiem Algorytm usuwania elementu z listy dwukierunkowej z wartownikiem Cel: Usuniecie ˛ wskazanego elementu z listy dwukierunkowej z wartownikiem; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 28 Usuwanie elementu z listy dwukierunkowej z wartownikiem Algorytm usuwania elementu z listy dwukierunkowej z wartownikiem Cel: Usuniecie ˛ wskazanego elementu z listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do usuniecia; ˛ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 28 Usuwanie elementu z listy dwukierunkowej z wartownikiem Algorytm usuwania elementu z listy dwukierunkowej z wartownikiem Cel: Usuniecie ˛ wskazanego elementu z listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do usuniecia; ˛ Ponieważ można pominać ˛ warunki brzegowe dotyczace ˛ głowy i ogona listy, treść procedury LIST-DELETE-2 znacznie sie˛ uprościła: List-Delete-2(L,x) 1: next[prev[x]]:= next[x]; 2: prev[next[x]]:= prev[x]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 28 Wartownicy Lista ze slajdu 23 po wykonaniu procedury List-Insert-Begin(L, x), gdzie element wstawiany key[x]=3. Nowy element został umieszczony w głowie listy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 26 / 28 Wartownicy Lista po usunieciu elementu o kluczu 1. W ogonie znajduje sie teraz element o kluczu 4. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 27 / 28 Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście dwukierunkowej z wartownikiem Cel: Wyszukanie elementu na liście z wartownikiem; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 28 Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście dwukierunkowej z wartownikiem Cel: Wyszukanie elementu na liście z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Kryterium poszukiwania, np. wartość danej elementarnej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 28 Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście dwukierunkowej z wartownikiem Cel: Wyszukanie elementu na liście z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Kryterium poszukiwania, np. wartość danej elementarnej; Algorytm: List-Search(L,k) 1: x := next[nil[L]]; 2: while (x!=NIL and key[x]!=k) do 3: x := next[x]; 4: end while 5: return x; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 28