Argomenti della lezione. Introduzione agli Algoritmi e alle Strutture Dati. Lista Lineare. Lista Lineare come Tipo di Dato Astratto

Documenti analoghi
Grafi: visita generica

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

Strutture Dinamiche. Fondamenti di Informatica

Laboratorio di Informatica

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

Esercizi Capitolo 7 - Hash

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Parte 4. Liste. P. Picasso Guernica, AA. 2015/16

In questa lezione Strutture dati elementari: Pila Coda

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

Algoritmi di Ricerca. Esempi di programmi Java

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Il TDA Dictionary. Definizione informale. I metodi del TDA Dictionary 1. Applicazioni. I metodi del TDA Dictionary 2. I metodi del TDA Dictionary 3

Strutture dati e loro organizzazione. Gabriella Trucco

Alberi binari di ricerca

Liste, Pile e Code. 1. L ADT Lista. Liste Pile e Code Pag. 1/18

Prova di Laboratorio del [ Corso A-B di Programmazione (A.A. 2004/05) Esempio: Media Modalità di consegna:

I PUNTATORI E LE STRUTTURE DATI DINAMICHE. Cosimo Laneve/Ivan Lanese

Strutture dati dinamiche in C (II)

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

La struttura dati CODA

Programmazione I - Laboratorio

Esempi di Problemi Iterativi

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

Esercizi Capitolo 6 - Alberi binari di ricerca

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2

Problema del cammino minimo

Il problema delle azioni

Progetto e analisi di algoritmi

Esempi di Problemi Iterativi

5 Array Cicli iterativi Contenuto di cella 28/02/2014 Copyright V. Moriggia 1

Implementazione di Liste puntate

PASCAL standard. Il linguaggio PASCAL nasce come evoluzione del linguaggio ALGOL60 (ALGOrithmic Language) nel 1968 ad opera di N. Wirth.

Esercizi C su array e matrici

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

I S T I T U T O T E C N I C O I N D U S T R I A L E S T A T A L E

Excel & VBA. Excel e Visual Basic for Application

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

Rappresentazione di liste mediante puntatori in linguaggio C

Introduzione alla programmazione Esercizi risolti

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Esercitazione 12. Esercizi di Ricapitolazione

Struttura dati astratta Coda

Problemi, istanze, soluzioni

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

PILE E CODE. Pile (stack):

Informatica 1. Prova di recupero 21 Settembre 2001

PASCAL - Record. Il linguaggio PASCAL consente l utilizzo dei RECORD

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Alberi Binari di Ricerca

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

ALBERI DI RICERCA BINARI (O ALBERI BINARI DI RICERCA)

Problema: conteggio occorrenze

n deve essere maggiore di 0, altrimenti il metodo restituisce null.

Array e liste. IASD a.a

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Esercizi di Algoritmi e Strutture Dati

ALGORITMI E STRUTTURE DATI

Esercizio 1: funzione con valore di ritorno di tipo puntatore

MODULO 4: LE STRUTTURE ITERATIVE: FOR, WHILE E DO LOOP UNTIL

CORSO ACCESS PARTE IV

Esercitazione 6. Alberi binari di ricerca

Implementazione ADT: Alberi

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Programmazione I - corso B a.a prof. Viviana Bono

CAPITOLO 17 PROBLEMI DEL PRODUTTORE/CONSUMATORE v1

Università di Roma Tor Vergata L12-1

Introduzione a Visual Basic Lezione 2 Cicli e anomalie

Laboratorio di Algoritmi e Strutture Dati

Le risorse. Alcune definizioni

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

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Informatica e Bioinformatica: Algoritmi

Linguaggio C. Esercizio 1

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

C3 IL DBMS MICROSOFT ACCESS

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

Gestione degli impegni Requisiti generali Si fissi come ipotesi che la sequenza di impegni sia ordinata rispetto al tempo,, e che ogni lavoratore abbi

Passare argomenti al programma

Cosa sono le maschere

ADT Dizionario. Come nella Mappa: Diversamente dalla Mappa:

Appunti di informatica. Lezione 10 anno accademico Mario Verdicchio

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

Esercizio 1: Puntatori impiegati che sono manager

Gestione di files Motivazioni

Fondamenti di Informatica T-1 Modulo 2

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

CAPITOLO 22 PROBLEMA DEL PRODUTTORE/CONSUMATORE

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Esercizi di Algoritmi e Strutture Dati

Problema: ricerca di un elemento

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

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Scrittura formattata - printf

Insiemi Specifiche, rappresentazione e confronto tra realizzazioni alternative.

Transcript:

Argomenti della lezione Introduzione agli Algoritmi e alle Strutture Dati Operazioni su Liste Dr. Emanuela Merelli Tipi di Dato Astratto Lista Lineare Pila Coda Concetto di Struttura dati dinamiche Lista Lineare è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni ha un predecessore e un successore Proprietà: 1. X 1 è il primo della lista 2. X i è preceduto da xi-1 e seguito da xi+1 3. X n è l ultimo della lista 4. N= lunghezza della lista 5. N=0 Lista Vuota L(A, B, C, D) Relazione di precedenza: per accedere ad un si deve accedere a tutti quelli che lo precedono Lista Lineare come Tipo di Dato Astratto Dominio dei valori Insieme dinamico basato su un omogeneo Operazioni su Lista Lineare Inserire un in testa Inserire un in coda Inserire un dopo un puntato da P Creare una lista con N elementi. Operazioni su Liste Lineari Inserimento di un in Testa alla Lista Struttura Dati 1. Sequenza ordinata di elementi di tipo record formati da due campi, un campo informazione e un campo puntatore ad. 2. Struttura dati dinamica 3. Utilizzo del tipo puntatore B C D E Nuovo A Inserimento di un in testa 1. Creare il nuovo 2. Memorizzare l informazione nel nuovo 3. Collegare il nuovo in testa alla lista esistente 1. Il campo puntatore del nuovo assume il valore di inizio lista 2. lista assume il valore del nuovo B C D E Nuovo A 1

Inserimento di un in testa Type T = RECORD Inf : Integer; Next : T P ; Pun = T; Var Primo: Pun; A: T; Procedura Testa (Var : Pun, X: Integer) Var Q: Pun; Q.Inf := X; Q.Next := ; := Q; B C D E Nuovo A Definire una Funzione Testa di tipo puntatore che prenda in input un valore X e restituisca Testa con X come primo Eliminazione dell in testa ad una lista Eliminazione di un da una Lista Type T = RECORD Inf : Integer; Next : T P ; Pun = T; Var Primo: Pun; A: T; Elemento eliminato A Procedura ElimTesta (Var : Pun) IF <> NIL THEN :=.Next; B C D E Esercizio Definire un algoritmo che elimini un contenente un informazione X dalla Lista Casi possibili: 1. Elemento in test 2. Elemento in coda 3. Elemento tra due elementi Scansione di una lista lineare Scansione di una lista lineare 1. Controllare se la lista è vuota, che equivale a controllare se il puntatore alla lista è uguale a NIL 2. Se lista uguale a NIL fine scansione, altrimenti si va al passo 3. 3. Se lista è diverso da NIL, Visita del primo della lista 4. Far avanzare di un il puntatore di inizio lista. 5. Ricominciare dal passo 1. 3 345 9 23 5 Procedura Scansione (: Pun) WHILE <> NIL DO Writeln(.Inf); :=.Next; 3 345 9 23 5 2

Inserimento di un in coda 1. Creazione del nuovo 2. Memorizzazione 3. Controllare se la lista è vuota, in tal caso lista assumerà il valore del nuovo, altrimenti si va al passo 4. 4. Scansione delle lista, fino ad arrivare con il puntatore inizio all ultimo. 5. Collegamento del nuovo tramite l ultimo A B C D Nuovo E Come varia l algoritmo precedentemente descritto, se si vuole creare direttamente il nuovo utilizzando il campo puntatore dell ultimo della lista Inserimento di un in coda Inserimento di un in coda 1. Controllare se la lista è vuota, in tal caso crea con e memorizza l informazione, altrimenti si va al passo 2. 2. Scansione delle lista, fino ad arrivare con il puntatore inizio all ultimo. 3. Creazione del nuovo, utilizzando il campo puntatore dell puntato da 4. Memorizzazione A B C D Nuovo E Procedura InsCoda (Var : Pun, X: Integer) Var P, Q: Pun; Q.Next := NIL; A B C D Q.Inf := X; P:= ; IF =NIL THEN :=Q Nuovo E ELSE WHILE P.Next <> NIL DO Domanda Perché il parametro della procedura Coda, deve essere passato per riferimento? E possibile definire un algoritmo con il parametro passato per valore? Se si, quali modifiche o ipotesi vanno fatte? Inserimento di un dopo un puntato da P 1. Creazione del nuovo 2. Memorizzazione 3. Poiché siamo nell ipotesi che l esiste ed è puntato da P, allora si può collegare il nuovo tramite il campo NEXT dell puntato da P P A B C D Nuovo E 3

Inserimento di un dopo un puntato da P Procedura Inserisci (P: Pun, X: Integer) Var Q: Pun; Q.Inf := X; Q.Pun:= P.Next; P A B D E Nuovo C ognuno contenente come informazione l intero n inseriti in testa alla Lista crescente da 1 a N 1. Inizializzazione di 2. Creazione iterativa di un nuovo 1 2 N-2 N-1 N 3. Memorizzazione 4. Inserimento in testa alla Lista inserimento in testa Procedura CreaT (Var : Pun, N: Integer) Var Q: Pun; := NIL; WHILE N>0 DO Q.Next := ; := Q; Q.Inf:=N; 1 2 N-2 N-1 N Utilizzare la funzione inserisci in testa all interno della procedura CreaLista Fare le necessarie considerazioni sul passaggio dei parametri tra le procedure e le utili riflessioni sulle caratteristiche dell ambiente locale e globale 1 inseriti in coda alla Lista decrescente da 1 a N 1. Inizializzazione di 2. Creazione del primo in testa e memorizzazione dell informazione 3. Creazione iterativa di un nuovo 4. Memorizzazione 5. Inserimento in coda alla Lista (l implica la scansione della lista) N N-1 3 2 1 Procedura CreaC (Var : Pun, N: Integer) Var P, Q: Pun; IF N = 0 THEN :=NIL ELSE new();.inf:=n.next:=nil WHILE N>1 DO N N-1 3 2 1 Q.Inf:=N-1; Q.Next:=NIL; P:= ; WHILE P.Next <> NIL DO End 4

1 Ottimizzato inseriti in coda alla Lista decrescente da 1 a N 1. Inizializzazione di 2. Creazione del primo in testa e memorizzazione dell informazione 3. Creazione iterativa di un nuovo 4. Memorizzazione 5. Inserimento in coda alla Lista utilizzando un puntatore che punta sempre all ultimo N N-1 3 2 1 Procedura CreaC (Var : Pun, N: Integer) Var P, Q: Pun; IF N = 0 THEN :=NIL ELSE new();.inf:=n.next:=nil P:= ; WHILE N>1 DO Q.Inf:=N-1; Q.Next:=NIL; End N N-1 3 2 1 2 inseriti in coda alla Lista decrescente da 1 a N 1. Inizializzazione di 2. Creazione iterativa di un nuovo 3. Memorizzazione 4. Se Lista Vuota Inserisci in Testa altrimenti Inserimento in coda alla Lista (l inserimento in coda implica la scansione della lista) N N-1 3 2 1 Procedura CreaC (Var : Pun, N: Integer) Var P,Q: Pun; := NIL; WHILE N>0 DO Q.Inf:=N; Q.Next:=Nil; P:= ; IF =NIL THEN :=Q ELSE WHILE P.Next <> NIL DO N N-1 3 2 1 3 inseriti in coda alla Lista decrescente da 1 a N 1. Inizializzazione di 2. Creazione di un Testa fittizio 3. Creazione iterative di elementi 4. Memorizzazione 5. Inserimento in coda alla Lista (l implica la scansione della lista) N 3 2 1 Per generalizzare l inserimento si utilizza un testa fittizio Procedura CreaC (Var : Pun, N: Integer) Var P,Q: Pun; new();.next:=nil; WHILE N>0 DO Q.Inf:=N; Q.Next:=Nil; P:= ; WHILE P.Next <> NIL DO 1 N-2 N-1 N 5

CONFRONTO tra ALGORITMI 1 tratta la prima creazione come caso particolare 2 ad ogni creazione controlla se èla prima 3 utilizza un testa fittizio per generalizzare la creazione Calcolare la complessità computazionale dei tre algoritmi e stabilire qual è il migliore e in quale contesto Tutti e 3 gli algoritmi effettuano una scansione della lista L utilizzo di un puntatore che punti sempre all ultimo potrebbe far risparmiare la scansione Esercizio 1 Dato un elenco di parole (testo), si vuole costruire una Lista Ordinata contenente un per ogni distinta parola. Il generico della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell elenco. Inserimento in una Lista Ordinata ognuno contenente come informazione una parola e un intero n Soluzione Un ovvia soluzione è costruire una lista delle parole trovate nell elenco. La lista viene letta per ogni parola. Se la parola viene trovata, il contatore della sua frequenza viene incrementato; altrimenti la parola viene aggiunta alla lista. I casi da considerare sono: 1. Lista vuota 2. L esiste, quindi il contatore deve essere incrementato 3. L non esiste e 1. deve essere inserito in testa 2. deve essere inserito dopo P 3. deve essere inserito in coda Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n Ricerca di un in una Lista Definire un algoritmo il più possibile generale I possibili casi da considerare sono: 1. Lista vuota l è inserito in testa 2. Lista non vuota 1. Si cerca l 2. L esiste nella lista si incrementa il contatore 3. L non esiste 1. È il più piccolo deve essere inserito in testa 2. È compreso tra due valori deve essere inserito dopo P 3. È il più grande deve essere inserito in coda Domanda HP1: gli elementi sono memorizzati in un Lista non ordinata La lista è ordinata o no? 1. Controllare se la lista è vuota 2. Scansione della Lista 1. Elemento trovato 2. Raggiunta fine lista Elemento da trovare C Z B C D E 6

Ricerca di un in una Lista non ordinata Function Ricerca (Var : Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Q:=; B:=true; WHILE Q<>NIL AND B DO IF Q.Inf:=X THEN B:= false ELSE Q:=Q.Next If B then Ricerca:=false ELSE Ricerca:=true Elemento da trovare C Osservazioni sulla Condizione While HP: B= true non trovato Q<>NIL scansione non terminata Q<>NIL AND B non trovata e la lista non è vuota, quindi continuare la scansione B=true B Q<>NIL B and (Q<>NIL) 1 1 1 0 1 0 1 0 0 0 0 0 continua trovato, non abbiamo raggiunto la fine non trovato, abbiamo raggiunto la fine non si verifica mai, PERCHÉ? Q.inf=X false Q=A.next true B=false Ricerca di un in una Lista ordinata Function Ricerca (Var : Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Q:=; B:=true; WHILE Q<>NIL AND b DO IF Q.Inf >=X THEN B:= false ELSE Q:=Q.Next If B then Ricerca:=false ELSE If Q.Inf=X THEN Ricerca:=true ELSE Ricerca:=false Definire una funzione di tipo puntatore che restituisca il valore NIL se l non esiste e restituisca il puntatore all con informazione X se esiste Inserimento in Liste Ordinate Type stringa = Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var : Pun, X: stringa) Var W1,W2 : Pun; W2:= ; W1:=W2.Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO W2:=W1; W1:=W1.Next IF W1.Inf = X THEN W1. Conta:= W1.Conta+1 ELSE IF W1.Next:= NIL THEN W2:=W1; W1:= NIL End Inserisci (W1) End Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3.Conta:= 1; W3.Next:=W W2.Next:=W3 End ; %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> Fine DO Ricerca(Radice, K) Read(K) End. Osservazione Le operazioni di inserimento di un nuovo in una Lista possono essere variate in modo da passare come parametro l già creato tramite una procedura Crea Elemento Procedura CreaElem (Var P: Pun, X: Info) new(p); P.Inf:=X; P.Next:=NIL 7

Operazioni definite su Lista Creazione di un nuovo CreaEl(R,X) Inserimento di un in testa InsTesta(R,E) Inserimento di un in coda InsCoda(R,E) Inserimento di un dopo P Inserisci(P,E) Eliminazione dell in testa ElimTesta(R) Eliminazione di un in coda ElimCoda(R) Eliminazione di un dopo P Elimina(P) Scansione della lista Scansione(R) CreaT(R,N) CreaC(R,N) Ordinamento di una Lista Esercizio Data una lista di N elementi ordinare gli elementi, in ordine decrescente del campo informazione supposto essere di tipo Integer 8