Algorytmy i Struktury Danych.

Podobne dokumenty
Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Lista, Stos, Kolejka, Tablica Asocjacyjna

Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:


Struktura danych. Sposób uporządkowania informacji w komputerze. Na strukturach danych operują algorytmy. Przykładowe struktury danych:

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Kurs programowania. Wykład 9. Wojciech Macyna

Dynamiczne struktury danych

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

Algorytmy i Struktury Danych.

Paradygmaty programowania. Paradygmaty programowania

Programowanie w języku Java. Kolekcje

Dynamiczne struktury danych

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Java Collections Framework

Algorytmy i Struktury Danych.

Kolekcje w Javie cz. 1

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych

Platformy Programistyczne Podstawy języka Java

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Algorytmy i Struktury Danych.

Wydział Fizyki i Informatyki Stosowanej, Uniwersytetu Łódzkiego Łódź. Java podstawy języka, wykład 4 1

Programowanie Obiektowe (Java)

Wstęp do programowania

Stos LIFO Last In First Out

Algorytmy i. Wykład 3: Stosy, kolejki i listy. Dr inż. Paweł Kasprowski. FIFO First In First Out (kolejka) LIFO Last In First Out (stos)

Programowanie i struktury danych

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Programowanie obiektowe

Struktury danych: stos, kolejka, lista, drzewo

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Wykład 4. Klasa List Kolejki Stosy Słowniki

Porządek symetryczny: right(x)

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych

Algorytmy i Struktury Danych.

Kolekcje - pakiet Java Collections Framework

Algorytmy i Struktury Danych.

Lista dwukierunkowa - przykład implementacji destruktorów

Listy, kolejki, stosy

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Podstawy programowania obiektowego

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Podstawowe struktury danych

E S - uniwersum struktury stosu

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Podstawy otwartych języków programowania Przechowywanie danych

Kolekcje - pakiet Java Collections Framework

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

KOLEJKA (QUEUE) (lista fifo first in, first out)

Algorytmy i Struktury Danych. Anna Paszyńska

Wykład 4: Klasy i Metody

Programowanie i struktury danych 1 / 44

Programowanie obiektowe

java.util.* :Kolekcje Tomasz Borzyszkowski

Dawid Gierszewski Adam Hanasko

Drzewa wyszukiwań binarnych (BST)

Struktury dynamiczne

Programowanie w języku C++

Programowanie obiektowe

Wykład 6. Dynamiczne struktury danych

Wysokość drzewa Głębokość węzła

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Algorytmy i Struktury Danych.

Drzewa poszukiwań binarnych

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Wstęp do Programowania 2

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Struktury. Przykład W8_1

Marcin Matusiak i Łukasz Stasiak

dr inż. Paweł Myszkowski Wykład nr 11 ( )

Algorytmy i Struktury Danych.

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Programowanie i struktury danych

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Podejście obiektowe. Tablice (1) obiektów

Algorytmy i struktury danych. wykład 5

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Systemy Rozproszone - Ćwiczenie 6

Kolekcje. Na podstawie:

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wykład 3. Złożoność i realizowalność algorytmów Elementarne struktury danych: stosy, kolejki, listy

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium 7. 2 Drzewa poszukiwań binarnych

Struktury danych. przez użytkownika, jak to ma miejsce w przypadku zwykłych zmiennych statycznych.

Programowanie Proceduralne

Wykład 5: Więcej o Klasach i Metodach

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Wykład 6_1 Abstrakcyjne typy danych stos Realizacja tablicowa i za pomocą rekurencyjnych typów danych

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Transkrypt:

Algorytmy i Struktury Danych. Podstawowe struktury danych, cd. Wykład na podstawie ksiażki Roberta Sedgewicka i Kevina Wayne: Algorithms. Furth Edition. Princeton University dr hab. Bożena Woźna-Szcześniak Jan Długosz University, Poland Wykład 7 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 1 / 67

