Algoritmi e Strutture Dati

Slides:



Advertisements
Presentazioni simili
PROVA INTERCORSO MOD.B a.a RICORSIONE ESERCIZI A1.1-A1.6.
Advertisements

Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Parte 2 Programmare in Matlab – I Sommario: Introduzione: m-file Strutture condizionali e cicli –Istruzione “if” + Operatori logici in MatlabIstruzione.
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Fondamenti di Informatica A - Massimo Bertozzi LE RAPPRESENTAZIONI CONCATENATE.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
CONTROLLO DELLA CONCORRENZA
Ereditarietà Uno dei principi della programmazione orientata agli oggetti (OOP) è il riuso Le classi dovrebbero essere progettate come componenti riutilizzabili.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
© 2007 SEI-Società Editrice Internazionale, Apogeo
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Tutorato Elementi di Informatica 2013
Il linguaggio C Strutture Moreno Marzolla
Ordinamento.
IL CONCETTO DI ALGORITMO
10. Programmazione Ricorsiva Ing. Simona Colucci
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
B-alberi e alberi autoaggiustanti
Organizzazione fisica
I FILES AD ACCESSO SEQUENZIALE
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Informatica per l’Ingegneria
Usi (meno scontati) della visita DFS
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Corso Java Cicli e Array.
© 2007 SEI-Società Editrice Internazionale, Apogeo
Lezione n°6 Prof.ssa Rossella Petreschi
Scrivere programmi corretti
Introduzione agli Algoritmi e alle Strutture Dati
Schema generale, visita in ampiezza e profondità.
APPUNTI SUL LINGUAGGIO C
Usi (meno scontati) della visita DFS
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
APPUNTI SUL LINGUAGGIO C
Algoritmi Avanzati Prof.ssa Rossella Petreschi
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Le stringhe in C++ Laboratorio 26 Aprile Dott. Serena Villata
Lucidi della Pof.ssa Pazienza
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
concetti ed applicazioni
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Informatica CdL Scienze e Tecniche Psicologiche a.a
Algoritmi e Strutture Dati
Array e Stringhe Linguaggio C.
Analisi ammortizzata Lezione n°2
Ricerca 01/08/2019 package.
La programmazione strutturata
Corso di Fondamenti di Informatica
Algoritmi di ordinamento
Corso di Fondamenti di Informatica
Ese 3 (del 3 Aprile 2003).
Corso di Fondamenti di Informatica
Transcript della presentazione:

Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico LISTE Emanuela Merelli email:emanuela.merelli@unicam.it

Strutture Dati Dinamiche Una struttura dati si dice essere dinamica se permette di rappresentare insiemi dinamici, cioè insiemi la cui cardinalità varia durante l’esecuzione del programma. Esamineremo Strutture dati dinamiche che utilizzano puntatori.

I puntatori Distinguiamo: Tipo del puntatore Tp definito tramite un altro tipo T Variabile di tipo puntatore P:Tp Variabile dinamica new(P) Non vengono dichiarate esplicitamente Non vengono identificate esplicitamente tramite un identificatore Vengono create dinamicamente in base alle necessità che emergono nel corso del programma Vengono referenziate tramite una variabile di tipo puntatore, che rappresenta indirettamente l’indirizzo della variabile in memoria La loro esistenza è indipenedente dal blocco in cui sono state create La dichiarazione di una variabile di tipo puntatore, all’atto della compilazione, non alloca memoria per l’oggetto di tipo T. Il comando New allocherà memoria per l’oggetto di tipo T NIL è il valore che indica puntatore non definito valido per tutti i tipi di puntatori

Liste Le Liste possono essere Lineari e NON Lineari Lista Lineare: è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni elemento ha un predecessore e un successore Lista Non Lineare: è una lista ogni elemento può essere a sua volta una lista A B C E A D E B C

Lista Lineare è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni elemento ha un predecessore e un successore Proprietà: X1 è il primo elemento della lista Xi è preceduto da xi-1 e seguito da xi+1 Xn è l’ultimo elemento della lista N= lunghezza della lista N=0  Lista Vuota A B C E D L(A, B, C, D) Relazione di precedenza: per accedere ad un elemento si deve accedere a tutti quelli che lo precedono

