Heap, heapsort e code a priorità. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Documenti analoghi
Problemi di ordinamento

ADT Coda con priorità

Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Heap Ordinamento e code di priorità. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 9

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

Esercitazione 3. Heapsort

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Algoritmi di ordinamento: Array e ricorsione

ALGORITMI E STRUTTURE DATI

Heap e code di priorità

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

Algoritmi e Strutture Dati. HeapSort

Visualizzazione di dati

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

lezione 9 min-heap binario Heap e Alberi posizionali generali

Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max

Definizioni. Soluzione ottima: migliore soluzione possibile Soluzione ottima localmente: soluzione ottima in un dominio contiguo. Il paradigma greedy

Heap scenario. Ho un insieme dinamico di oggetti, ciascuno identificato con una priorità. (la priorità è semplicemente un numero);

Esercitazione 6. Alberi binari di ricerca

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

Lezione 12 Tabelle Hash

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Implementazione ADT: Alberi

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Esercizi su alberi binari

dizionari alberi bilanciati

alberi completamente sbilanciati

Alberi Binario in Java

Alberi di ricerca binari

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

1. COUNTING SORT. 1.1 Pseudocodice

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

In questa lezione Alberi binari di ricerca: la cancellazione

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi e alberi binari I Un albero è un caso particolare di grafo

Alberi ed Alberi Binari

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Alberi binari di ricerca

Algoritmi e Strutture Dati

Lezione 9 Alberi binari di ricerca

Algoritmi e strutture dati

Lezione 7 Alberi binari: visite e alberi di ricerca

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

Divide et impera su alberi

Alberi binari e alberi binari di ricerca

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

Un albero completamente bilanciato o pieno (full) alberi completamente sbilanciati. Un albero binario completo

Memorizzazione di una relazione

Laboratorio 07. Programmazione - CdS Matematica. Michele Donini 10 dicembre 2015

Per semplicità eliminiamo le ripetizioni nell'albero.

Algoritmi e Laboratorio a.a Lezioni

Alberi binari di ricerca

Indici con gli alberi

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Strutture dati dinamiche in C (II)

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

Alberi binari. Alberi binari di ricerca

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Esercizi Capitolo 6 - Alberi binari di ricerca

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Implementazione dell albero binario in linguaggio C++

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Alberi Binari di Ricerca e Alberi Rosso-Neri

Alberi rosso-neri. Le operazioni sugli alberi binari di ricerca hanno complessità proporzionale all altezza h dell albero.

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Un esempio di mutua ricorsione

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Corso: Strutture Dati Docente: Annalisa De Bonis

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Alberi binari. Esercizi su alberi binari

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.

Algoritmi e strutture dati

Note per la Lezione 4 Ugo Vaccaro

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Tipi di dato e Strutture dati elementari

Algoritmi e Strutture Dati. Alberi

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

Lezione 9 Alberi binari di ricerca

I B+ Alberi. Sommario

Sistemi operativi Modulo II I semafori 2 Select

Valutiamo il costo computazionale dell algoritmo insertion sort.

La struttura dati ad albero binario

alberi binari di ricerca (BST)

Esercizi di preparazione alla prova scritta

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Alberi Binari di Ricerca

ricerca di un elemento, verifica dell appartenenza di un elemento

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

21 - Alberi e Ricorsione

Transcript:

Heap, heapsort e code a priorità Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Heap Definizione: albero binario con proprietà strutturale: quasi completo (tutti i livelli completi, tranne eventualmente l ultimo, riempito da SX a DX) quasi bilanciato proprietà funzionale: i r key(parent(i)) key(i) conseguenza: chiave max nella radice. A.A. 24/25 Heap, heapsort e code a priorità 2

A.A. 24/25 Heap, heapsort e code a priorità 3 Operazioni: Heapify(A,i) BuildHeap(A) HeapSort(A).

