













Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Elementi base di Informatica: Codifica Binaria, Rappresentazione del testo e immagini, UTF8, ASCII table, Componenti del Calcolatore, Algoritmica e Variazioni/Estensioni
Tipologia: Appunti
1 / 21
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!














Lezione 1 PT.
Rappresentazione dell’informazione
Il bit è l'unitá minima di misura dell'informazione (dall'inglese “binary digit”), definita come la
quantità minima di informazione che serve a distinguere due possibili eventi. Un bit è una cifra
binaria, ovvero uno dei due simboli del sistema numerico binario, classicamente chiamati “zero” 0 e
“uno” 1.
Una sequenza di 8 bit viene chiamata byte, nome che deriva dalla parola inglese “bite” (“morso”,
“boccone”, “pezzo” in Italiano) coniato anche per assonanza col termine “bit”, ma rinominato per
evitare confusioni accidentali di pronuncia con questo.
Il byte è divenuto l'unitá di misura fondamentale della quantità di informazione e delle capacità di
memoria
La possibilità di rappresentare informazioni di varia natura attraverso numeri permette di
manipolare le informazioni rappresentate attraverso operazioni fra numeri che i calcolatori sono in
grado di compiere in modo efficiente.
Rappresentazione di numeri in bit
Comunemente, i numeri vengono scritti in notazione posizionale. In notazione posizionale, il
significato di ogni cifra dipende dalla sua posizione. Per esempio, i due numeri 73 e 37 hanno
significati diversi nonostante siano composti dalle stesse cifre (“3” e “7”). In base 10, le cifre che
compongono i numeri interi hanno significato (da destra verso sinistra) di unita`, decine, centinaia,
etc. Si veda il seguente esempio
Allo stesso modo, nella rappresentazione di numeri in base 2 (binaria), le “cifre” possibili sono
soltanto due “0” e “1” e, in modo analogo nella base 10, il loro valore è uguale a potenze crescenti
della base numerazione 1 = 2
, etc (destra verso sinistra). Quindi, per
esempio, il numero binario 10011 sarà uguale al numero
Si osservi che si usa la notazione (x) p
per dire che il numero x e rappresentato in base p.
In una sequenza di bit si usa chiamare il bit più a destra come il meno significativo (in quanto e
quello che “vale” meno, come le unità in base 10). Analogamente, il bit più a sinistra si chiama bit
più significativo.
Oltre alla rappresentazione in base 10, che è per noi più naturale, e quella binaria appena descritta,
esiste un'altra rappresentazione che riveste un ruolo di notevole importanza nell'informatica: la
rappresentazione esadecimale.
Il sistema numerico esadecimale (a volte abbreviato come hex) è un sistema numerico posizionale
in base 16. Per questo motivo, ha necessità di usare 16 simboli per rappresentare le cifre. Oltre alle
“classiche” cifre da 0 a 9 presenti nella numerazione in base 10, che hanno lo stesso valore della
base 10, la rappresentazione esadecimale utilizza le seguenti sei cifre aggiuntive:
“a” oppure “A”, con valore 10
“b” oppure “B”, con valore 11
“c” oppure “C”, con valore 12
“d” oppure “D”, con valore 13
“e” oppure “E”, con valore 14
“f” oppure “F”, con valore 15
La seguente tabella
elenca tutte le cifre esadecimali (seconda colonna), il loro valore in base 10 (prima colonna) e la
rappresentazione di ogni cifra in base 2 (terza colonna).
Si noti come la cifra più grande in ogni base di numerazione abbia sempre il valore della base meno
uno: in base 10 la cifra più grande è 9=10-1, in base 2 la cifra più grande è 1=2-1, mentre in base 16
la cifra più grande è (F) 16
= 16-1 che vale 15.
Di seguito si riporta un esempio di rappresentazione in esadecimale
Ricordando che le cifre di valore 11 e 14 in base 16 sono rispettivamente “B” e “E”, possiamo
concludere che
Conversione fra binario ed esadecimale e viceversa
La conversione di un numero rappresentato in una certa base b in un'altra base b
a
, quindi potenza a-
esima di b, è molto semplice in quanto si riesce a fare senza compiere la sequenza di divisioni viste
in precedenza. È questo il caso della conversione da base 2 a base 16=
, molto frequente in
informatica.
Nel passaggio da base 2 a base 16=
è sufficiente:
meno significativo
Segue un esempio
Analogamente, per convertire da esadecimale (base 16) a binario (base 2), si possono affiancare le
conversioni delle singole cifre, per esempio
Si osservi che questa proprietà che permette la conversione fra basi senza fare le divisioni, si può
sfruttare soltanto per conversioni fra basi di cui una è potenza dell'altra (come 16 e 2). Non si può
fare invece nel passaggio da base 10 a base 2. Difatti:
Operazioni fra bit (e byte)
I calcolatori compiono le operazioni su bit a partire da alcune operazioni fondamentali dette
operazioni booleane. Approfondiremo le seguenti operazioni booleane:
può anche vedere come un “indicatore di diversità”: x XOR y vale 1 se x e y hanno un valore
diverso, 0 se hanno lo stesso valore.
Un'operazione si dice:
Bisogna prestare attenzione al fatto che in questo caso, l’aggettivo “binario” sottolinea il numero di
operandi dell’operazione, non la base di numerazione in cui si opera.
La combinazione di operazioni booleane, anche con l'uso di parentesi, definisce espressioni
booleane. I valori delle espressioni booleane si rappresentano in tabelle di verità.
In una tabella di verità sono elencate tutte le possibili combinazioni delle variabili coinvolte in
un’espressione su ogni riga. Inoltre, per ogni possibile valore delle variabili viene scritto il valore
dell’espressione. Nelle tabelle di verità, il valore “1” rappresenta “vero”, mentre lo “0” rappresenta
“falso”. In seguito sono riportate le tabelle di verità delle sopra menzionate operazioni elementari.
Èpossibile comporre espressioni booleane complesse. Per esempio, la seguente espressione
w = (x AND y ) XOR (x OR z) ha la seguente tabella di verità
Si osservi che:
n
con n uguale al numero
delle variabili coinvolte nell'espressione
I file salvati sul disco hanno dei nomi. Per convenzione la loro estensione (ultimi caratteri dopo il
punto “.”) determina l'informazione rappresentata e la sua codifica. Esempio:
txt, file di testo con codifica ASCII
pdf, documenti con codifica PDF (Portable Document Format)
html, pagina web
zip, file compresso con metodo Zip
exe, eseguibile su macchine Windows
jpg, immagine con codifica JPG (Joint Photographic expert Group).
gif, immagine con codifica GIF (Graphics Interchange Format).
Le convenzioni possono cambiare nel tempo e fra computer diversi. Le convenzioni possono anche
essere un rischio: Windows si affida molto all'uso di estensioni e proverà quindi a eseguire tutti i
file che hanno estensione “.exe”. Nei sistemi operativi che fanno molto affidamento alle estensioni
(per esempio, Windows), il cambio dell'estensione potrebbe determinare una difficoltà nell’apertura
del file. Con il doppio click, infatti, tali sistemi operativi selezionano l'applicazione con cui aprire il
file sulla base dell'estensione.
Come codificare un testo in una sequenza di byte? Per comprenderlo è necessario capire da cosa sia
fatto il testo. Il testo è una sequenza di lettere maiuscole o minuscole, spazi e segni di punteggiatura.
Èpossibile codificare il testo in un file, codificando ogni singolo carattere e affiancando poi le
codifiche dei singoli caratteri secondo l'ordine con cui compaiono nel testo.
Esistono varie codifiche di caratteri. Quella più diffusa è certamente la codifica ASCII (American
Standard Code for Information Interchange) proposta dall'organismo di standardizzazione ANSI
(American National Standard Institute).
Attraverso la codifica ASCII, ad ogni carattere viene associato un numero da 0 a 127, quindi
rappresentabile su 7 bit. Se rappresentata su un byte, ovvero 8 bit, la codifica ASCII ha sempre il bit
più significativo uguale a 0. La tabella riportata sotto elenca i caratteri codificati e i loro codici
(numeri sia in esadecimale che decimale).
Il codice ASCII fu inventato per le comunicazioni fra telescriventi. Per questo motivo, oltre ai
caratteri che possiamo trovare nei testi (con codifiche dal 32 al 126), i primi 32 caratteri (detti
speciali o non stampabili) corrispondono a comandi da dare ad una telescrivente. Si veda, per
esempio, il carattere con codice 4 che codifica il comando “End of transmission”, che non è
certamente un carattere che può apparire nei testi.
Alcuni di questi caratteri speciali, vengono però usati anche nella codifica del testo. Per esempio, il
carattere con codifica 10 “New line” viene usato per andare a capo in un testo.
La codifica dei caratteri stampabili segue l'ordine naturale. Per esempio, la codifica delle lettere
minuscole (alfabeto inglese di 26 lettere) inizia con 97 (codifica della “a”) e termina con 122
(codifica della “z”). Si osservi che i caratteri stampabili c'è anche lo spazio (con codica 32).
Per esempio, la codifica del seguente testo
Ciao
a tutti
in ASCII è data da un file che ha il seguente contenuto, scritto in esadecimale
Solitamente le codifiche dei file si scrivono in esadecimale perché in questo modo tutti i byte si
possono scrivere con lo stesso numero di cifre (ovvero 2).
Gli editor di testo semplici (come Blocco Note) permettono di scrivere testo non formattato e di
salvare la sua codifica ASCII su file testo (tipicamente con estensione .txt ).
Codifica ASCII dei caratteri.
Il passaggio da un'immagine originale alla sua rappresentazione in pixel introduce un errore. Una
risoluzione alta permette quindi di cogliere particolari fini di un'immagine, al prezzo, ovviamente,
di un numero maggiore di pixel da codificare e quindi di una maggior dimensione del file che
contiene la codifica dell’immagine.
Codifica del colore
La scelta di una risoluzione permette di passare dalla rappresentazione di un'immagine, alla
rappresentazione di un singolo pixel. Il pixel è rappresentato dal suo colore. Esistono vari modi per
rappresentare il colore. Di seguito se ne illustrano alcuni.
vecchio modo di generare il colore nelle televisioni a tubo catodico. In queste televisioni, ogni pixel
della televisione veniva colorato a seconda dell'intensità con cui veniva colpito da tre fasci di
elettroni, ciascuno corrispondente a colori rosso, verde e blu. In codifica RGB, quindi, il colore
viene rappresentato dall'intensità di ciascuno dei tre colori. Tale intensità è tipicamente
rappresentata da un byte. Un colore RGB, quindi, si rappresenta con 3 byte. Il bianco è il colore
ottenuto con l'intensità massima di tutte e 3 le componenti, difatti la sua rappresentazione è FF FF
La codifica CMYK (Cyan, Magenta, Yellow, Key black), detta anche di quattricromia, è
usata principalmente nelle stampanti a getto di inchiostro. In questo caso, un colore è
rappresentato da 4 numeri, corrispondenti alla quantità della singola componente necessaria
a riprodurre il colore.
La codifica HSV (Hue, Saturation, Value) dall'inglese “tonalità, saturazione, valore", è
particolarmente orientato al modo in cui i colori vengono percepiti dall'essere umano,
essendo basato sulla percezione che si ha di un colore in termini di tinta, sfumatura e tono.
Palette (tavolozza)
I possibili colori ottenibili con la codifica RGB sono pari a tutte le possibili configurazioni di 3 byte
ovvero 2
3x
≃ 16 x 10
Siccome è molto difficile che in un’immagine ci possano essere pixel con tutti i 16 milioni di colori
diversi (si pensi ad una foto con un panorama in cui gran parte dell'immagine è fatta da pixel del
cielo di colore simile), è stato pensato un sistema più efficiente per codificare il colore dei pixel.
In alcuni formati (per esempio, il formato GIF (Graphics Interchange Format), viene definita una
tabella di colori, detta palette, che svolge una funzione analoga alla tabella ASCII usata per la
codifica del testo. Un pixel di un determinato colore sarà quindi codificato dall'indice di quel colore
all'interno della tabella. In un'immagine con una palette di 256 colori, ogni pixel sarà codificato da 8
bit.
Allo stesso modo, se una palette contiene soltanto due colori, come nel caso di un'immagine in
bianco e nero, ogni pixel può essere rappresentato da un bit soltanto. Questo spiega come mai le
immagini in bianco e nero abbiano una dimensione molto minore rispetto alle immagini a colori.
Lezione 1
Processore : dispositivo hardware che permette l'esecuzione di istruzioni (in Inglese: Central
Processing Unit, CPU
Memoria cache : memoria dedicata a contenere parte del contenuto della memoria principale che
viene utilizzata più frequentemente (in Inglese: cache memory)
Memoria principale : dispositivo hardware dedicato a contenere programmi da eseguire e dati utili
alla loro esecuzione. Programmi e dati sono presenti in memoria (memorizzati) sotto forma di
sequenza di byte. La memoria principale è volatile: il suo contenuto viene perso dopo che il
calcolatore viene spento. (in Inglese: main memory)
Bus di comunicazione : canale attraverso cui avviene la comunicazione fra i vari dispositivi
presenti (in Inglese: bus)
Periferiche di input/output : dispositivi che permettono al calcolatore di comunicare con l'esterno.
(in Inglese: I/O devices)
Controllore I/O : dispositivo che permette l'utilizzo delle varie periferiche (in Inglese: I/O
controller)
Il processore esegue continuamente istruzioni. Non appena viene acceso inizia ad eseguire la prima
istruzione contenuta in una locazione di memoria nota e continua così fino allo spegnimento.
Registri
Per l'esecuzione delle istruzioni utilizza i registri. I registri sono piccole zone simili alla memoria,
ma interne al processore, su cui il processore può scrivere e leggere i dati più velocemente rispetto a
quanto farebbe sulla memoria. I registri vengono identificati da un nome. Il nome dei registri è
diverso da processore a processore in base a caratteristiche interne (per esempio, i registri dei
processori Intel si chiamano: EAX, EBX, etc.). Seguendo la metafora della cucina, i registri
rappresentano il piano di lavoro sul cui gli ingredienti (i dati) vengono messi appena prima di essere
elaborati: il cuoco, prima di iniziare a cucinare prende gli ingredienti di cui ha bisogno e li tiene a
verrà prelevata la prossima istruzione. All'accensione, il valore del PC è pari a zero. Inizia quindi a
prelevare la prima istruzione dall'indirizzo zero e così via come descritto in precedenza, fino al suo
spegnimento.
Modalità di codifica delle istruzioni
Ci sono modalità diverse per codificare le istruzioni. Le due famiglie di codifica principali sono:
La codifica CISC è una codifica ricca: permette di avere a disposizione istruzioni complesse che
possono fare più cose. La codifica RISC, invece, è più povera in quanto mette a disposizione poche
elementari istruzioni. Per questo motivo, per eseguire uno stesso compito ci sarà bisogno di più
istruzioni RISC rispetto al numero di istruzioni CISC necessarie. Inoltre, l'esecuzione di una singola
istruzione RISC è più veloce rispetto all'esecuzione di una CISC.
Per capire meglio, si paragonino i due alfabeti cinese e latino. Il primo, parallelamente a CISC,
permette di tradurre più informazioni con un unico simbolo (ovvero l'istruzione); al contrario per
tradurre nell'alfabeto latino la stessa informazione da un carattere cinese si deve usare più di un
carattere. Per esempio, il singolo carattere cinese “成” viene trascritto con 5 caratteri latini con
“cheng”.
Inoltre, una stessa parola si esprime con un numero minore di caratteri cinesi, rispetto al numero di
caratteri latini necessari. Per esempio, la parola “computer” composta da 8 caratteri, in cinese si
scrive “电脑” quindi con 2 caratteri.
Tipicamente, i processori all'interno di Desktop Computer e Personal Computer sono Intel e usano
una codifica CISC. Diversamente, i processori degli smart-phone sono tipicamente processori
ARM, che usano una codifica RISC delle istruzioni.
Confronto fra CISC e RISC.
La scelta di codifica delle istruzioni determina l'Instructure Set Architecture (ISA), che è il modo
con cui sono codificate le istruzioni del processore. CISC e RISC sono due famiglie di ISA. La
scelta dell'ISA è influenzata da motivi commerciali (Monopolio Intel) e dalle tipologie di
applicazioni da eseguire (le applicazioni del Desktop sono diverse dalle applicazioni sullo
Smartphone).
La codifica delle istruzioni è chiamata anche linguaggio macchina. Un modo più semplice per
esprimere un programma è attraverso l'uso dei linguaggi di programmazione di alto livello. Il
compilatore svolge un lavoro di traduzione dal linguaggio ad alto livello al linguaggio macchina
costituito da byte. In linea teorica, è possibile scrivere un programma direttamente in linguaggio
macchina. In pratica, si ricorre ad un linguaggio di alto livello (C, Java, Pascal, Fortran, etc.) che
permette di descrivere le operazioni in un modo più naturale e vicino all'uomo. La creazione del
codice in linguaggio macchina è delegata al compilatore.
Velocità del processore
La velocità del processore è determinata dalla frequenza del clock. Il processore compie un
progresso ogni ciclo di clock (si veda sotto). La velocità di un processore è quindi proporzionale
alla frequenza del clock. La frequenza del clock si misura in Hertz (Hz). Per esempio, in un clock
con frequenza di 3 GHz, ci sono 3 x 10
cicli di clock ogni secondo.
Ciclo di clock
Il numero di cicli di clock necessari per eseguire un'istruzione varia a seconda di diversi fattori:
Il tipo di istruzione. Ci sono operazioni che sono intrinsecamente più complesse da svolgere
di altre (per esempio, la moltiplicazione è più complessa di una addizione o di un'operazione
logica AND , OR , NOT , XOR ).
La tipologia di ISA. Come detto in precedenza, una singola operazione richiede mediamente
un numero minore di cicli di clock su architettura RISC rispetto a CISC (in architettura
RISC il numero di cicli di clock per operazione varia da 1 a 4, mentre nella CISC oscilla da
2 a 20. Queste informazioni vanno interpretate come ordine di grandezza e potrebbero
cambiare con l'evoluzione della tecnologia di realizzazione dei processori).
La disponibilità di operandi (i dati su cui l'istruzione opera). Istruzioni che operano su dati
presenti nei registri sono più veloci rispetto alle stesse che operano su operandi in memoria,
perché l'accesso alla memoria è più lento dell'accesso ai registri.
Il numero di cicli per singola istruzione varia da 2 a 20 su macchine CISC e da 1 a 4 su macchine
RISC (questi devono essere considerati ordini di grandezza).
Cache memory
Potenzialmente, il processore potrebbe eseguire istruzioni anche ogni nanosecondo, ma la memoria
ha un tempo di accesso di circa 50 nanosecondi. Quindi tutte le istruzioni che richiedono un accesso
in memoria sono evidentemente rallentate. Si dice che la memoria costituisce un collo di bottiglia.
Caratteristiche di vari tipi di memoria. I valori riportati hanno puramente un carattere
esemplificativo. La differenza tra SSD (Solid-State Drive) e HDD (Hard Disk Drive) è che la
seconda è costituita da un vero e proprio disco movimentato da un motore, mentre la seconda è
costituita unicamente da componenti elettronici.
Si osservi che anche i registri, i dischi e la capacità di
memorizzazione offerta dai data center (cloud storage) si possono considerare come forme di
memoria. La tabella elenca i vari tipi di memoria dal più vicino al processore (registri) al più
lontano (cloud). Si osservi difatti che i tempi di accesso aumentano all'aumentare della distanza dal
processore (i valori sono puramente indicativi e variano al variare della tecnologia impiegata). Non
sorprendentemente, anche le capacità tipiche aumentano. Difatti avere memorie molto grandi e
molto vicine
al processore non è tecnologicamente fattibile. Mentre avere memorie piccole (bassa capacità) e con
tempi di accesso grandi è semplicemente inutile. Allo stesso tempo, il costo di ogni singolo byte di
memoria diminuisce all'aumentare della distanza dal processore. Un’utile metafora, in questo caso,
èdall’osservazione del mercato immobiliare. Difatti, il prezzo al metro quadro degli appartamenti
non può che diminuire all'aumentare della distanza dal centro della città dove si svolgono molte
attività (assimilabile al processore).
Oltre al tempo di accesso, capacità e costo, hanno un'importanza anche
il tempo di vita di una memoria, che indica per quanto tempo i dati possono rimanere
memorizzati,
l'affidabilità, che indica il grado di errore che si può incontrare nel rileggere dalla memoria
un dato scritto e la capacità di mantenere l'informazione immagazzinata anche in presenza di
disturbi (per esempio, di origine elettromagnetica)
Architetture multi-processore
Il processore, le memorie e tutti i circuiti integrati (integrated circuits, ICs, in inglese) sono circuiti
elettronici realizzati su silicio. Attraverso a un processo simile alla stampa chiamato litografia, il
silicio può diventare sia conduttore che isolante. Questo permette di disegnare circuiti integrati sul
silicio. Inoltre, il silicio è disponibile in quantità abbondante e a basso prezzo.
Fino al 2004 circa, l'aumento delle prestazioni della CPU è avvenuto aumentando la densità di
integrazione: sulla stessa area di silicio si era in grado di disegnare un numero sempre maggiore di
transistor e quindi di realizzare circuiti sempre più complessi e processori sempre più potenti. Lo
sviluppo dei processori ha seguito una legge empirica detta Legge di Moore (Moore's law) che
determina una crescita esponenziale del numero di transistor in un circuito integrato. Secondo
Moore, il numero di transistor presenti in un circuito integrato raddoppia ogni 2 anni. Nel 2004, il
nuovo processore della Intel (Intel Tejas) fu cancellato dallo sviluppo perché era fisicamente
impossibile raffreddarlo. Difatti, raggiungeva una densità di calore pari al reattore di un missile.
Dal 2004 in poi si è passati da un'architettura a singolo processore a una multi-processore. Oggi
l'aumento delle prestazioni non avviene più migliorando la singola CPU, ma aggiungendo un
numero sempre crescente di processori. In questo caso si parla di architetture multi-processore o
multi-core.
Algoritmica
Selection Sort (ordinamento per selezione)
Un metodo che si può usare con il computer è chiamato selection sort. Funziona cos`ı: trovate per
prima cosa l’oggetto più leggero e riponetelo da un lato. Successivamente, trovate il più leggero tra
gli oggetti rimasti e mettetelo vicino a quello più leggero trovato precedentemente. Ripetete questa
operazione fino a che non avete terminato gli oggetti da pesare.
Contate quanti confronti avete effettuato.
Extra per esperti: mostrate come potete calcolare matematicamente quanti passi sono necessari per
ordinare 8 oggetti? E 9 oggetti? 20?
Quicksort
Quicksort è molto più veloce di selection sort, in particolare quando si hanno insiemi di oggetti
molto grandi. Infatti, è uno dei migliori metodi di ordinamento conosciuti. Funziona così : scegliete
a caso un oggetto e posizionatelo su un piatto della bilancia. Ora confrontate ciascun oggetto
rimanente con quello precedentemente selezionato. Mettete quelli più leggeri a sinistra, l’oggetto
selezionato per primo al centro e quelli più pesanti a destra. (Si potrebbero anche avere molti più
oggetti da un lato rispetto all’altro).
Scegliete uno degli insiemi di oggetti, quello a destra o quello a sinistra e ripetete le precedenti
operazioni. Fate lo stesso per l’altro insieme. Ricordatevi di mantenere al centro l’oggetto che
selezionate per primo.
Continuate a ripetere questa procedura in tutti i gruppi fino a che ciascun gruppo conterr à un
oggetto solo. A questo punto, gli oggetti saranno in ordine dal più leggero al più pesante.
Quanti confronti sono necessari in questo procedimento?
Quicksort è più efficiente di selection sort a meno che non accada di iniziare con l’oggetto più
leggero o pesante in assoluto. Se foste così fortunati da aver scelto l’oggetto con il peso intermedio,
dovreste aver effettuato solo 14 confronti, la metà di quelli effettuati con il selection sort. In ogni
caso, quicksort non sarà peggiore di selection sort e, anzi, potrà essere molto molto più efficiente!
Cosa c’entra tutto questo?
L’informazione è molto più facile da trovare in un insieme ordinato. Gli elenchi telefonici e gli
indici dei libri usano l’ordine alfabetico. La vita sarebbe molto più complessa se non lo facessero...!
Se una lista di numeri è ordinata, i casi agli estremi sono più facili da notare perchè questi sono
all’inizio o alla fine della lista. I casi duplicati sono anch’essi facili da notare, perchè sono vicini tra
loro.
I computer passano molto del loro tempo a mettere in ordine oggetti, per questo motivo gli
informatici hanno cercato di trovare metodi veloci ed efficienti per farlo. Alcuni dei metodi più
lenti, come insertion sort, selection sort o bubble sorti, possono essere utili in situazioni speciali, ma
sono generalmente usati quelli più veloci come quicksort perchè sono molto veloci quando operano
su enormi liste. Per esempio, per ordinare 100.000 elementi, il quicksort è normalmente 2 mila volte
più veloce del selection sort. Se però vogliamo ordinare un milione di elementi diventa 20 mila
volte più veloce. I computer spesso devono elaborare milioni di elementi (moltissimi siti web hanno
milioni di clienti e ogni fotografia scattata con una fotocamera digitale ha milioni di pixel); la
differenza fra i due algoritmi può corrispondere a un secondo di elaborazione o più di cinque ore
per svolgere esattamente lo stesso compito. Non solo il ritardo nella risposta non sarebbe tollerabile,
ma questo significherebbe anche che sarebbe stata usata 20 mila volte più elettricità (che non solo
causa un maggiore impatto ambientale ma riduce anche la vita delle batterie nei dispositivi portatili.
La scelta dell’algoritmo giusto o errato ha quindi serie conseguenze.
Quicksort sfrutta un concetto chiamato ricorsione. Questo significa che si continua a dividere una
lista di oggetti in parti più piccole applicando lo stesso tipo di ordinamento alle nuove parti più
piccole. Questo approccio in particolare è denominato divide et impera. La lista è ripetutamente
suddivisa finché è sufficientemente piccola da conquistare (impera). Per quicksort, le liste sono
suddivise finché non contengono un solo elemento. è banale ordinare un solo elemento! Sebbene
sembri molto laborioso, questo metodo è incredibilmente più veloce di altri.
Soluzioni e suggerimenti
alla volta tenendo traccia del più leggero fino a quel momento. Quindi, confrontate due
oggetti e tenete il più leggero, ripetendo il metodo fino a che tutti gli oggetti siano stati
considerati.
volta 2 se i bambini comprenderanno che il confronto è un operatore transitivo (cioè , se A è
più leggero di B e B è più leggero di C, allora A dev’essere più leggero di C).
LA CITTà FANGOSA
Variazioni ed estensioni.
Quello che segue `e un modo alternativo di rappresentare città e strade:
Le case sono rappresentate da cerchi, le strade fangose da linee e la lunghezza delle strade da un
numero vicino alla linea.
Gli informatici e i matematici usano spesso questo diagramma per rappresentare problemi. Lo
chiamano grafo. Questo potrebbe causare un po’ di confusione poiché ́e la parola assomiglia a
quella usata in ambito statistico per rappresentare dati numerici cioè il “ grafico ”, ma sono due cose
diverse, anche se i nomi si assomigliano. In un grafo, le lunghezze delle linee possono non essere
correlate al numero che hanno vicino.
Costruite un vostro esempio di città fangosa e risolvetelo con i vostri compagni. Potete trovare una
regola che descriva quante strade o connessioni sono necessarie per la miglior soluzione? Dipende
da quante case ci sono nella città?
Cosa c’entra tutto questo?
Supponete di dover progettare come portare ad una nuova comunità l’energia oppure il gas o
l’acqua. Una rete di fili o di tubi deve connettere tutte le case all’azienda elettrica o di fornitura
dell’acqua. Ciascuna casa deve essere collegata alla rete in un qualche punto e il percorso di
collegamento tra la casa e l’azienda non e importante più di tanto, ciò chee importante `e che la
casa sia collegata.
Il problema di progettare una rete con un percorso totale minimo è chiamato minimal spanning tree.
I minimal spanning tree non sono utili solo per il gas o l’elettricità ; ci aiutano anche a risolvere
problemi nelle reti di computer, nelle reti telefoniche, nelle condotte petrolifere, nelle rotte aeree.
Ad esempio, quando si decide quale rotta di viaggio è la migliore per una persona, occorre
considerare non solo quanto costerà al viaggiatore, ma anche quanto costerà in generale. Nessuno
vorrebbe passare ore in aereo prendendo la rotta più lunga perché è più economica. Il problema
della città fangosa potrebbe non essere di molto aiuto per queste reti, perché ́e calcola il percorso
minimo totale delle strade o dei voli aerei.
Ci sono algoritmi efficienti per risolvere i problemi minimal spanning tree. Un metodo semplice
che conduce ad una soluzione ottima `e quello di partire senza alcun collegamento, aggiungendoli a