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

Podobne dokumenty
Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel

Algorytmy i struktury danych. wykład 5

Porządek symetryczny: right(x)

Dynamiczne struktury danych

Podstawowe struktury danych

Wstęp do programowania. Zastosowania stosów i kolejek. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Różne różności

Wstęp do programowania. Stosy i kolejki. Piotr Chrząstowski-Wachtel

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Wstęp do programowania

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

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

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

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

Przykładowe B+ drzewo

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

ALGORYTMY I STRUKTURY DANYCH

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Listy, kolejki, stosy

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

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

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

Język programowania PASCAL

Programowanie dynamiczne

Drzewa podstawowe poj

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Algorytmy i struktury danych

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Algorytmy i Struktury Danych

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

Dynamiczne struktury danych

Programowanie obiektowe

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

Programowanie obiektowe

Sortowanie przez scalanie

Algorytmy i Struktury Danych.

Algorytmy i struktury danych

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

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

Sztuczna Inteligencja i Systemy Doradcze

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Paradygmaty programowania

Wykład 6. Drzewa poszukiwań binarnych (BST)

ALGORYTMY I STRUKTURY DANYCH

Analiza algorytmów zadania podstawowe

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

Wstęp do Programowania potok funkcyjny

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

Problem 1 prec f max. Algorytm Lawlera dla problemu 1 prec f max. 1 procesor. n zadań T 1,..., T n (ich zbiór oznaczamy przez T )

Wstęp do informatyki

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wstęp do Informatyki dla bioinformatyków

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

Listy i operacje pytania

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

Wstęp do programowania 2

Algorytmy i Struktury Danych.

Sortowanie topologiczne skierowanych grafów acyklicznych

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

1 Wskaźniki i listy jednokierunkowe

Heurystyki. Strategie poszukiwań

PODSTAWY INFORMATYKI wykład 6.

Wstęp do Programowania potok funkcyjny

Informatyka 1. Przetwarzanie tekstów

Algorytmika i pseudoprogramowanie

Drzewo. Drzewo uporządkowane ma ponumerowanych (oznaczonych) następników. Drzewo uporządkowane składa się z węzłów, które zawierają następujące pola:

Wstęp do Sztucznej Inteligencji

wykład Organizacja plików Opracował: dr inż. Janusz DUDCZYK

Wstęp do programowania

Drzewa poszukiwań binarnych

Pascal - wprowadzenie

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Algorytmy i Struktury Danych

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Wykład 2. Drzewa poszukiwań binarnych (BST)

Przykłady grafów. Graf prosty, to graf bez pętli i bez krawędzi wielokrotnych.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Wykład 8. Drzewo rozpinające (minimum spanning tree)

< K (2) = ( Adams, John ), P (2) = adres bloku 2 > < K (1) = ( Aaron, Ed ), P (1) = adres bloku 1 >

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Obrazy rekurencyjne. Zastosowanie rekurencji w algorytmice. AUTOR: Martin Śniegoń

Porządek dostępu do zasobu: procesory obszary pamięci cykle procesora pliki urządzenia we/wy

2:8,7 3:9,4 / \ / \ / \ / \ 4:7,3 5:8 6:9,2 7:4

Poprawność semantyczna

Egzaminy i inne zadania. Semestr II.

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Transkrypt:

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

Do czego stosujemy listy? Listy stosuje się wszędzie tam, gdzie występuje duży rozrzut w możliwym rozmiarze danych, np. w reprezentacji grafów jeśli węzłów jest dużo (n), a krawędzi niewiele, to każdy węzeł ma potencjalnie n-1 krawędzi, ale w praktyce może okazać się, że liczba krawędzi jest liniowa (np. dla grafów planarnych nigdy nie przekracza 6n-3). Listy umowżliwiają nam łatwe wstawianie i usuwanie elementów, ale dostęp do nich nie jest bezpośredni. 2

