SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE



Похожие документы
QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

GESTIONE INFORMATICA DEI DATI AZIENDALI

Monitor. Introduzione. Struttura di un TDA Monitor

Il tipo di dato astratto Pila

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

dall argomento argomento della malloc()

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Lezione 4 Le code. Informatica. 26 Aprile Le pizze devono essere preparate e consegnate seguendo l ordine di arrivo degli ordini

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

Algoritmi e Strutture Dati. Tipo di dato astratto e Strutture dati elementari

INFORMATICA 1 L. Mezzalira

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

obiettivi di questa seconda metà del corso fare un passo avanti rispetto a :... meccanismi di composizione dei dati

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

10 - Programmare con gli Array

Corso di Fondamenti di Informatica Algoritmi su array / 2

Algoritmi su array / 2

Sistema operativo: Gestione della memoria

Concetto di Funzione e Procedura METODI in Java

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Inizializzazione, Assegnamento e Distruzione di Classi

Gestione dinamica di una pila

MODULO 5 ACCESS Basi di dati. Lezione 4

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

FONDAMENTI di INFORMATICA L. Mezzalira

Algoritmi di Ricerca. Esempi di programmi Java

Il costrutto monitor [Hoare 74]

ARRAY E STRINGHE. G. Frosini Slide 1

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Realizzazione di una classe con un associazione

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

I tipi di dato astratti

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Java Virtual Machine

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Introduzione al MATLAB c Parte 2

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Sottoprogrammi: astrazione procedurale

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

3. La sintassi di Java

La struttura dati ad albero binario

Grafico della parabola

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

Sistemi Operativi mod. B. Sistemi Operativi mod. B A B C A B C P P P P P P < P 1, >

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Funzioni in C. Violetta Lonati

Gestione della memoria centrale

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Abstract Data Type (ADT)

DOCUMENTO ESERCITAZIONE ONENOTE. Utilizzare Microsoft Offi ce OneNote 2003: esercitazione rapida