Parametryzowany stos o stałym rozmiarze I import java.util.nosuchelementexception; import java.util.scanner; import java.util.arrays; public class ArrayStack<Item> { private Item [] a; private int N; //Inicjalizacja pustego stosu. public ArrayStack(int size) { a = (Item[]) new Object[size]; // Zwraca true, gdy stos jest pusty public boolean isempty() { return N == 0 ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 2 / 67

Parametryzowany stos o stałym rozmiarze II //Zwraca liczbe elementow na stosie. public int size() { return N; // Dodaje element do stosu public void push(item item) { if (N >= a.length) throw new NoSuchElementException("Stos pelny"); a[n++] = item; //Usuwa element ze stosu public Item pop() { if (isempty()) throw new NoSuchElementException("Stos pusty"); Item item = a[--n]; // pozwala na zapobieganie wyciekom poamieci Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 3 / 67

Parametryzowany stos o stałym rozmiarze III a[n] = null; return item; //Zwraca szczyt stosu, ale go nie usuwa public Item peek() { if (isempty()) throw new NoSuchElementException("Stos pusty"); return a[n]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 4 / 67

Uwagi dotyczace stosu o stałym rozmiarze Rozmiar stosu jest stały. Problem z nadmiarem, tj. zgłaszany jest wyjatek przy próbie dodania nowego element do pełnego stosu. Pytanie: czy implementacja tablicowa stosu może być bardziej elastyczna, tzn. czy można w efektywny sposób zwiększać i zmniejszać tablice. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 5 / 67

Rozwiazanie problemu nadmiaru I Jeśli tablica jest pełna, utwórz nowa tablicę o rozmiarze dwukrotnie większym i skopiuj elementy. public class ResizeArrayStack <Item > { private Item [ ] a = ( Item [ ] ) new Object [ 1 ] ; private i n t N = 0; / / l i c z b a elementow. / / Dodaje element do stosu public void push ( Item item ) { / Usuwamy wyjatek i f (N >= a. length ) throw new NoSuchElementException ( " Stos pelny " ) ; / i f (N == a. length ) r e s i z e (2 a. l e n g t h ) ; a [N++] = item ; / / metoda przenosi stos o rozmiarze N <= max / / do nowej t a b l i c y o rozmiarze max Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 6 / 67

Rozwiazanie problemu nadmiaru II private void r e s i z e ( i n t max) { Item [ ] temp = ( Item [ ] ) new Object [ max ] ; for ( i n t i = 0; i < N; i ++) temp [ i ] = a [ i ] ; a = temp ; Koszt wstawienie pierwszych N elementów: N + (1 + 2 + 4 + 8 +... + N) 3N. 1 dostęp k operacji podwojenia do tablicy na 1 push tablicy Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 7 / 67

Rozwiazanie problemu nadmiaru III $ java ResizeArrayStack 256 ( Zwieksza :1) ( Zwieksza :2) ( Zwieksza :4) ( Zwieksza :8) ( Zwieksza :16) ( Zwieksza :32) ( Zwieksza :64) ( Zwieksza :128) Wykonanie dla $ java ResizeArrayStack 12 pokazujace Ilość elementów na stosie (N), jego rozmiar i zawartość. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 8 / 67

Rozwiazanie problemu nadmiaru IV Rozmiar push() N stosu Zawartość stos 0 1 null 0 1 1 0 1 2 2 0 1 2 3 4 0 1 2 null 3 4 4 0 1 2 3 4 5 8 0 1 2 3 4 null null null 5 6 8 0 1 2 3 4 5 null null 6 7 8 0 1 2 3 4 5 6 null 7 8 8 0 1 2 3 4 5 6 7 8 9 16 0 1 2 3 4 5 6 7 8 null null null null null null null 9 10 16 0 1 2 3 4 5 6 7 8 9 null null null null null null 10 11 16 0 1 2 3 4 5 6 7 8 9 10 null null null null null 11 12 16 0 1 2 3 4 5 6 7 8 9 10 11 null null null null 12 13 16 0 1 2 3 4 5 6 7 8 9 10 11 12 null null null Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 9 / 67

Rozwiazanie problemu nadmiaru pustego miejsca I Jeśli tablica jest w 1/4 pełna, zmniejsz tablicę o połowę. public Item pop ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Stos pusty " ) ; Item item = a[ N ] ; a [N] = null ; / / pozwala na zapobieganie wyciekom poamieci i f (N > 0 && N == a. l e n g t h / 4 ) r e s i z e ( a. length / 2 ) ; return item ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 10 / 67

Ślad zmiany rozmiaru tablicy a. Stos push pop N length 0 1 2 3 4 5 6 7 0 1 null wolne to 1 1 to wolne be 2 2 to be wolne or 3 4 to be or null wolne not 4 4 to be or not wolne to 5 8 to be or not to null null null - to 4 8 to be or not null null null null be 5 8 to be or not be null null null - be 4 8 to be or not null null null null - not 3 8 to be or null null null null null that 4 8 to be or that null null null null - that 3 8 to be or null null null null null - or 2 4 to be null null wolne - be 1 2 to null wolne is 2 2 to is wolne Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 11 / 67

Stos o zmiennym rozmiarze - ResizeArrayStack.java I import java. u t i l. NoSuchElementException ; import java. u t i l. Scanner ; import java. u t i l. Arrays ; public class ResizeArrayStack <Item > { private Item [ ] a = ( Item [ ] ) new Object [ 1 ] ; private i n t N = 0; public boolean isempty ( ) { return N == 0 ; public i n t size ( ) { return N; private void r e s i z e ( i n t max) { Item [ ] temp = ( Item [ ] ) new Object [ max ] ; for ( i n t i = 0; i < N; i ++) temp [ i ] = a [ i ] ; a = temp ; public void push ( Item item ) { i f (N == a. length ) r e s i z e (2 a. length ) ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 12 / 67

Stos o zmiennym rozmiarze - ResizeArrayStack.java II a [N++] = item ; public Item pop ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Stos pusty " ) ; Item item = a[ N ] ; a [N] = null ; i f (N > 0 && N == a. l e n g t h / 4 ) r e s i z e ( a. length / 2 ) ; return item ; public Item peek ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Stos pusty " ) ; return a [N ] ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 13 / 67

Implementacje stosu: tablicowa vs dynamiczna Implementacja dynamiczna (lista węzłów): Każda operacja wymaga stałego czasu, również w najgorszym przypadku. Wykorzystuje dodatkowy czas i pamięć na obsługę dowiazań. Tablicowa implementacja z tablica o zmiennym rozmiarze: Każda operacja wymaga stałego kosztu zamortyzowanego. 1 Mniej zmarnowanej pamięci. 1 Koszt zamortyzowany - miara złożoności obliczeniowej operacji na strukturze danych. Koszt zamortyzowany operacji jest średnim czasem wykonania przypadajacym na jedna operację w pesymistycznym ciagu operacji. Koszt zamortyzowany różni się od kosztu oczekiwanego tym, że bierze pod uwagę ciag operacji i nie jest metoda probabilistyczna Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 14 / 67

Parametryzowana kolejka o stałym rozmiarze I import java. u t i l. NoSuchElementException ; import java. u t i l. Scanner ; import java. u t i l. Arrays ; public class ArrayQueue <Item > { private Item [ ] a ; private i n t N; private i n t head ; private i n t t a i l ; public ArrayQueue ( i n t size ) { a = ( Item [ ] ) new Object [ size ] ; N=0; head = t a i l = 0; public boolean isempty ( ) { return N==0 ; public i n t size ( ) { return N; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 15 / 67

Parametryzowana kolejka o stałym rozmiarze II public void enqueue ( Item item ) { i f ( head == ( t a i l +1)%a. l e n g t h ) throw new NoSuchElementException ( " Kelejka pelna " ) ; a [ t a i l ++] = item ; i f ( t a i l == a. l e n g t h ) t a i l =0; N++; public Item dequeue ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Kolejka pusta " ) ; Item item = a [ head ] ; a [ head++]= null ; / / k o n t r o l a wycieku pamieci i f ( head == a. length ) head =0; N ; return item ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 16 / 67

Parametryzowana kolejka o stałym rozmiarze III public Item peek ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Kolejka pusta " ) ; return a [ head ] ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 17 / 67

Uwagi dotyczace kolejki o stałym rozmiarze Rozmiar kolejki jest stały. Problem z nadmiarem, tj. zgłaszany jest wyjatek przy próbie dodania nowego element do pełnej kolejki. Pytanie: czy implementacja tablicowa kolejki może być bardziej elastyczna, tzn. czy można w efektywny sposób zwiększać i zmniejszać tablice. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 18 / 67

Rozwiazanie problemu nadmiaru I Jeśli tablica jest pełna, utwórz nowa tablicę o rozmiarze dwukrotnie większym i skopiuj elementy. public class ResizeArrayQueue <Item > { private Item [ ] a ; private i n t N; / / rozmiar k o l e j k i private i n t head ; private i n t t a i l ; / / Dodaje element do k o l e j k i public void enqueue ( Item item ) { / i f ( head == ( t a i l +1)%a. l ength ) throw new NoSuchElementException ( " Kelejka pelna " ) ; / i f (N == a. length ) r e s i z e (2 a. l e n g th ) ; a [ t a i l ++] = item ; i f ( t a i l == a. l e n g t h ) t a i l =0; N++; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 19 / 67

Rozwiazanie problemu nadmiaru II / / metoda przenosi k o l e j k e o rozmiarze N <= max / / do nowej t a b l i c y o rozmiarze max private void r e s i z e ( i n t max) { a s sert max >= N; Item [ ] temp = ( Item [ ] ) new Object [ max ] ; for ( i n t i = 0; i < N; i ++) { temp [ i ] = a [ ( head + i ) % a. l ength ] ; a = temp ; head = 0; t a i l = N; Wykonanie dla $ java ResizeArrayQueue 12 pokazujace Ilość elementów w kolejce (N), jej rozmiar i zawartość. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 20 / 67

Rozwiazanie problemu nadmiaru III enque Rozmiar ue() N kolejki Zawartość kolejki 0 2 null null 1 1 2 1 null 2 2 2 1 2 3 3 4 1 2 3 null 4 4 4 1 2 3 4 5 5 8 1 2 3 4 5 null null null 6 6 8 1 2 3 4 5 6 null null 7 7 8 1 2 3 4 5 6 7 null 8 8 8 1 2 3 4 5 6 7 8 9 9 16 1 2 3 4 5 6 7 8 9 null null null null null null null 10 10 16 1 2 3 4 5 6 7 8 9 10 null null null null null null 11 11 16 1 2 3 4 5 6 7 8 9 10 11 null null null null null 12 12 16 1 2 3 4 5 6 7 8 9 10 11 12 null null null null Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 21 / 67

Rozwiazanie problemu nadmiaru pustego miejsca Jeśli tablica jest w 1/4 pełna, zmniejsz tablicę o połowę. public Item dequeue ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Kolejka pusta " ) ; Item item = a [ head ] ; a [ head++]= null ; / / k o n t r o l a wycieku pamieci N ; i f ( head == a. length ) head =0; i f (N > 0 && N == a. l e n g t h / 4 ) r e s i z e ( a. length / 2 ) ; return item ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 22 / 67

Ślad zmiany rozmiaru tablicy a. Kolejka enq deq N length 0 1 2 3 4 5 6 7 0 2 null null wolne 3 1 2 3 null wolne 4 2 2 3 4 wolne 5 3 4 3 4 5 null wolne 6 4 4 3 4 5 6 wolne 3 5 8 3 4 5 6 3 null null null 3 4 8 null 4 5 6 3 null null null 4 5 8 null 4 5 6 3 4 null null 4 4 8 null null 5 6 3 4 null null 5 3 8 null null null 6 3 4 null null 7 4 8 null null null 6 3 4 7 null 6 3 8 null null null null 3 4 7 null 3 2 4 4 7 null null wolne 4 1 2 7 null wolne 8 2 2 7 8 wolne Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 23 / 67

Implementacje kolejki: tablicowa vs dynamiczna Implementacja dynamiczna (lista węzłów): Każda operacja wymaga stałego czasu, również w najgorszym przypadku. Wykorzystuje dodatkowy czas i pamięć na obsługę dowiazań. Tablicowa implementacja z tablica o zmiennym rozmiarze: Każda operacja wymaga stałego kosztu zamortyzowanego. Mniej zmarnowanej pamięci. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 24 / 67

Parametryzowana kolejka o zmiennym rozmiarze I import java. u t i l. NoSuchElementException ; import java. u t i l. Scanner ; import java. u t i l. Arrays ; public class ResizeArrayQueue <Item > { private Item [ ] a ; private i n t N; private i n t head ; private i n t t a i l ; public ResizeArrayQueue ( ) { a = ( Item [ ] ) new Object [ 2 ] ; head = t a i l = 0; N=0; public boolean isempty ( ) { return N==0 ; public i n t size ( ) { return N; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 25 / 67

Parametryzowana kolejka o zmiennym rozmiarze II private void r e s i z e ( i n t c a p a c i t y ) { assert capacity >= N; Item [ ] temp = ( Item [ ] ) new Object [ c a p acity ] ; for ( i n t i = 0; i < N; i ++) { temp [ i ] = a [ ( head + i ) % a. l e ngth ] ; a = temp ; head = 0; t a i l = N; / / Dodaje element do k o l e j k i public void enqueue ( Item item ) { i f (N == a. l e n g t h ) r e s i z e (2 a. l e n gth ) ; a [ t a i l ++] = item ; N++; i f ( t a i l == a. l e n g t h ) t a i l =0; / / Usuwa element z k o l e j k i Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 26 / 67

Parametryzowana kolejka o zmiennym rozmiarze III public Item dequeue ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Kolejka pusta " ) ; Item item = a [ head ] ; a [ head++] = null ; N ; i f ( head == a. length ) head =0; i f (N > 0 && N == a. l e n g t h / 4 ) r e s i z e ( a. length / 2 ) ; return item ; / / Zwraca poczatek k o l e j k i, ale go nie usuwa public Item peek ( ) { i f ( isempty ( ) ) throw new NoSuchElementException ( " Kolejka pusta " ) ; return a [ head ] ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 27 / 67

Lista Lista - struktura danych, w których elementy sa ułożone w liniowym porzadku. Porzadek na liście określaja wskaźniki zwiazane z każdym elementem listy. Lista jedno- i dwukierunkowa - notacja wspólna head[l] - pierwszy element listy L. Jeżeli head[x]=nil to lista jest pusta. tail[l] - ostatni element listy L. key[x] - klucz znajdujacy się w węźle x. next[x] - następnik elementu x. Jeżeli next[x]=nil to x nie ma następnika, jest więc ostanim elementem listy (tzw. ogon). Lista dwukierunkowa - notacja dodatkowa prev[x] - poprzednik elementu x. Jeżeli prev[x]=nil to x nie ma poprzednika, jest więc pierwszym elementem listy (tzw. głowa). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 28 / 67

Lista jedno- i dwu kierunkowa - schemat Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 29 / 67

Podstawowe operacje na listach Dodawanie elementu do listy Wyszukiwanie elementu na liście Usuwanie elementu z listy Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 30 / 67

Dodawanie elementu do listy jednokierunkowej na poczatek Dane wejściowe: Położenie pierwszego elementu listy; Dodawany klucz; Algorytm: List-add-front(List L,Item item) 1: Utwórz nowy węzeł x; 2: key[x] := item; 3: next[x] := head[l]; 4: if head[l] = NULL then 5: head[l] := x; 6: tail[l] := x; 7: else 8: head[l] := x; 9: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 31 / 67

Dodawanie elementu do listy jednokierunkowej na poczatek Złożoność Procedura List-add-front(List L,Item item) owy węzeł zawierajacy klucz item na poczatek listy jednokierunkowej. Procedura List-add-front na liście o n elementach działa w czasie O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 32 / 67

Dodawanie elementu do listy jednokierunkowej na koniec Dane wejściowe: Położenie ostatniego elementu na liście; Dodawany klucz; Algorytm: List-add-back(List L,Item item) 1: Utwórz nowy węzeł x; 2: key[x] := item; 3: next[x] := NULL; 4: if head[l] = NULL then 5: head[l] := x; 6: tail[l] := x; 7: else 8: next[tail[l]] := x; 9: tail[l] := x; 10: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 33 / 67

Dodawanie elementu do listy jednokierunkowej na koniec Złożoność Procedura List-add-back(List L,Item item) dodaje nowy węzeł zawierajacy klucz item na koniec listy jednokierunkowej. Procedura List-add-back na liście o n elementach działa w czasie O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 34 / 67

Węzeł listy jednokierunkowej class Node<T> { private T data ; private Node<T> next ; public Node ( T data, Node<T> next ) { this. data = data ; this. next = next ; public void setdata ( T data ) { this. data = data ; public void setnext ( Node<T> next ) { this. next = next ; public T getdata ( ) { return data ; public Node<T> getnext ( ) { return next ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 35 / 67

Dodawanie elementu do listy na poczatek i na koniec I public class L i s t <T> implements I t e r a b l e <T> { private i n t n = 0; / / l i c z b a elementow l i s t y private Node<T> f i r s t ; / / poczatek l i s t y private Node<T> l a s t ; / / koniec l i s t y public L i s t ( ) { f i r s t = null ; l a s t = null ; public boolean isempty ( ) { return n == 0; public i n t size ( ) { return n ; public Node<T> gethead ( ) { return f i r s t ; public Node<T> g e t T a i l ( ) { return l a s t ; public void add_front ( T item ) { Node<T> p = new Node<T>( item, n u l l ) ; n++; i f ( f i r s t == null ) { f i r s t = l a s t = p ; else { p. setnext ( f i r s t ) ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 36 / 67

Dodawanie elementu do listy na poczatek i na koniec II f i r s t = p ; public void add_back ( T item ) { Node<T> p = new Node<T>( item, n u l l ) ; n++; i f ( f i r s t == null ) { f i r s t = l a s t = p ; else { l a s t. setnext ( p ) ; l a s t = p ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 37 / 67

Iterowanie I Cel: Dodać obsługę iteracji po elementach listy, bez ujawniania jej wewnętrznej reprezentacji. i N Ala ma kota a kot ma mysz null null null 0 1 2 3 4 5 6 7 8 9 first current Ala ma kota a kot ma mysz Utwórz listę implementujac a interfejs import java.util.iterator. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 38 / 67

Iterowanie II Czym jest interfejs Iterable w Javie? Interfejs Iterable ma tylko jedna metodę o nazwie iterator(). Metoda iterator() musi zwrócić iterator, który może być użyty do iteracji elementów obiektu implementujacego interfejs Iterable. Definicja interfejsu Iterable: public interface I t e r a b l e <T> { public I t e r a t o r <T> i t e r a t o r ( ) ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 39 / 67

Iterowanie III Czym jest Iterator w Javie? Interfejs Iterator posiada metody hasnext() oraz next(). Metoda bool hasnext() sprawdza, czy istnieje następny element w pewnej kolekcji (liście). Metoda T next() zwraca element na ktury pokazuje iterator i przesuwa iterator do następnego elementu. Definicja interfejsu Iterator: public interface I t e r a t o r <T> { public boolean hasnext ( ) ; public T next ( ) ; public void remove ( ) ; / / mozna pominac Zobacz: http://tutorials.jenkov.com/java-generics/ implementing-iterable.html Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 40 / 67

Iterowanie IV import java. u t i l. I t e r a t o r ; public class L i s t <T> implements I t e r a b l e <T> { / /... zawrtosc klasy z poprzedniego s l a j d u / /... plus to co p o n i z e j public I t e r a t o r <T> i t e r a t o r ( ) { return new L i s t I t e r a t o r ( this ) ; private class L i s t I t e r a t o r implements I t e r a t o r <T> { private Node<T> c u r r e n t ; public L i s t I t e r a t o r ( L i s t <T> l i s t ) { c u r r e n t = l i s t. gethead ( ) ; public boolean hasnext ( ) { return c u r r e n t!= null ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 41 / 67

Iterowanie V public void remove ( ) { throw new UnsupportedOperationException ( ) ; public T next ( ) { i f (! hasnext ( ) ) throw new NoSuchElementException ( ) ; T item = c u r r e n t. getdata ( ) ; c u r r e n t = c u r r e n t. getnext ( ) ; return item ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 42 / 67

Iterowanie VI Dlaczego warto używać interfejsu Iterable? Dostajemy elegancki kod przy pomycy konstrukcji "foreach": public class L i s t <T> implements I t e r a b l e <T> {... public void show ( ) { I t e r a t o r <T> i = this. i t e r a t o r ( ) ; while ( i. hasnext ( ) ) System. out. p r i n t ( i. next ( ) + " " ) ; System. out. p r i n t l n ( ) ; public void show2 ( ) { for ( T item : this ) System. out. p r i n t ( item + " " ) ; System. out. p r i n t l n ( ) ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 43 / 67

Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście jednokierunkowej Cel: Wyszukanie elementu na liście; Dane wejściowe: Położenie pierwszego elementu listy; Kryterium poszukiwania, np. wartość danej elementarnej; Algorytm: List-Search(Lista L,klucz k) 1: x := head[l]; 2: while (x!= NULL 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 7 44 / 67

Wyszukiwanie elementu na liście Złożoność Procedura List-Search(L, k) wyznacza pierwszy element o kluczu k na liście L. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element o kluczu k, to pesymistyczny czas działania procedury List-Search na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 45 / 67

Implementacja metody w klasie List I public class L i s t <T> implements I t e r a b l e <T> {... public Node<T> search ( T k ) { Node<T> p = this. f i r s t ; while ( ( p!= null ) && ( p. getdata ( )!= k ) ) p = p. getnext ( ) ; return p ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 46 / 67

Usuwanie wskazanego elementu z listy jednokierunkowej Dane wejściowe: Położenie pierwszego elementu listy; Element do usunięcia; Algorytm: List-Delete(L,x) 1: if (x == head[l]) then 2: head[l] := next[x]; 3: else 4: y := head[l]; 5: while (next[y]!=x) do 6: y := next[y]; 7: end while 8: next[y]:= next[x]; 9: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 47 / 67

Usuwanie elementu z listy jednokierunkowej Złożoność Procedura List-Delete usuwa element x z listy L. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element x, to pesymistyczny czas działania procedury List-Delete na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 48 / 67

Usuwanie elementu z listy jednokierunkowej I public T removefirst ( ) { i f ( isempty ( ) ) return null ; T answer = f i r s t. getdata ( ) ; n ; i f ( n == 0) { f i r s t = null ; l a s t = null ; else { Node<T> p = f i r s t ; f i r s t = f i r s t. getnext ( ) ; p = null ; return answer ; public T removelast ( ) { i f ( isempty ( ) ) return null ; T answer = l a s t. getdata ( ) ; n ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 49 / 67

Usuwanie elementu z listy jednokierunkowej II / / b y l jeden element i f ( n == 0) { f i r s t = null ; l a s t = null ; return answer ; i f ( n == 1) { l a s t = null ; l a s t = f i r s t ; return answer ; / / > 2 eleenty Node<T> p = f i r s t ; while ( p. getnext ( )!= l a s t ) p = p. getnext ( ) ; l a s t = p ; p. setnext ( null ) ; return answer ; public void remove ( T k ) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 50 / 67

Usuwanie elementu z listy jednokierunkowej III { i f ( isempty ( ) ) return ; / / czy element j e s t na l i s c i e Node<T> p = this. f i r s t ; while ( ( p!= null ) && ( p. getdata ( )!= k ) ) p = p. getnext ( ) ; i f ( p == null ) { System. out. p r i n t l n ( " Elementu " + k + " nie ma na l i s c i e " ) ; return ; / / j e s t co najmniej 1 element n ; / / usuwamy pierwszy e l eent i f ( k == f i r s t. getdata ( ) ) { removefirst ( ) ; return ; / / usuwamy o s t a t n i element i f ( k == l a s t. getdata ( ) ) { removelast ( ) ; return ; / / usuwamy ze srodka Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 51 / 67

Usuwanie elementu z listy jednokierunkowej IV p = this. f i r s t ; while ( ( p. getnext ( )!= null ) && ( ( p. getnext ( ) ). getdata ( )!= k ) ) { p = p. getnext ( ) ; Node<T> q = p. getnext ( ) ; Node<T> r = p. getnext ( ). getnext ( ) ; p. setnext ( r ) ; q = null ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 52 / 67

Lista jedno- i dwu kierunkowa - schemat Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 53 / 67

Węzeł listy dwukierunkowej class Node<T> { private T data ; private Node<T> next ; private Node<T> prev ; public Node ( T data, Node<T> n, Node<T> p ) { data = d ; next = n ; prev = p ; public void setdata ( T d ) { data = d ; public void setnext ( Node<T> n ) { next = n ; public void setprev ( Node<T> p ) { prev = p ; public T getdata ( ) { return data ; public Node<T> getnext ( ) { return next ; public Node<T> getprev ( ) { return prev ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 54 / 67

Dodawanie elementu do listy dwukierunkowej na poczatek Dane wejściowe: Położenie pierwszego elementu listy ; Dodawany klucz; Algorytm: List-add-front(Lista L, Item item) 1: Utwórz nowy węzeł x; 2: key[x] := item; prev[x] := NULL; next[x]:= head[l]; 3: if (head[l]!= NULL) then 4: prev[head[l]] := x; 5: end if 6: head[l] := x; 7: if Lista L jest pusta then 8: tail[l] = x; 9: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 55 / 67

Dodawanie elementu do listy dwukierunkowej na poczatek Złożoność Procedura List-add-front(Lista L, Item item) dodaje nowy węzeł zawierajacy klucz item na poczatek listy. Procedura List-add-front na liście o n elementach działa w czasie O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 56 / 67

Dodawanie elementu do listy dwukierunkowej na poczatek public void a d d F i r s t ( T item ) { Node<T> p = new Node<T>( item, null, null ) ; p. setnext ( f i r s t ) ; i f ( f i r s t!= null ) { f i r s t. setprev ( p ) ; f i r s t = p ; i f ( n==0) { / / l i s t a pusa l a s t = p ; n++; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 57 / 67

Dodawanie elementu do listy dwukierunkowej na koniec Dane wejściowe: Położenie ostatniego elementu listy. Dodawany klucz. Algorytm: List-add-end(Lista L, Item item) 1: Utwórz nowy węzeł x; 2: key[x] := item; next[x] := NULL; prev[x] := NULL; 3: if (L jest pusta) then 4: head[l] : = x; tail[l] := x; 5: else 6: prev[x] := tail[l]; 7: if (tail[l]!= NULL) then 8: next[tail[l]] := x; 9: end if 10: tail[l] := x; 11: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 58 / 67

Dodawanie elementu do listy dwukierunkowej na koniec Złożoność Procedura List-add-end(Lista L, Item item) dodaje nowy węzeł zawierajacy klucz item na koniec listy jednokierunkowej. Procedura List-add-end na liście o n elementach działa w czasie O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 59 / 67

Dodawanie elementu do listy dwukierunkowej na koniec public void addlast ( T item ) { Node<T> p = new Node<T>( item, null, null ) ; i f ( n==0) { / / l i s t a pusta f i r s t = p ; l a s t = p ; else { / / j e s t co najmniej jedn element p. setprev ( l a s t ) ; i f ( l a s t!= null ) l a s t. setnext ( p ) ; l a s t = p ; n++; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 60 / 67

Wyszukiwanie elementu na liście dwukierunkowej Dane wejściowe: Położenie pierwszego elementu listy; Kryterium poszukiwania klucz; Algorytm: List-Search(Lista L, Item item) 1: x := head[l]; 2: while (x!= NULL and key[x]!= item) do 3: x := next[x]; 4: end while 5: return x; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 61 / 67

Wyszukiwanie elementu na liście dwukierunkowej Złożoność Procedura List-Search(Lista L, Item item) wyznacza pierwszy węzeł zawierajacy klucz item na liście L. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element o kluczu k, to pesymistyczny czas działania procedury List-Search na liście o n elementach wynosi O(n). Uwaga Implementacja identyczna do tej z listy jednokierunkowej. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 62 / 67

Usuwanie pierwszego elementu z listy dwukierunkowej public T removefirst ( ) { i f ( isempty ( ) ) return null ; T answer = f i r s t. getdata ( ) ; n ; i f ( n == 0) { f i r s t = null ; l a s t = null ; else { Node<T> p = f i r s t ; f i r s t = f i r s t. getnext ( ) ; f i r s t. setprev ( null ) ; p = null ; return answer ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 63 / 67

Usuwanie ostatniego elementu z listy dwukierunkowej public T removelast ( ) { i f ( isempty ( ) ) return null ; T answer = l a s t. getdata ( ) ; n ; / / b y l jeden element i f ( n == 0) { f i r s t = null ; l a s t = null ; return answer ; / / byly 2 elementy i f ( n == 1) { l a s t = null ; l a s t = f i r s t ; return answer ; / / byly > 2 eleenty Node<T> p = l a s t. getprev ( ) ; l a s t = null ; p. setnext ( null ) ; l a s t = p ; return answer ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 64 / 67

Usuwanie wybranego klucza z listy dwukierunkowej I public void remove ( T k ) { i f ( isempty ( ) ) return ; / / czy element j e s t na l i s c i e Node<T> p = search ( k ) ; i f ( p == null ) { System. out. p r i n t l n ( " Elementu " + k + " nie ma na l i s c i e " ) ; return ; / / j e s t co najmniej 1 element n ; / / usuwamy pirwszy e l e e n t i f ( k == f i r s t. getdata ( ) ) { removefirst ( ) ; return ; / / usuwamy o s t a t n i element i f ( k == l a s t. getdata ( ) ) { Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 65 / 67

Usuwanie wybranego klucza z listy dwukierunkowej II removelast ( ) ; return ; / / usuwamy ze srodka Node<T> q = p. getprev ( ) ; Node<T> r = p. getnext ( ) ; q. setnext ( r ) ; r. setprev ( q ) ; p = null ; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 66 / 67

Usuwanie wybranego klucza z listy dwukierunkowe Złożoność Metoda remove(t k) usuwa z listy pierwszy znaleziony węzeł zawierajacy klucz k. Ponieważ niekiedy potrzebne jest przejście całej listy, aby znaleźć węzeł z kluczem k, to pesymistyczny czas działania metody remove na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 7 67 / 67