Co to są listy? Zbiór list L(A) nad pewnym zbiorem A definiujemy, jako najmniejszy zbiór spełniający następujące warunki: nil L(A) jest wyróżnioną pustą listą Dla a A, l L(A), para (a,l) jest listą. Przyjmujemy, że w parze (a,l) a jest pierwszym elementem listy, zwanym jej głową, a lista l ogonem, czyli pozostałą częścią listy (być może pustą). 3

Typ listowy type lista=^elemlisty; elemlisty = record w : typ; nast : lista; Zakładamy, że typ jest typem elementu zadeklarowanym wcześniej. Na tym wykładzie typ=integer. 4

Wyszukiwanie w liście function jest_r(l:lista;x:typ):boolean; {przyjmuje wartość true wtedy i tylko wtedy, gdy w liście l znajduje się wartość x} begin if l=nil then jest_r :=false else if l^.w = x then jest_r := true else jest_r := jest_r(l^.nast,x) 5

Wady i zalety rekurencji w listach Zalety: poprawność funkcji wynika wprost z definicji. prosty kod. Wady: liniowa złożoność pamięciowa. czasowo również tracimy na obsłudze rekurencji. 6

Wyszukiwanie iteracyjne function jest(l:lista; x:typa):boolean; {przyjmuje wartość true wtedy i tylko wtedy, gdy w liście l znajduje się wartość x} begin if l=nil then jest :=false else begin while (l^.nast<>nil) and (l^.w <> x) do {od początku listy aż do l wyłącznie nie ma x; l nil} l := l^.nast; jest := l^.w = x end 7

Wyszukiwanie iteracyjne leniwe function jest_leniwie (l:lista; x:typa):boolean; {Zakładamy leniwy tryb wyliczania warunków logicznych} begin while (l<>nil) and (l^.w <> x) do l := l^.nast; {od początku listy aż do l wyłącznie nie ma x} jest_leniwie:= l <> nil {wartość funkcji ustala inny warunek} 8

Leniwa logika Przy wyliczaniu leniwym działamy w nieklasycznej trójwartościowej logice. Przerywamy bowiem obliczenia gdy tylko wiemy, jaki będzie wynik. Oznaczmy wartość niewyliczonego wyrażenia przez?. Mamy wtedy:? =?,? 1 =?, 1? =? 0? = 0,? 0 =? 1? = 1,? 1 =?, 0? =?,? 0 =? Alternatywa i koniunkcja nie są przemienne! 9

Wstawianie do listy Zacznijmy od prostej procedury wstawiającej nową wartość x za istniejącym elementem listy wskazywanym przez wsk: procedure wstawza(wsk:lista; x:typ); var pom:lista; begin new(pom); pom^.nast:=wsk^.nast; pom^.w := x; wsk^.nast:=pom 10

Wstawianie do posortowanej listy procedure wstaw_sort(var l:lista_a;x:typ); {do posortowanej listy l wstawia x} var akt,next: lista; {akt aktualny, next następnik akt} begin {leniwie} if (l=nil) or (x<=l^.w) then begin akt:=l; new(l); l^.nast:=akt; l^.w:=x end {wstawiliśmy x na początek listy} else {...} 11

Wstawianie do posortowanej listy begin akt := l; next := akt^.nast; while (next<>nil) and (next^.w<x) do {między l a akt włącznie są wartości mniejsze od x; akt<>nil next=akt^.nast} begin akt:=next; next:=akt^.nast wstawza(akt,x) end 12

Atrapa Czasem wygodnie jest używać atrapy jako elementu zaczynającego listę, ale do niej nienależącego. type listaa=lista Tworzenie pustej listy: new(l); l^.nast:=nil 13

Wstawianie do posortowanej listy z atrapą procedure wstaw_sort_z_atrapa (l:lista_a; x:typ);{l może być wołana przez wartość} var next: lista; {rolę zmiennej akt może pełnić parametr l} begin next:=l^.nast; if next=nil then {l pusta} wstawza(l,x) else begin while (next^.w<x) and (next^.nast<>nil) do begin l:=next; next:=l^.nast if x>next^.w then wstawza(next,x) else wstawza(l,x) end 14

