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