Code a priorità Definizione: struttura dati per mantenere un set S di n elementi a ciascuno dei quali è associata una priorità. Operazioni: insert(s, x) maximum (S) Θ(1) extract_max(s) O(lg n) Implementazione: con heap. A.A. 24/25 Heap, heapsort e code a priorità 4

A.A. 24/25 Heap, heapsort e code a priorità 5 Esempio 2 15 1 12 11 5 4 9 8 5 7-1

Implementazione Struttura dati: vettore A[..length(A)-1] heap-size(a): numero di elementi in heap A radice in A[] dato A[i]: figlio SX in A[2i+1] figlio DX in A[2i+2] A.A. 24/25 Heap, heapsort e code a priorità 6

Esempio 2 1 15 2 1 3 12 4 11 5 5 6 4 A i 9 8 6 7-1 7 8 9 1 11 12 2 15 1 12 11 5 4 9 8 6 7-1 1 2 3 4 5 6 7 8 9 1 11 12 13 14 15 length(a) heapsize(a) A.A. 24/25 Heap, heapsort e code a priorità 7

Dato n = heap-size(a)-1: i n se i n/2, il nodo i ha due figli se i = n/2, il nodo i ha uno (n pari) o due (n dispari) figli se i > n/2, il nodo i non ha alcun figlio. A.A. 24/25 Heap, heapsort e code a priorità 8

Procedura Insert Aggiunge una foglia all albero (cresce per livelli da SX a DX, rispettando la proprietà strutturale) Risale dalla foglia fino al più alla radice confrontando con la chiave da inserire e facendo eventualmente scendere la chiave del padre nel figlio Inserisce la chiave nel nodo corrente. Complessità: T(n) = O(lg n). A.A. 24/25 Heap, heapsort e code a priorità 9

A.A. 24/25 Heap, heapsort e code a priorità 1 Esempio Inserzione di 17 2 1 15 2 1 3 12 4 11 5 5 6 4 creo foglia 9 8 6 7-1 7 8 9 1 11 12 13

A.A. 24/25 Heap, heapsort e code a priorità 11 2 3 1 15 2 1 12 4 11 5 5 6 confronto 17 e 4 e faccio scendere 4 9 8 6 7-1 7 8 9 1 11 12 4 13

A.A. 24/25 Heap, heapsort e code a priorità 12 2 1 15 2 confronto 17 e 1 e faccio scendere 1 3 12 4 11 5 5 6 1 9 8 6 7-1 7 8 9 1 11 12 4 13

A.A. 24/25 Heap, heapsort e code a priorità 13 2 inserisco 17 1 15 2 17 3 12 4 11 5 5 6 1 9 8 6 7-1 7 8 9 1 11 12 4 13

A.A. 24/25 Heap, heapsort e code a priorità 14 Implementazione C #define PARENT(i) ((i-1) / 2) void Insert(int A[], int x, int *pheapsize) { int i; i = ++(*pheapsize); while (i>1 && A[PARENT(i)] < x) { A[i] = A[PARENT(i)]; i = (i-1)/2; } A[i] = x; return; }

Procedura Heapify Trasforma in heap i, Left(i), Right(i), dove Left(i) e Right(i) sono già heap assegna ad A[i] il max tra A[i], Left(i) e Right(i) se c è stato scambio A[i] Left(i), applica ricorsivamente heapify su sottoalbero con radice Left(i) analogamente per scambio A[i] Right(i). Complessità: T(n) = O(lg n). A.A. 24/25 Heap, heapsort e code a priorità 15

A.A. 24/25 Heap, heapsort e code a priorità 16 Esempio Left(i) i=1 16 1 4 Right(i) 2 1 Heapify(A, 1) 14 = max(4, 14, 7) A[i] A[Left(i)] 3 14 4 7 5 9 6 3 2 8 1 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 17 i=3 16 1 14 2 1 Heapify(A, 3) 8 = max(4, 2, 8) A[i] A[Right(i)] Heapify(A, 8) Left(i) 3 4 4 7 5 9 6 3 Right(i) 2 8 1 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 18 16 1 14 2 1 Heapify(A, 8) foglia terminazione. 3 8 4 7 5 9 6 3 i = 8 2 4 1 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 19 Implementazione C #define LEFT(i) ((i*2) + 1) #define RIGHT(i) ((i*2) + 2) void Swap( int v[], int n1, int n2) { int temp; temp = v[n1]; v[n1] = v[n2]; v[n2] = temp; return; }