Listy ze strażnikiem Czasem wygodnie jest mieć dowiązanie nie tylko do poczzątku, ale i do ostatniego elementu listy Niekiedy taki ostatni element listy jest atrapą; nazywamy go wtedy strażnikiem. Taka implementacja jest nieco droższa pamięciowo, ale tylko o stałą, a za to umożliwia wstawianie na końcu listy, które jest bardzo przydatne, na przykład przy implementacji kolejek. 15

Listy ze strażnikiem Type listak=record pocz,kon:lista Zdefiniowaliśmy zatem listę z dowiązaniem do poczatku i do końca Teraz, w zależności od tego, czy chcemy mieć po prostu dowiązanie do końca listy, czy chcemy mieć dodatkowy rekord, nie bedący elementem listy (strażnika) bedziemy inaczej interpretowali wartości listy. 16

Listy puste ze strażnikiem Tworzenie listy pustej ze strażnikiem: var l:listak; begin new(l.pocz); l.kon:=l.pocz end. List ze strażnikiem najczęściej nie kończymy nilem. Rekord l.kon ma pole nast nieokreślone, a to, że wskaźnik p wyskoczył poza listę sprawdzamy za pomocą warunku p=l.kon. 17

Wstawianie do posortowanej listy ze strażnikiem procedure wstaw_sort_ze_strażnikiem (var l:listak; x:typ); var akt: lista; begin l.kon^.w:=x; if x<=l.pocz^.w then begin new(akt); akt^.w:=x; akt^.nast:=l.pocz; l.pocz:=akt end else begin akt:=l.pocz; while (akt^.nast^.w<x) do akt:=akt^.nast; wstawza(akt,x); end 18

Lista pusta z atrapą i strażnikiem Type listaas=listak; Tworrzymy listę pustą składającą się z pary atrap: początkowej i końcowej (strażnika). var l_as:listaas; begin new(l_as.pocz); new(l_as.pocz^.nast); l_as.kon:=l_as.pocz^.nast 19

Wstawianie do posortowanej listy zatrapą i strażnikiem procedure wstaw_sort_ze_strażnikiem (l:listaas; x:typ); {tym razem znowu wołamy l przez wartość} var akt: lista; begin l.kon^.w:=x; akt:=l.pocz; while (akt^.nast^.w<x) do akt:=akt^.nast; wstawza(akt,x); 20

Atrapy Nie należy przesadzać z atrapami, choć bywają one bardzo wygodne Czasami opłaca się wręcz stworzyć sobie sztucznie atrapę, wykonać algorytm, a na końcu usunąć ją, przywracając pierwotny charakter listy. Strażnika w łatwy sposób nie utworzymy, chyba, że mamy dowiązanie do końca listy. Trzeba wtedy czujnie odtworzyć stan sprzed zamieszania. 21

Listy dwukierunkowe Często wygodnie jest chodzić po liście w obu kierunkach. Typowe zastosowania Drzewa Rekurencja (pamiętamy na liście jakieś atrybuty znajdujące się na stosie) 22

Listy dwukierunkowe type lista2=^record w: typ; poprz,nast: lista2 lista_dwukierunkowa = record pocz,kon:lista2 W liście dwukierunkowej pole poprz pokazuje na poprzedni, a pole nast na następny element listy. 23

Listy z cyklem Lista niekoniecznie musi kończyć sie nilem. Może się zdarzyć, że ostatni element listy pokazuje na któryś ze swoich poprzedników. Llistę nazwiemy cykliczną, jeśli ostatni element listy pokazuje na pierwszy. Ciekawe zadanie: rozpoznaj, czy lista ma cykl, czy też kończy się nilem. 24