ALGORYTMY I STRUKTURY DANYCH

Slides:



Advertisements
Podobne prezentacje
ALGORYTMY I STRUKTURY DANYCH
Advertisements

STRUKTURY DANYCH.
Sortowanie przez scalanie
Algorytmy sortowania i porządkowania
Standardowa biblioteka języka C++
Grażyna Mirkowska PJWSTK, 10 stycznia 2001
ALGORYTMY GRAFOWE.
Grażyna Mirkowska PJWSTK 15 listopad 2000
Wykład 10 Metody Analizy Programów Specyfikacja Struktur Danych
Wykład 6 Najkrótsza ścieżka w grafie z jednym źródłem
Minimalne drzewa rozpinające
Filip Andrzejewski Remigiusz Chiluta
PROGRAMOWANIE STRUKTURALNE
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Elementarne struktury danych Piotr Prokopowicz
Współprogramy III Ten wykład ma na celu pokazanie kolejnej ciekawej możliwości, którą oferują współprogramy. Wspólprogramy reprezentujące wyrażenia regularne.
pseudokody algorytmów
ZŁOŻONOŚĆ OBLICZENIOWA
ALGORYTMY GEOMETRYCZNE.
Dynamiczne struktury danych 1
Geometria obrazu Wykład 12
Geometria obrazu Wykład 12
22 listopada 2000Regula konkatenacji II1 Dziedziczenie (cd.) Reguła konkatenacji II przykład - heapsort Reguła konkatenacji III.
#include #include main () { cout
POJĘCIE ALGORYTMU Pojęcie algorytmu Etapy rozwiązywania zadań
Algorytmy i struktury danych
Algorytmy i struktury danych
Podstawy programowania II
Algorytmy i Struktury Danych Sortowanie
Operacje na strukturach listowych
Sortowanie przez kopcowanie
DRZEWA BINARNE Emilia Krukowska.
Geometria obliczeniowa Wykład 8
Zadanie Dev C++.
Geometria obliczeniowa Wykład 4
Przekazywanie argumentów
Złożone typy danych Listy Tworzenie elastycznych baz danych
Materiały pochodzą z Platformy Edukacyjnej Portalu
Programowanie strukturalne i obiektowe
Tablice w Turbo Pascalu.
Dynamiczne struktury danych
Algorytmy i Struktury Danych
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska.
Geometria obrazu Wykład 6
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 04 k-ty co do wielkości. Stosy Grażyna Mirkowska PJWSTK, ITN semestr letni 2002.
Algorytmy i Struktury Danych Struktury Danych
Algorytmy i Struktury Danych Drzewa BTS, AVL
Teoretyczne Podstawy Informatyki - Rok I - kierunek IS w IFAiIS UJ – 2006/ /11/2006Prof. dr hab. Elżbieta Richter-Wąs Wykład 6 Model danych oparty.
METODY REPREZENTOWANIA IFORMACJI
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Wstęp do programowania wykład 3 Typy wyliczeniowe, tablice.
Zbiory dynamiczne.
Mapa STL – C++. Problem polega na tym, że najczęściej chcielibyśmy przechowywać w zbiorze elementy jakiegoś bardziej złożonego typu, których on nie będzie.
STOS. STL (ang. Standard Template Library) jest to biblioteka zawierająca algorytmy, pojemniki, iteratory oraz inne konstrukcje w formie szablonów, gotowe.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Indeksy drzewiaste. ISAM ISAM - INDEXED SEQUENTIAL ACCESS METHOD Problem: –Dany jest plik uporządkowany – w jaki sposób zrealizować efektywnie zapytanie.
Kolejka priorytetowa.
Drzewa.
ALGORYTMY I STRUKTURY DANYCH
Współprogramy II W tym wykładzie pogłębimy naszą znajomość z współprogramami. Omówimy współpracę procedur rekurencyjnych i współprogramów, wprowadzimy.
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Język C++ Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

ALGORYTMY I STRUKTURY DANYCH Kopiec

Kopiec czyli sterta, czyli heap Kopcem nazywamy doskonałe drzewo binarne częściowo uporządkowane. Drzewo binarne jest kopcem wtedy i tylko wtedy, gdy: D jest drzewem częściowo uporządkowanym: e(i) < e(i.lewy) i e(i)< e(i.prawy) D jest drzewem doskonałym: wszystkie poziomy drzewa, z wyjątkiem co najwyżej ostatniego poziomu, są maksymalnie zapełnione, a na ostatnim poziomie wszystkie liście są zgrupowane maksymalnie na lewo.

Przykład kopca Własności: 1 7 4 2 3 5 8 9 10 1 5 2 4 3 7 8 9 10 6 Kopiec 1 5 2 4 3 7 8 9 10 Własności: 1. Etykiety na dowolnej drodze od korzenia do liścia tworzą ciąg uporządkowany rosnąco. 2. Element najmniejszy wśród etykiet wierzchołków znajduje się w korzeniu drzewa. To nie jest kopiec , bo nie jest to drzewo doskonałe(chociaż jest to drzewo cz. uporządkowane) To nie jest kopiec , bo nie jest to drzewo częściowo uporządkowane (chociaż jest to drzewo doskonałe)