Lista Non Lineare è una lista, ogni elemento può essere a sua volta una lista A D E B C L(D (C ( A, B), E))

Lista Lineare come Tipo di Dato Astratto Dominio dei valori Insieme dinamico basato su un elemento omogeneo Operazioni su Lista Lineare Inserire un elemento in testa Inserire un elemento in coda Inserire un elemento dopo un elemento puntato da P Creare una lista con N elementi ….

Operazioni definite su Lista Creazione di un nuovo elemento CreaEl(R,X) Inserimento di un elemento in testa InsTesta(R,E) Inserimento di un elemento in coda InsCoda(R,E) Inserimento di un elemento dopo P Inserisci(P,E) Eliminazione dell’elemento in testa ElimTesta(R) Eliminazione di un elemento in coda ElimCoda(R) Eliminazione di un elemento dopo P Elimina(P) Scansione della lista Scansione(R) Creazione di una lista di N elementi CreaT(R,N) Creazione di una lista di N elementi CreaC(R,N)

Operazioni su Liste Lineari Inserimento di un elemento in Testa alla Lista Struttura Dati Sequenza ordinata di elementi di tipo record formati da due campi, un campo informazione e un campo puntatore ad elemento. Struttura dati dinamica Utilizzo del tipo puntatore Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

Inserimento di un elemento in testa Algoritmo Creare il nuovo elemento Memorizzare l’informazione nel nuovo elemento Collegare il nuovo elemento in testa alla lista esistente Il campo puntatore del nuovo elemento assume il valore di inizio lista Inizio lista assume il valore del nuovo elemento Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