20. Appunti sulle liste (gestione in linguaggio C#) 16/04/2015 Arraylist

Gestione della Memoria

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Soluzione dell esercizio del 2 Febbraio 2004

Complessità Computazionale

Programmazione Orientata agli Oggetti in Linguaggio Java

I file di dati. Unità didattica D1 1

2. Simulazione discreta: approcci alla simulazione

Ricorsione. (da lucidi di Marco Benedetti)

Il costrutto monitor [Hoare 74]

Architettura MVC-2: i JavaBeans

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

EasyPrint v4.15. Gadget e calendari. Manuale Utente

Il Web-Service SDMX dell ISTAT

Verifica della correttezza formale del numero di partita IVA

Informatica 3. Informatica 3. LEZIONE 12: Liste. Lezione 12 - Modulo 1. Posizione corrente. Introduzione

GESTIONE DEI PROCESSI

Supermarket Progetto di Programmazione Febbraio 2010

Pronto Esecuzione Attesa Terminazione

Laboratorio di programmazione

Esempi di esercizi d esame

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Prova d Esame Compito A

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Prof. Nicola Cappuccio

CABINE ELETTRICHE DI TRASFORMAZIONE

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Cosa è un foglio elettronico

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Test di unità con JUnit4

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Spiegazione Open Interest Storico:

Indirizzamento Aperto

Introduzione a Classi e Oggetti

PROCEDURA INVENTARIO DI MAGAZZINO di FINE ESERCIZIO (dalla versione 3.2.0)

Транскрипт:

SOMMARIO Coda (queue): Specifica: interfaccia. Implementazione: Strutture indicizzate (array): Array di dimensione variabile. Array circolari. Strutture collegate (nodi). Prestazioni. Strutture Software 1 - Code 1 QUEUE Una coda è una sequenza <a 1,,a n > di elementi dello stesso tipo, della quale si distinguono due elementi, il primo e l ultimo inserito (a 1 e a n, denominati la testa e il fondo della coda). La modalità di accesso è primo elemento inserito, primo elemento rimosso (FIFO: first in, first out). È una linea d attesa che cresce aggiungendo elementi in fondo e si accorcia rimuovendo elementi dall inizio. Una coda può essere descritta in termini di operazioni che ne modificano lo stato o che ne verificano lo stato: pertanto è un ADT. Strutture Software 1 - Code 2 QUEUE : specifica Una possibile (e minima) interfaccia è la seguente: QUEUE Vediamo graficamente alcune operazioni su una coda. interface IQueue void Enqueue(object x); object Dequeue(); object Front(); Inserisce l'oggetto x in fondo alla coda, dopo l ultimo elemento. Rimuove e restituisce il primo oggetto della coda. Restituisce il primo oggetto della coda senza rimuoverlo. enqueue 10 dequeue enqueue 7 enqueue 5 enqueue 15 dequeue bool IsEmpty(); Verifica se la coda è logicamente vuota. 10 10 5 5 5 15 5 15 7 15 7 void Clear(); Svuota la coda. Strutture Software 1 - Code 3 Strutture Software 1 - Code 4

IQueue q = new ArrayQueue(3); QUEUE: esempio Console.WriteLine(q.IsEmpty()); Console.Write("------------\n"); for (int i = 0; i < 7; i++) q.enqueue(i); Console.WriteLine(q.IsEmpty()); Console.Write("------------\n"); for (int i = 0; i < 7; i++) Console.Write(q.Dequeue() + " "); Console.WriteLine("\n"+q.IsEmpty()); Console.Write("------------\n"); try q.dequeue(); catch (Exception e) Console.WriteLine(e.Message); Una possibile uscita True ------------ False ------------ 0 1 2 3 4 5 6 True ------------ Coda vuota. Strutture Software 1 - Code 5 QUEUE: implementazione Si consideri ora la realizzazione della coda. Si sono usate le operazioni espresse dall interfaccia, ma devono essere implementate, cioè realizzate come metodi che operano sui dati della coda. L implementazione può essere realizzata sfruttando due diversi tipi di strutture dati: strutture indicizzate (array) o strutture collegate (nodi). Analogamente a quanto visto per le pile, l implementazione con array consiste nell usare un array flessibile, cioè un array che può modificare dinamicamente le sue dimensioni, perchè, in generale, non è noto a priori il numero di oggetti che una coda deve contenere. Strutture Software 1 - Code 6 QUEUE: implementazione QUEUE: array circolare In particolare, nella struttura dati coda gli elementi vengono aggiunti alla fine e estratti dall inizio, pertanto possono esserci celle libere all inizio dell array. Per non essere sprecate devono essere usate per accodare nuovi elementi. Quindi la fine della coda può trovarsi all inizio dell array. Tale situazione è illustrata dall array circolare. Vediamo una rappresentazione grafica. Strutture Software 1 - Code 7 Strutture Software 1 - Code 8

QUEUE: array circolare QUEUE : prestazioni Tuttavia si opera su array non circolari, quindi i metodi Enqueue() e Dequeue() devono realizzare la possibilità di girare intorno all array, cioè di riusare le celle libere, quando si aggiunge o rimuove un elemento. Si realizza una struttura dati complessa utilizzandone una primitiva, l array. Il pregio di tale implementazione è il basso costo computazionale per inserimenti ed estrazioni, O(1), mentre il punto critico riguarda la gestione della memoria. Strutture Software 1 - Code 9 Notasull implementazione di un array circolare: Per semplificare l implementazione si può pensare di non realizzare un array circolare: ad ogni Dequeue() tutti gli elementi presenti vengono fatti traslare di una posizione indietro in modo da avere sempre la posizione iniziale nella prima cella dell array. Tuttavia tale soluzione porta ad avere un costo lineare O(n) nel caso medio per il metodo Dequeue(). Strutture Software 1 - Code 10 class ArrayQueue : IQueue int first, last, isize; object[] data; public ArrayQueue(int dim) isize = dim; data = new object[isize]; first = last = -1; public bool IsEmpty() return first == -1; I dati della coda sono contenuti in un array di object. Strutture Software 1 - Code 11 public void Enqueue(object x) if (first == 0 && last == data.length - 1 first == last + 1) RaddoppiaArray(); if (last == data.length - 1 last == -1) data[0] = x; Array circolare. last = 0; if (first == -1) else data[++last] = x; Strutture Software 1 - Code 12

public object Dequeue() if (IsEmpty()) throw new Exception("Coda vuota."); int el_num; if (first <= last) Numero di elementi della coda. el_num = last - first + 1; else el_num = data.length - first + last + 1; if ((el_num < data.length / 4) && (el_num >= isize / 4)) DimezzaArray(el_num); object tmp = data[first]; if (first == last) last = first = -1; else if (first == data.length - 1) else first++; return tmp; Array circolare. Strutture Software 1 - Code 13 public object Front() if (IsEmpty()) throw new Exception("Coda vuota."); return data[first]; public void Clear() last = first = -1; Strutture Software 1 - Code 14 Il controllo su el_num<data.length/4 serve per evitare di invocare un dimezzamento della dimensione dell array non appena si è eseguito un raddoppio della sua dimensione. Il controllo su el_num>=isize/4 assicura di non scendere mai sotto la dimensione iniziale della coda. I metodi privati RaddoppiaArray() e DimezzaArray() implementano il concetto di array flessibile. Si sono inseriti dei controlli per implementare il concetto di array circolare. Strutture Software 1 - Code 15 private void RaddoppiaArray() object[] newdata = new object[2 * data.length]; for (int i = first, j = 0; j < data.length; j++, i++, i = i % data.length) newdata[j] = data[i]; last = data.length - 1; data = newdata; Strutture Software 1 - Code 16

private void DimezzaArray(int el_num) object[] newdata = new object[data.length / 2]; for (int i = first, j = 0; j < el_num; j++, i++, i = i % data.length) newdata[j] = data[i]; last = el_num - 1; data = newdata; Strutture Software 1 - Code 17 QUEUE : prestazioni Le operazioni di accodamento ed estrazione vengono eseguite a tempo costante O(1), essendo realizzate con un array. Come per le pile, l inserimento di un elemento in una coda piena richiede l assegnazione di maggiore memoria e gli elementi dell array pieno sono copiati in quello nuovo. Quindi inserire elementi nel caso peggiore richiede un costo O(n). Tuttavia si può pensare di avere ancora costo costante in media: tale operazione avviene in media dopo n inserimenti, quindi il costo distribuito per ogni operazione è O(1). Lo stesso vale per l estrazione di un elemento. Inoltre vi sono dei controlli (che hanno un costo) per implementare il concetto di array circolare. Strutture Software 1 - Code 18 QUEUE : considerazioni L uso della struttura dati primitiva array, come rappresentazione interna dei dati della coda, evidenzia due aspetti: La semplicità ed efficienza dell uso degli indici. Il costo che si paga nella gestione della memoria per ottenere un array ridimensionabile e circolare. Inoltre è evidente il vantaggio di usare un ADT, che nasconde i problemi dell implementazione all utilizzatore. QUEUE : implementazione con nodi Una implementazione alternativa consiste nell uso di strutture collegate: i dati sono memorizzati in nodi, ogni nodo ha un riferimento al precedente. In questo caso non vi sono problemi di gestione della memoria: si alloca solo il numero necessario di nodi e risulta semplice inserire in coda ed estrarre dalla testa. Ogni operazione ha costo O(1). Ogni inserimento provoca la creazione di un oggetto nodo. Ogni estrazione rilascia un oggetto nodo. Strutture Software 1 - Code 19 Strutture Software 1 - Code 20

QUEUE : considerazioni Entrambe le implementazioni hanno metodi con costo O(1), quindi è necessario eseguire un confronto sui tempi di esecuzione delle due implementazioni (per esempio, effettuando 10 7 chiamate ai metodi Enqueue() e Dequeue()): Se non è necessario risparmiare memoria e si conosce la massima dimensione della coda, allora l implementazione con array è più veloce (per esempio, ArrayQueue = 9.063E-001 sec e NodeQueue = 1.734E+000 sec). Se è importante risparmiare memoria e non si conosce il numero di oggetti da inserire nella coda, allora l implementazione con nodi è più veloce (per esempio, ArrayQueue = 2.563E+000 sec e NodeQueue = 1.734E+000 sec). PRIORITY QUEUE Nelle code prioritarie gli elementi vengono estratti in base alla loro priorità e alla loro attuale posizione in coda. Per esempio, in una coda di processi può essere necessario che per il corretto funzionamento del sistema il processo P 2 venga eseguito prima del processo P 1, anche se P 1 è stato inserito per primo nella coda. Il problema di una coda prioritaria è trovare realizzazioni efficienti che consentano accodamenti ed estrazioni veloci. Strutture Software 1 - Code 21 Strutture Software 1 - Code 22 PRIORITY QUEUE Vi sono diverse soluzioni: in generale, c è la necessità di mantenere due strutture dati (per es., una ordinata secondo l ordine di ingresso nella coda e l altra ordinata secondo la priorità). Dal punto di vista della complessità computazionale si ottengono prestazioni da O(n) a O(n 1/2 ) in relazione alle diverse implementazioni. Strutture Software 1 - Code 23