Wstawianie elementu Zadanie: Do zbioru etykiet danego kopca D dołączyć nową etykietę e, czyli wykonać operację insert(D,e) 1) Dowiązać nowy wierzchołek x do pierwszego z lewej wierzchołka na przedostatnim poziomie drzewa, którego rząd jest <2. 2) Nadać nowemu wierzchołkowi etykietę e. 3) Jeżeli tak otrzymane drzewo nie jest częściowo uporządkowane, to przechodząc wzdłuż drogi od liścia x do korzenia, poprawić etykiety zamieniając etykietę ojca z etykietą syna, jeśli etykieta ojca jest większa niż etykieta syna.

Przykład - dołączanie nowego elementu 1 5 2 4 3 7 8 9 10 6 1 5 2 4 3 7 8 9 10 6 1 2 3 Po dołączeniu nowego wierzchołka Zero „wędruje” wzdłuż drogi do korzenia

Usuwanie minimum Niech e będzie etykietą liścia x znajdującego się najbardziej na prawo na ostatnim poziomie kopca. (1) Usunąć wierzchołek x z drzewa d. (2) Zastąpić etykietę w korzeniu drzewa przez e. (3) Jeśli tak otrzymane drzewo nie jest kopcem, to zaczynając od korzenia i idąc w kierunku liścia, zamieniać etykietę ojca z etykietą tego z jego synów, którego etykieta ma mniejszą wartość, tak długo aż zostanie otrzymane drzewo częściowo uporządkowane.

Przykład - usuwanie minimum Usuwamy najmniejszy element zbioru. 1 12 5 1 4 3 10 8 9 7 6 20 12 12 3 12 6 12

Zastosowanie Algorytm sortujący 1) Z danego n elementowego zbioru utworzyć kopiec. 2) Dopóki kopiec nie jest pusty, wypisywać i usuwać element minimalny kopca.

Implementacja kopca w tablicy Reprezentujemy kopiec jako parę Tab + n tablica etykiet aktualna liczba elementów w tablicy Organizacja elementów w tablicy: Tab[1] = etykieta korzenia Tab[2i] = etykieta lewego syna wierzchołka i-tego o ile 2i  n Tab[2i+1] = etykieta prawego syna wierzchołka i-tego o ile 2i+1 n

Przykład Reprezentacja tablicowa kopca Kopiec 1 2 5 4 3 7 8 9 10 6 1 2 3 4 5 6 7 8 9 10

Operacja insert w implementacji tablicowej 5 12 7 10 8 14 19 16 9 11 20 3 5 7 12 10 8 14 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 3 5 Insert(D,3) 5 7 12 10 8 14 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 3 3 12 3 14 Kopiec D 3 7 5 10 8 12 19 16 9 11 20 1 2 3 4 5 6 7 8 9 10 11 Tab: 14

Konstrukcja kopca w tablicy Założenie: Znamy z góry liczbę elementów tworzonego kopca. A B i 2i 2i+1 1.Tworzymy tablicę zawierającą wszystkie elementy. 2.Jeżeli są już utworzone kopce A i B o korzeniach w 2itej i 2i+1szej pozycji, to albo tab[i] <tab[2i] oraz tab[i]<tab[2i+1] i wtedy mamy już kopiec o korzeniu w i, albo tak nie jest i wtedy poprawiamy ścieżkę „w dół” tak jak w algorytmie delmin.

Algorytm tworzenia kopca Procedure downheap (k:integer); /* utwórz kopiec o korzeniu w pozycji k zakładając, że 2k i 2k+1 są korzeniami kopców w tablicy*/ begin v := tab[k]; while (k n div 2 ) do j := 2*k; if (j<n) then if (tab[j] > tab[j+1] )then j := j+1 fi fi; if v<tab[j] then exit fi; tab[k] := tab[j]; k := j; od; tab[k] := v; end; For i:= n div 2 downto 1 do downheap(i) od;

Przykładowy program #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() {         int* dane; //wskaznik na inty, to bedzie nasza tablica :)         int n; // ilosc intow, ktore dostaniemy         cout << "Prosze podac liczbę liczb wejsciowych" << endl;         cin >> n;         dane = new int[n]; //tworzymy n-elementowa tablice         cout << "Prosze podac " << n << " liczb" << endl;         for(int i = 0; i < n; i++) //dla kazdego elementu tablicy...                 cin >> dane[i]; // pobieramy inta         vector<int> vec(dane, dane+n); //tworzymy wektor przechowujacy elementy tablicy, tak latwiej bedzie :)         make_heap(vec.begin(), vec.end()); //tworzymy kopiec         for(vector<int>::iterator i = vec.begin(); i != vec.end(); i++)         {                 cout << *i << ", "; //wypisujemy wszystkie elementy kopca, po kolei         }         system („pause”);         return 0; }

Przykład - konstrukcja kopca 5 1 7 6 2 8 4 3 9 5 7 1 6 2 8 4 3 9 Tab: 1 2 3 4 5 6 7 8 9 To są liście 5 7 1 6 2 8 4 3 9 Tab: 1 2 3 4 5 6 7 8 9 5 7 1 3 2 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 5 2 1 3 7 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 5 7 1 3 2 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9 1 2 5 3 7 8 4 6 9 Tab: 1 2 3 4 5 6 7 8 9