Operazioni su Liste Lineari Inserimento di un elemento in Testa alla Lista Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura Testa (Var Inizio: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next := Inizio; Inizio:= Q; Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D

Eliminazione dell’elemento in testa ad una lista Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura ElimTesta (Var Inizio: Pun) Begin IF Inizio <> NIL THEN Inizio:= Inizio.Next; Lista d’input Inizio A B C E D Elemento eliminato A Lista d’output B C E D Inizio

Inserimento di un elemento in coda … Procedura Coda (Var Inizio: Pun, X: Integer) Var P, Q: Pun; Begin New(Q); Q.Next := NIL; Q.Inf := X; P:= Inizio; IF Inizio=NIL THEN Inizio:=Q ELSE Begin WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; END; Lista d’input Inizio A B C D Nuovo elemento E Lista d’output A B C E D

Inserimento di un elemento dopo un elemento puntato da P Algoritmo Creazione del nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Poiché siamo nell’ipotesi che l’elemento esiste ed è puntato da P, allora si può collegare il nuovo elemento tramite il campo NEXT dell’elemento puntato da P Lista d’input Inizio P A B C D Nuovo elemento E Lista d’output A B C E D

Domanda Perché il parametro Inizio della procedura Coda, deve essere passato per riferimento? E’ possibile definire un algoritmo con il parametro Inizio passato per valore? Se si, quali modifiche o ipotesi vanno fatte?

Inserimento di un elemento dopo un elemento puntato da P … Procedura Inserisci (Var P: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next:= P.Next; P.Next:=Q; END; Lista d’input P A B D E Nuovo elemento C Lista d’output A B C E D

Creazione di una lista di N elementi … Procedura Crea (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Next := Inizio; Inizio:= Q; Q.Inf:=N; N:= N-1 END; 3 345 9 5 23

Scansione di una lista lineare Algoritmo Controllare se la lista è vuota, che equivale a controllare se il puntatore alla lista è uguale a NIL Se Inizio lista uguale a NIL fine scansione, altrimenti si va al passo 3. Se Inizio lista è diverso da NIL, Visita del primo elemento della lista Far avanzare di un elemento il puntatore di inizio lista. Ricominciare dal passo 1. 3 345 9 5 23

Scansione di una lista lineare … Procedura Scansione (Var Inizio: Pun) Begin WHILE Inizio <> NIL DO Writeln(Inizio.Inf); Inizio:= Inizio.Next; End; 3 345 9 5 23

Esercizio 1 Data un elenco di parole, si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

Homework Definire una Funzione Testa di tipo puntatore che prenda in input un valore X e restituisca Testa con X come primo elemento

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: Lista vuota L’elemento esiste, quindi il contatore deve essere incrementato L’elemento non esiste e deve essere inserito in testa deve essere inserito dopo P deve essere inserito in coda

Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n Definire un algoritmo il più possibile generale I possibili casi da considerare sono: Lista vuota  l’elemento è inserito in testa Lista non vuota Si cerca l’elemento L’elemento esiste nella lista  si incrementa il contatore L’elemento non esiste È il più piccolo  deve essere inserito in testa È compreso tra due valori  deve essere inserito dopo P È il più grande  deve essere inserito in coda

Inserimento in Liste Ordinate Type Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var Inizio: Pun, X: stringa) Var W1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO Begin W2:=W1; W1:=W1 .Next End; IF W1.Inf = X THEN W1 . Conta:= W1 .Conta+1 ELSE Begin IF W1.Next:= NIL THEN Begin W2:=W1; W1:= NIL End Inserisci (W1) Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3 .Conta:°= 1; W3 .Next:=W End ; New(Radice); Radice .Next=NIL; Read(X); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End.

Ricerca di un elemento in una Lista Algoritmo HP1: gli elementi sono memorizzati in un Lista non ordinata Controllare se la lista è vuota Scansione della Lista Elemento trovato Raggiunta fine lista Domanda La lista è ordinata o no? Lista d’input Z B C E D C Elemento da trovare

Ricerca di un elemento in una Lista non ordinata … Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; 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 END; Lista d’input A B C E D C Elemento da trovare

Osservazioni sulla Condizione While HP: B= true elemento non trovato Q<>NIL scansione non terminata Q<>NIL AND B  elemento non trovata e la lista non è vuota, quindi continuare la scansione B=true Q.inf=X Q=A.next B=false false true B Q<>NIL B and (Q<>NIL) 1 1 0 1 0 0 0 0 0 0 continua elemento trovato, non abbiamo raggiunto la fine elemento non trovato, abbiamo raggiunto la fine non si verifica mai, PERCHÉ?

Ricerca di un elemento in una Lista ordinata … Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; 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 END;

Eliminazione di un elemento da una Lista Esercizio Definire un algoritmo che elimini un elemento contenente un informazione X dalla Lista Casi possibili: Elemento in test Elemento in coda Elemento tra due elementi

Homework Come varia l’algoritmo precedentemente descritto, se si vuole creare direttamente il nuovo elemento utilizzando il campo puntatore dell’ultimo elemento della lista

Creazione di una lista di N elementi ognuno contenente come informazione l’intero n Algoritmo HP1: gli elementi creati vengono inseriti in testa alla Lista HP2: la lista è ordinata in ordine crescente da 1 a N Inizializzazione di Inizio Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Inserimento in testa alla Lista Lista d’input Inizio Lista d’output Inizio 1 2 N-2 N N-1

Creazione di una lista di N elementi inserimento in testa … Procedura CreaT (Var Inizio: Pun, N: Integer) Var Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Next := Inizio; Inizio:= Q; Q.Inf:=N; N:= N-1 END; 1 2 N-2 N N-1

Homework 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 …

Creazione di una lista di N elementi inserimento in coda Algoritmo 1 HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione del primo elemento in testa e memorizzazione dell’informazione Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Inserimento in coda alla Lista (l’inserimento in coda implica la scansione della lista) Lista d’input Inizio Lista d’output Inizio N-1 3 1 2 N

Creazione di una lista di N elementi inserimento in coda … Procedura CreaC (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin IF N = 0 THEN Inizio:=NIL ELSE new(Inizio); Inizio.Inf:=N Inizio.Next:=NIL WHILE N>1 DO New(Q); Q.Inf:=N-1; Q.Next:=NIL; P:= Inizio; WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; N:= N-1 End; End END; N-1 3 1 2 N Inizio

Creazione di una lista di N elementi inserimento in coda Algoritmo 1 Ottimizzato HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione del primo elemento in testa e memorizzazione dell’informazione Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Inserimento in coda alla Lista utilizzando un puntatore che punta sempre all’ultimo elemento Lista d’input Inizio Lista d’output Inizio N-1 3 1 2 N

Creazione di una lista di N elementi inserimento in coda … Procedura CreaC (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin IF N = 0 THEN Inizio:=NIL ELSE new(Inizio); Inizio.Inf:=N Inizio.Next:=NIL P:= Inizio; WHILE N>1 DO New(Q); Q.Inf:=N-1; Q.Next:=NIL; P.Next:=Q; P:=P.Next; N:= N-1 End; End END; N-1 3 1 2 N Inizio

Creazione di una lista di N elementi inserimento in coda Algoritmo 2 HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione iterativa di un nuovo elemento Memorizzazione dell’informazione nel nuovo elemento Se Lista Vuota Inserisci in Testa altrimenti Inserimento in coda alla Lista (l’inserimento in coda implica la scansione della lista) Lista d’input Inizio Lista d’output N-1 3 1 2 N Inizio

Creazione di una lista di N elementi inserimento in coda … Procedura CreaC (Var Inizio: Pun, N: Integer) Var P,Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Inf:=N; Q.Next:=Nil; P:= Inizio; IF Inizio=NIL THEN Inizio:=Q ELSE WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; End; N:= N-1 END; N-1 3 1 2 N Inizio

Creazione di una lista di N elementi inserimento in coda Algoritmo 3 HP1: gli elementi creati vengono inseriti in coda alla Lista HP2: la lista è ordinata in ordine decrescente da 1 a N Inizializzazione di Inizio Creazione di un elemento Testa fittizio Creazione iterative di elementi Memorizzazione dell’informazione nel nuovo elemento Inserimento in coda alla Lista (l’inserimento in coda implica la scansione della lista) Lista d’input Inizio Lista d’output Inizio N 3 1 2 Per generalizzare l’inserimento si utilizza un elemento testa fittizio

Creazione di una lista di N elementi inserimento in coda … Procedura CreaC (Var Inizio: Pun, N: Integer) Var P,Q: Pun; Begin new(Inizio); Inizio .Next:=Nil; WHILE N>0 DO New(Q); Q.Inf:=N; Q.Next:=Nil; P:= Inizio; WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; N:= N-1 End; END; Inizio 1 N-2 N N-1

Creazione di una lista di N elementi inserimento in coda CONFRONTO tra ALGORITMI Algoritmo 1  tratta la prima creazione come caso particolare Algoritmo 2  ad ogni creazione controlla se è la prima Algoritmo 3  utilizza un elemento testa fittizio per generalizzare la creazione Tutti e 3 gli algoritmi effettuano una scansione della lista L’utilizzo di un puntatore che punti sempre all’ultimo elemento potrebbe far risparmiare la scansione

Homework Calcolare la complessità computazionale dei tre algoritmi e stabilire qual è il migliore e in quale contesto

Esercizio 1 Dato un elenco di parole (testo), si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento 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: Lista vuota L’elemento esiste, quindi il contatore deve essere incrementato L’elemento non esiste e deve essere inserito in testa deve essere inserito dopo P deve essere inserito in coda

Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n Definire un algoritmo il più possibile generale I possibili casi da considerare sono: Lista vuota  l’elemento è inserito in testa Lista non vuota Si cerca l’elemento L’elemento esiste nella lista  si incrementa il contatore L’elemento non esiste È il più piccolo  deve essere inserito in testa È compreso tra due valori  deve essere inserito dopo P È il più grande  deve essere inserito in coda

Ricerca di un elemento in una Lista Algoritmo HP1: gli elementi sono memorizzati in un Lista non ordinata Controllare se la lista è vuota Scansione della Lista Elemento trovato Raggiunta fine lista Domanda La lista è ordinata o no? Lista d’input Z B C E D C Elemento da trovare

Ricerca di un elemento in una Lista non ordinata … Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; 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 END; Lista d’input A B C E D C Elemento da trovare

Osservazioni sulla Condizione While HP: B= true elemento non trovato Q<>NIL scansione non terminata Q<>NIL AND B  elemento non trovata e la lista non è vuota, quindi continuare la scansione B=true Q.inf=X Q=A.next B=false false true B Q<>NIL B and (Q<>NIL) 1 1 0 1 0 0 0 0 0 0 continua elemento trovato, non abbiamo raggiunto la fine elemento non trovato, abbiamo raggiunto la fine non si verifica mai, PERCHÉ?

Ricerca di un elemento in una Lista ordinata … Function Ricerca (Var Inizio: Pun, X: Info): Boolean Var Q: Pun; B:Boolean; Begin Q:=Inizio; 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 END;

Homework Definire una funzione di tipo puntatore che restituisca il valore NIL se l’elemento non esiste e restituisca il puntatore all’elemento con informazione X se esiste

Inserimento in Liste Ordinate Type stringa = … Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var Inizio: Pun, X: stringa) Var W1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO Begin W2:=W1; W1:=W1 .Next End; IF W1.Inf = X THEN W1 . Conta:= W1 .Conta+1 ELSE Begin IF W1.Next:= NIL THEN Begin W2:=W1; W1:= NIL End Inserisci (W1) Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3 .Conta:= 1; W3.Next:=W W2.Next:=W3 End ; Begin %programma principale% New(Radice); Radice .Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End.

Osservazione Le operazioni di inserimento di un nuovo elemento in una Lista possono essere variate in modo da passare come parametro l’elemento già creato tramite una procedura Crea Elemento … Procedura CreaElem (Var P: Pun, X: Info) Begin new(P); P.Inf:=X; P.Next:=NIL End;

Operazioni definite su Lista Creazione di un nuovo elemento CreaEl(R,X) Inserimento di un elemento in testa InsTesta(R,E) Inserimento di un elemento in coda InsCoda(R,E) Inserimento di un elemento dopo P Inserisci(P,E) Eliminazione dell’elemento in testa ElimTesta(R) Eliminazione di un elemento in coda ElimCoda(R) Eliminazione di un elemento dopo P Elimina(P) Scansione della lista Scansione(R) Creazione di una lista di N elementi CreaT(R,N) Creazione di una lista di N elementi 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

Introduzione agli Algoritmi Esercizi su Liste Dr. Emanuela Merelli

Lista Lineare è un insieme ordinato di n elementi, tutti dello stesso tipo, ogni elemento ha un predecessore e un successore Proprietà: X1 è il primo elemento della lista Xi è preceduto da xi-1 e seguito da xi+1 Xn è l’ultimo elemento della lista N= lunghezza della lista N=0  Lista Vuota A B C E D L(A, B, C, D) Relazione di precedenza: per accedere ad un elemento si deve accedere a tutti quelli che lo precedono

Lista Lineare come Tipo di Dato Astratto Dominio dei valori Insieme dinamico basato su un elemento omogeneo Operazioni su Lista Lineare Inserire un elemento in testa Inserire un elemento in coda Inserire un elemento dopo un elemento puntato da P Creare una lista con N elementi ….

Operazioni su Liste Lineari Inserimento di un elemento in Testa alla Lista Struttura Dati Sequenza ordinata di elementi di tipo record formati da due campi, un campo informazione e un campo puntatore ad elemento. Struttura dati dinamica Utilizzo del tipo puntatore Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

Inserimento di un elemento in testa Algoritmo Creare il nuovo elemento Memorizzare l’informazione nel nuovo elemento Collegare il nuovo elemento in testa alla lista esistente Il campo puntatore del nuovo elemento assume il valore di inizio lista Inizio lista assume il valore del nuovo elemento Lista d’input Inizio B C D E Nuovo elemento A Lista d’output A B C E D Inizio

Inserimento di un elemento in testa Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura Testa (Var Inizio: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next := Inizio; Inizio:= Q; Lista d’input Inizio B C D E Nuovo elemento A Lista d’output Inizio A B C E D

Homework Definire una Funzione Testa di tipo puntatore che prenda in input un valore X e restituisca Testa con X come primo elemento

Eliminazione dell’elemento in testa ad una lista Type T = RECORD Inf : Integer; Next : TP; END; Pun =  T; Var Primo: Pun; A: T; Procedura Testa (Var Inizio: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Next := Inizio; Inizio:= Q; Lista d’input Inizio A B C E D Elemento eliminato A Lista d’output B C E D Inizio

Scansione di una lista lineare … Procedura Scansione (Var Inizio: Pun) Begin WHILE Inizio <> NIL DO Writeln(Inizio.Inf); Inizio:= Inizio.Next; End; 3 345 9 5 23

Inserimento di un elemento in coda … Procedura Coda (Var Inizio: Pun, X: Integer) Var P, Q: Pun; Begin New(Q); Q.Next := NIL; Q.Inf := X; P:= Inizio; IF Inizio=NIL THEN Inizio:=Q ELSE Begin WHILE P.Next <> NIL DO P:=P.Next; P.Next:=Q; END; Lista d’input Inizio A B C D Nuovo elemento E Lista d’output A B C E D

Inserimento di un elemento dopo un elemento puntato da P … Procedura Inserisci (Var P: Pun, X: Integer) Var Q: Pun; Begin New(Q); Q.Inf := X; Q.Pun:= P.Next; Q.Next:=P; END; Lista d’input P A B D E Nuovo elemento C Lista d’output A B C E D

Creazione di una lista di N elementi … Procedura Crea (Var Inizio: Pun, N: Integer) Var P, Q: Pun; Begin Inizio:= NIL; WHILE N>0 DO New(Q); Q.Next := Inizio; Inizio:= Q; Q.Inf:=N; N:= N-1 END; 3 345 9 5 23

Esercizio 1 Data un elenco di parole, si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

Inserimento in Liste Ordinate Type stringa = … Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Procedura Ricerca (Var Inizio: Pun, X: stringa) Var W1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; IF W1 = NIL THEN Inserisci (NIL) ELSE WHILE (W1.Inf < X AND (W1.Next <> NIL) DO Begin W2:=W1; W1:=W1 .Next End; IF W1.Inf = X THEN W1 . Conta:= W1 .Conta+1 ELSE Begin IF W1.Next:= NIL THEN Begin W2:=W1; W1:= NIL End Inserisci (W1) Procedura Inserisci (W:Pun) Var W3: Pun; New (W3); W3.Inf:= X; W3 .Conta:= 1; W3.Next:=W W2.Next:=W3 End ; Begin %programma principale% New(Radice); Radice .Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End.

Introduzione agli Algoritmi e alle Strutture Dati Liste e allocazione dinamica -- esercizio Dr. Emanuela Merelli

Esercizio 1 Dato un elenco di parole (testo), si vuole costruire una Lista Ordinata contenente un elemento per ogni distinta parola. Il generico elemento della Lista conterrà un campo informazione (la parola) e un contatore che indicherà il numero di occorrenze della parola nell’elenco.

Esempio L’Algoritmo proposto è la generalizzazione Elenco E B D A B, 3 C,1 E,8 D,5 Inizio L’Algoritmo proposto è la generalizzazione dell’ Inserimento di un elemento in una lista ordinata

Ordinamento di una lista L’ordinamento della lista viene ottenuto inserendo nuovi elementi al posto appropriato, piuttosto che in testa alla lista Ciò deriva dalla flessibilità con cui gli elementi possono essere inseriti in qualunque posto. Questa caratteristica non è presente nella struttura array. Notiamo che l’equivalente ricerca binaria per array non è disponibile per le liste in generale

Inserimento in una lista Ordinata ognuno contenente come informazione una parola e un intero n Algoritmo Caso 1: Lista vuota Passo 1. l’elemento è inserito in testa Caso 2: Lista non vuota Passo 1. Si cerca l’elemento Caso 2.1: L’elemento esiste nella lista Passo 1. Si incrementa il contatore Caso 2.2: L’elemento non esiste Caso 2.2.1. Se il nuovo è il più piccolo Passo1. L’elemento è inserito in testa Caso 2.2.2. Se è compreso tra due valori Passo 1. L’elemento è inserito prima dell’elemento con chiave più grande Caso 2.2.3 Se è il più grande Passo 1. L’elemento è inserito in coda

Inserimento prima di P 1a soluzione … New(Q); Q..Next=P.Next, Q.Inf:=P .Inf; P .Inf:=X; P .Next:=Q …. C Q B C E D Q B D E P

Inserimento prima di P 2a soluzione Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; D Q B C E D Q W2 P B C E W2 P

Programma Principale Pila o Stack Memoria Dinamica Memoria Statica Program Esercizio1; Type stringa = … Pun = Parola; Parola = RECORD Inf : Stringa; Conta: Integer Next : Pun; END; Var K: Stringa; Radice:Pun; Pila o Stack nil Memoria Dinamica ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K) End; End. Radice K Memoria Statica

Caso 1: Lista Vuota Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; Caso 1: Lista Vuota … Var K: Stringa; Radice:Pun; Procedure Ricerca ( var Inizioe:Pun, X:Stringa) Var P1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; If W1 = NIL Then Inserisci (NIL) Else While (W1.Inf < X And (W1.Next <> NIL) Do W2:=W1; W1:=W1 .Next End; If W1.Inf = X Then W1. Conta:= W1.Conta+1 Else Begin If W1.Next:= NIL Then Begin W2:=W1; W1:=NIL; End Inserisci(W1); End; End ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K); End; End. Q E nil P Inserisci Inizio=Radice Pila o Stack X W1 Ricerca W2 nil Memoria Dinamica Radice K Memoria Statica

Caso 2: Lista Non Vuota Inserimento in testa Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; Caso 2: Lista Non Vuota … Var K: Stringa; Radice:Pun; Procedure Ricerca ( var Inizio:Pun, X:Stringa) Var P1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; If W1 = NIL Then Inserisci (NIL) Else While (W1.Inf < X And (W1.Next <> NIL) Do W2:=W1; W1:=W1 .Next End; If W1.Inf = X Then W1. Conta:= W1.Conta+1 Else Begin If W1.Next:= NIL Then Begin W2:=W1; W1:=NIL; End Inserisci(W1); End; End ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K); End; End. Inserimento in testa Memoria Statica Dinamica Pila o Stack Radice K E nil B Memoria Statica Dinamica Pila o Stack Radice K nil E Inserisci Q P W2 W1 X Inizio=Radice Ricerca B

Caso 3: Lista Non Vuota Inserimento in testa Procedure Inserisci(P: Pun) Var Q:Pun; Begin New(Q); Q.Inf:=X; Q.Next=P, W2.Next:=Q; End; Caso 3: Lista Non Vuota … Var K: Stringa; Radice:Pun; Procedure Ricerca ( var Inizio:Pun, X:Stringa) Var P1,W2 : Pun; Begin W2:= Inizio; W1:=W2 .Next; If W1 = NIL Then Inserisci (NIL) Else While (W1.Inf < X And (W1.Next <> NIL) Do W2:=W1; W1:=W1 .Next End; If W1.Inf = X Then W1. Conta:= W1.Conta+1 Else Begin If W1.Next:= NIL Then Begin W2:=W1; W1:=NIL; End Inserisci(W1); End; End ... Begin %programma principale% New(Radice); Radice.Next=NIL; Read(K); While K <> “Fine” DO Begin Ricerca(Radice, K) Read(K); End; End. Inserimento in testa Memoria Statica Dinamica Pila o Stack Radice K E nil B D W2 W1 X Inizio=Radice Ricerca Inserisci Q P Memoria Statica Dinamica Pila o Stack Radice K E nil B D W2 W1 X Inizio=Radice Ricerca Memoria Statica Dinamica Pila o Stack Radice K E nil B D Memoria Statica Dinamica Pila o Stack Radice K E nil B D W2 W1 X Inizio=Radice Ricerca Inserisci Q P Memoria Statica Dinamica Pila o Stack Radice K E nil B W2 W1 X Inizio=Radice Ricerca

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 Complessità?