void Heapify(int A[], int i, int heapsize) { int l, r, largest; l = LEFT(i); r = RIGHT(i); if (l< heapsize && A[l]>A[i]) largest=l; else largest = i; if (r<heapsize && A[r]>A[largest]) largest=r; if (largest!= i) { Swap(A,i,largest); Heapify(A,largest,heapsize); } return; } A.A. 24/25 Heap, heapsort e code a priorità 2

Procedura BuildHeap Trasforma un albero binario memorizzato in vettore A in un heap: le foglie sono heap applica Heapify a partire dal padre dell ultima coppia di foglie fino alla radice. Complessità: T(n)= O(n). A.A. 24/25 Heap, heapsort e code a priorità 21

A.A. 24/25 Heap, heapsort e code a priorità 22 Esempio 4 BuildHeap(A) 1 1 2 3 3 2 4 16 5 9 6 1 14 8 7 Heapify(A, 4) 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 23 4 Heapify(A, 3) 1 1 2 3 3 2 4 16 5 9 6 1 14 8 7 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 24 Heapify(A, 2) 4 1 1 2 3 3 14 4 16 5 9 6 1 2 8 7 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 25 Heapify(A, 1) 4 1 16 2 1 3 14 4 7 5 9 6 3 2 8 1 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 26 Heapify(A, ) 16 1 14 2 1 3 8 4 7 5 9 6 3 2 4 1 7 8 9

A.A. 24/25 Heap, heapsort e code a priorità 27 Implementazione C void BuildHeap (int A[], int heapsize) { int i; for (i=(heapsize)/2-1; i >= ; i--){ Heapify(A,i,heapsize); } return; }

Procedura HeapSort Trasforma il vettore in uno heap Scambia il primo e ultimo elemento Ripristina la proprietà di heap Riduci la dimensione dello heap di 1 Ripeti fino a esaurimento dello heap. Complessità: T(n)= (n lg n). A.A. 24/25 Heap, heapsort e code a priorità 28

A.A. 24/25 Heap, heapsort e code a priorità 29 Esempio A 5 3 2 6 4 1 9 7 Configurazione iniziale 5 1 3 2 2 3 6 4 4 5 1 6 9 7 7

Applico Build_heap A 9 7 5 6 4 1 2 3 9 heapsize 1 7 2 5 3 6 4 4 5 1 6 2 7 3 A.A. 24/25 Heap, heapsort e code a priorità 3

A.A. 24/25 Heap, heapsort e code a priorità 31 A[] A[heapsize-1] heapsize-- A 3 7 5 6 4 1 2 9 3 heapsize 1 7 2 5 3 6 4 4 5 1 6 2 7 9

A.A. 24/25 Heap, heapsort e code a priorità 32 Heapify(A, ) A 7 6 5 3 4 1 2 9 7 heapsize 1 6 2 5 3 3 4 4 5 1 6 2 7 9

A.A. 24/25 Heap, heapsort e code a priorità 33 A[] A[heapsize-1] heapsize-- A 2 6 5 3 4 1 7 9 2 heapsize 1 6 2 5 3 3 4 4 5 1 6 7 7 9

A.A. 24/25 Heap, heapsort e code a priorità 34 Heapify(A, ) A 6 4 5 3 2 1 7 9 6 heapsize 1 4 2 5 3 3 4 2 5 1 6 7 7 98

Implementazione C void HeapSort(int A[], int heapsize) { int i; BuildHeap(A, heapsize); for (i=heapsize-1; i > ; i--) { Swap (A,,i); heapsize--; Heapify(A,,heapsize); } return; } A.A. 24/25 Heap, heapsort e code a priorità 35