Tutoraggio Informatica Generale Inserimento e cancellazione in un ABR Counting Sort

Documenti analoghi
Alberi binari di ricerca

Alberi binari di ricerca

Alberi binari di ricerca

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Alberi ed Alberi Binari di Ricerca

Alberi. Alberi: Esempio di utilizzo

Alberi binari di ricerca

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

Alberi binari. Alberi binari di ricerca

In questa lezione Alberi binari di ricerca: la cancellazione

Code a priorità Una coda a priorità è una struttura dati astratta che permette di rappresentare un insieme di elementi su cui è definita una

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

Alberi Binari di Ricerca

Struttura dati Dizionario

Problemi di ordinamento

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.

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Spesso sono definite anche le seguenti operazioni:

Strutture dati Alberi binari

Lezione 12 Tabelle Hash

Algoritmi e Strutture di Dati

Implementazione ADT: Alberi

Algoritmi, Strutture Dati e Programmi. UD 3.d: Strutture Dati Dinamiche Alberi

In questa lezione Alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Esercitazione 6. Alberi binari di ricerca

Laboratorio di Algoritmi e Strutture Dati

Alberi binari e alberi binari di ricerca

ricerca di un elemento, verifica dell appartenenza di un elemento

Esempi. Albero di interi. Struttura che non è un albero!

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

ricerca di un elemento, verifica dell appartenenza di un elemento

Per semplicità eliminiamo le ripetizioni nell'albero.

Esercizi parte 3. La classe ArrayBinTree dovra implementare, tra le altre, l operazione seguente: padre: dato un nodo, restituire l indice del padre.

Algoritmi e strutture dati

ADT Coda con priorità

Algoritmi e Strutture Dati. HeapSort

Un heap binario è un albero binario con le seguenti caratteristiche:

Heap e code di priorità

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

Esercitazione 4 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Alberi binari e alberi binari di ricerca

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Esercizi su alberi binari

Alberi. CORDA Informatica. A. Ferrari. Testi da. Marco Bernardo Edoardo Bontà. Dispense del Corso di. Algoritmi e Strutture Dati

algoritmi e strutture di dati

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

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

Algoritmi e Strutture Dati. HeapSort

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

Esercizi Capitolo 6 - Alberi binari di ricerca

QuickSort Università degli Studi di Milano

Laboratorio di Informatica. Lezione 8: Liste e alberi

Code a priorità. Progettazione di Algoritmi Matricole congrue a 1. Docente: Annalisa De Bonis

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

Informatica 3. LEZIONE 16: Heap - Codifica di Huffmann. Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann

Laboratorio di Algoritmi e Strutture Dati

Strutture dati per insiemi disgiunti

Un esempio di mutua ricorsione

Esercizi su programmazione ricorsiva 3

Lezione 9 Alberi binari di ricerca

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

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

Indici con gli alberi

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

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

Alberi Binari di Ricerca

Laboratorio 26 Aprile 2012

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

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Alberi ed Alberi Binari

Heap e Code di Priorità

d. Cancellazione del valore 5 e. Inserimento del valore 1

In questa lezione. Code di priorità. [CLRS01] cap. 6 da pag. 114 a pag Prof. E. Fachini - Intr. Alg. lunedì 17 settembre 2012

Insert sort. Considero il primo elemento a 1. cerco il minimo tra gli elementi 3...N. scambio il minimo trovato con il primo e- lemento

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Alberi Binari di Ricerca: Definizione. Ricerca, inserimento, cancellazione, min, max, predecessore, successore.

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

Algoritmi e Strutture di Dati

Dizionari. Realizzazione con alberi binari di ricerca. Alberi rosso-neri. Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez.

Lezione 7 Alberi binari: visite e alberi di ricerca

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Algoritmi e Strutture di Dati

Gli heap. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Correzione prima esercitazione: metodo distinct

LINKEDLIST: implementazione iteratore. LINKEDLIST: iteratore INNERITERATOR INNERITERATOR

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.

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

Gli heap. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

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

Esercizi BST - AVL. E. Fachini

now is the for men all good come aid

ALBERI BINARI DI RICERCA

Transcript:

Tutoraggio Informatica Generale Inserimento e cancellazione in un ABR Counting Sort A.Festa festa@mat.uniroma1.it 20-5-2010 1 Inserimento e cancellazione in ABR Quando si inserisce o si rimuove un elemento la struttura dell albero cambia. L albero modificato deve mantenere le proprietà di un albero binario di ricerca. La struttura dell albero varia a seconda della sequenza di dati da inserire o rimuovere. L inserimento risulta essere un operazione immediata mentre la rimozione di un elemento è più complicata, proprio perché bisogna essere certi che l albero rimanga un albero binario di ricerca. Per inserire z si usano due puntatori q e t. Il puntatore a q scende l albero, mentre t punta al padre di q. Nel ciclo while i due puntatori (q e t) scendono l albero. q scende al figlio sinistro o destro a seconda dell esito del confronto di z con q.info. Ci si ferma quando q = NIL e q occupa la posizione in cui z verrà inserito. Il tempo necessario per l inserimento è O(h), ossia non più del cammino massimo tra la radice e una foglia (cioè h l altezza). void ins(nodo *q, int z) {nodo *t; while (q) {t=q; if (q->info>z) //cerco il posto giusto q=q->fs; //dove effettuare l inserimento else q=q->fd; // sono arrivato ad una foglia dell albero. // t conserva l indirizzo di tale foglia. if (t->info>z) 1

{t->fs=new nodo; t->fs->info=z; //inserisco l elemento t->fs->pd=t; t->fs->fs=t->fs->fd=null; else {t->fd=new nodo; t->fd->info=z; t->fd->pd=t; t->fd->fs=t->fd->fd=null; 1.1 Cancellazione con puntatore al padre Nella cancellazione ci sono tre casi: Se p non ha figli, allora si modifica p->pd che punta non più a p, ma a NULL. Se p ha un unico figlio, allora si taglia fuori p dall albero, facendo puntare p->pd all unico figlio di p. Se p ha due figli, allora si individua il successore, ossia il minimo del suo sottoalbero destro. Il successore y ha nessun figlio o 1 figlio. Quindi y prende il posto di p, riconducendosi al caso 1 e 2. Alla fine i dati in y vengono copiati in p. (Provate a scivere il codice). 1.2 Cancellazione senza puntatore al padre Questo è il codice commentato. Sono contemplati i molti casi possibili. Bisogna tenere a mente che nella cancellazione l ABR che otteniamo non è univocamente determinato, due algoritmi di cancellazione differenti possono restituire alberi differenti, l importante è che sia avvenuta la cancellazione e che il risultato sia ancora un ABR. nodo *elimina(nodo *q,int x) {if(q->info==x&&!q->fs&&!q->fd) return NULL; //nel caso l ABR sia costituito nodo *pd=q,*p=q; //da un unico nodo da eliminare ritorno a NULL while(p&&p->info!=x) //cerco un nodo contenente x {pd=p; //mantenendo un puntatore al padre 2

if(p->info>x) p=p->fs; else p=p->fd; //a questo punto ho p che punta il nodo //da eliminare e pd al padre di p if(!p) //se x non c è nell albero non faccio //nulla e ritorno la root if(p!=pd) {if(!p->fs) //Se p ha un unico figlio, {if(p->info<pd->info) //allora si taglia fuori p dall albero, pd->fs=p->fd; //facendo puntare pd (dalla parte giusta) else pd->fd=p->fd; //all unico figlio di p. //è compreso anche il caso //in cui p non ha figli if(!p->fd) {if(p->info<pd->info) pd->fs=p->fs; else pd->fd=p->fs; if(p->fs) //ho entrambi i figli del nodo che devo eliminare {pd=p->fs; if(!pd->fd) //se il figlio sx di p non ha fd lo {p->info=pd->info; //metto al posto del nodo eliminato p->fs=pd->fs; //comprendendo anche sottoalbero sx while(pd->fd->fd) //altrimenti cerco il max del sottoalbero sx pd=pd->fd; //che ha come root il figlio sx p->info=pd->fd->info; //una volta trovato lo sostituisco pd->fd=pd->fd->fs; //al nodo da eliminare, e "tappo" //il buco lasciato nel s.a. sx else //se il figlio sx di p ha fd guardo nel fd di p {pd=p->fd; if(!pd->fs) //se tal nodo non ha fs lo sostituisco in p {p->info=pd->info; p->fd=pd->fd; while(pd->fs->fs) //altrimenti cerco il min del s.a. dx pd=pd->fs; //ed effettuo la stessa operazione di p->info=pd->fs->info; //sostituzione e "tappo buchi" pd->fs=pd->fs->fd; 3

2 Counting sort Il Counting sort è un algoritmo di ordinamento per valori numerici interi con complessità lineare. L algoritmo si basa sulla conoscenza a priori dell intervallo in cui sono compresi i valori da ordinare. L algoritmo conta il numero di occorrenze di ciascun valore presente nell array da ordinare, memorizzando questa informazione in un array temporaneo di dimensione pari all intervallo di valori. Il numero di ripetizioni dei valori inferiori indica la posizione del valore immediatamente successivo. Si calcolano i valori massimo, max(a), e minimo, min(a), dell array e si prepara un array ausiliario C di dimensione pari all intervallo dei valori con C[i] che rappresenta la frequenza dell elemento i + min(a) nell array di partenza A. Si visita l array A aumentando l elemento di C corrispondente. Dopo si visita l array C in ordine e si scrivono su A, C[i] copie del valore i + min(a). L algoritmo esegue tre iterazioni, due di lunghezza n (pari alla lunghezza dell array da ordinare) per l individuazione di max(a) e min(a) e per il calcolo delle occorrenze dei valori, e una di lunghezza k (pari a max(a) - min(a) + 1) per l impostazione delle posizioni finali dei valori: la complessità totale è quindi O(n + k). Non è basato su confronti e scambi e conviene utilizzarlo quando il valore di k è O(n), nel qual caso l algoritmo è O(n), altrimenti risulterebbero più veloci altri algoritmi. void countingsort(int A[],int n) { int i, min, max; //Calcolo degli elementi max e min max = A[0]; min = A[0]; for (i = 0 ; i<n-1;i++) { if (A[i] > max) max = A[i]; else if(a[i] < min) min = A[i] ; int m=max-min; 4

int t; int C[m]; for (i = 0 ; i<=m;i++) C[i]=0; C[m] = C[m] + 1; for (i = 0 ; i<n-1;i++) {t=a[i] - min; C[t] = C[t] + 1; //aumenta il numero di volte che si è incontrato il valore //Ordinamento in base al contenuto dell array delle frequenze C int k = 0 ; for (i = 0 ; i<=m; i++) { while (C[i] > 0) { A[k] = i + min ; k = k + 1; C[i] = C[i] - 1; //scrive C[i] volte il valore //(i + min) nell array A 5