Sei sulla pagina 1di 17

Piero Gallo Fabio Salerno

Task
Corso di informatica

2
il libro si estende sul web

Gli archivi
non sequenziali

Lorganizzazione
non sequenziale

il libro si estende sul web

LEZIONE

Lorganizzazione logica non sequenziale


Lorganizzazione sequenziale non risponde a unefficiente gestione di alcune problematiche, come, ad esempio, quelle legate a una frequente interrogazione dellarchivio e a ripetuti aggiornamenti dei dati. Tale situazione, infatti, presupponendo una scansione parziale o totale dellarchivio, richiede uno snellimento
delle operazioni di ricerca, in modo da abbreviare i tempi di accesso. Questi tempi, infatti, possono divenire a volte decisamente lunghi, con conseguente perdita
di efficienza del programma stesso. In tale situazione, lorganizzazione pi adatta e che risponde con maggiore efficienza quella non sequenziale.
Lorganizzazione logica non sequenziale una tecnica di organizzazione che
consente di accedere a un record senza dover attraversare tutti quelli che lo
precedono, in quanto possibile ricavare direttamente lindirizzo di una registrazione tramite la chiave del record stesso.
Dalla definizione si deduce facilmente che:
lorganizzazione non sequenziale non necessita che i record siano memorizzati in maniera contigua allinterno del dispositivo di memoria ausiliaria; pertanto, ogni record non caratterizzato dalla presenza di un predecessore e di un
successore;
necessario che un campo del record rivesta il ruolo di chiave primaria, in
modo che sia possibile individuare univocamente il record al quale accedere,
creando, cos, una relazione tra il valore della chiave e lindirizzo del record.
Su archivi non sequenziali sono consentite le operazioni di lettura, scrittura, riscrittura, cancellazione e posizionamento.
Lorganizzazione non sequenziale viene implementata nei seguenti modi, che si
differenziano per il ruolo che la chiave primaria assume nellarchivio e per i relativi metodi di accesso:
organizzazione relative;
organizzazione hash;
organizzazione a b-alberi.

Lorganizzazione fisica non sequenziale


Con archivio fisico sequenziale si indica il modo in cui i file sono scritti su disco e non la natura logica degli stessi, descritta nella precedente lezione. Un archivio fisico sequenziale composto da blocchi di record non necessariamente contigui.
Per memorizzare questi tipi di
file, il sistema operativo adotta
delle tecniche che consentono
di collegare linsieme dei blocchi
che compongono il file: la tecnica dellallocazione concatenata
e quella dellallocazione indicizzata.
Nellallocazione concatenata si
utilizza la tecnica studiata per gestire le liste concatenate, pertanto ogni blocco conterr un riferimento al successivo in modo da
consentire laccesso ordinato a
ciascuno di essi sino al raggiungimento dellultimo.

File

Blocco
iniziale

Lunghezza

14

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Lorganizzazione non sequenziale

LEZIONE 1

Questo tipo di allocazione rimuove il problema della frammentazione tipico dellallocazione contigua, poich
consente un tipo di allocazione sparsa, ma purtroppo non esente da inconvenienti; uno di essi legato alladozione della tecnica di memorizzazione prevista per la lista concatenata: in questo modo, infatti, per accedere al blocco N occorre necessariamente percorrere tutti i blocchi sino al blocco di posizione N1. Ci significa che, pur con unorganizzazione logica ad accesso diretto, le prestazioni saranno limitate.
Un ulteriore problema nasce dal fatto che i riferimenti al blocco successivo presenti nei singoli blocchi che compongono il file potrebbero andare persi, compromettendo il reperimento dellintero file. Una soluzione prevede di inserire in ogni blocco interessato alla memorizzazione del file non solo il collegamento al blocco successivo, ma anche quello al precedente e lo stesso nome del file, in modo che il sistema operativo abbia pi
informazioni per poter recuperare il file in caso di perdita di collegamenti.
La soluzione pi utilizzata fa ricorso a una specifica tabella denominata FAT (File Allocation Table) che rappresenta limmagine virtuale dei blocchi su disco e che contiene i riferimenti tra i vari blocchi, evitando, cos, di
memorizzare gli stessi allinterno del file. La FAT il tipico file system dei sistemi DOS, di alcune versioni di
Windows e dei sistemi MacOS.
FAT
File

Blocco
iniziale
8

0
1
2
...
7
9
...
13
14
15
...
25
26
27
28
...
35
36
...

35
25

14
EOF

13
28

Lapproccio basato sulla FAT, pur eliminando molti problemi, pu influire negativamente sulle prestazioni quando i file sono grandi e soprattutto quando i dischi sono di notevoli dimensioni. Per risolvere il problema viene
adottata unulteriore tecnica che prende il nome di allocazione indicizzata, la quale consente di raccogliere tutti i riferimenti relativi ai blocchi allocati per i file allinterno di un vettore chiamato blocco indice. In altri termini, questo tipo di allocazione prevede un blocco indice per ogni file presente sul filesystem. In questo modo,
il recupero dei blocchi diviene semplice, veloce ed efficiente: per reperire il blocco N di un file occorre solo accedere allelemento N del blocco indice e leggere lindirizzo di memoria di massa in esso presente. Solitamente
il blocco indice memorizzato in un file per accedere al quale si memorizza lindirizzo fisico nella directory che
lo contiene (come si vede nella figura). Nel caso in cui lindice dovesse avere dimensioni molto grandi diviene
necessario avere un blocco indice per il blocco indice.
Questo metodo di allocazione usato nei sistemi Unix dove i blocchi indici sono chiamati i-node.
File

Blocco
indice
8

FAT
0
1
2
3
4
5

25
2
35
28
13
14

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Lorganizzazione
relative e
lorganizzazione hash

il libro si estende sul web

LEZIONE

Lorganizzazione relative
Nellorganizzazione relative la chiave primaria di ogni record identifica univocamente sia il record stesso ,sia lindirizzo logico in cui il record registrato.
In altri termini, questo tipo di organizzazione possibile solo quando la chiave
corrisponde alla posizione del record allinterno dellarchivio.
Ad esempio, un foglio di calendario strutturato in modo che a ogni giorno k corrisponda la k-esima riga dello stesso foglio. Quindi il giorno 5 si trova in quinta
riga, il giorno 28 in ventottesima riga. Supponiamo di dover registrare un tabulato con le temperature di una localit rilevate ogni ora. chiaro che troveremo la
temperatura delle ore 12 nella dodicesima riga, quella delle 20 nella ventesima
riga e cos via. Con tale organizzazione, larchivio pu essere paragonato a una
specie di vettore memorizzato su dispositivi di memoria di massa.
TABULATO TEMPERATURE
Ore 1

Ore 2

Ore 3

...
Ore 23

Ore 24

Nellorganizzazione relative, la gestione degli indirizzi fisici affidata al sistema


operativo. Per determinare lindirizzo del k-esimo record, il sistema operativo
moltiplica la dimensione del record, ossia la sua lunghezza, per (K1) e, successivamente, somma tale valore a quello dellindirizzo fisico del primo record registrato nellarchivio.
Un altro esempio di archivio a organizzazione relative pu essere quello che contiene le informazioni inerenti i posti di un aereo, che sono numerati da 1 a N.
Ciascun record dellarchivio, pertanto, rappresenta un posto che sar cos individuato tramite il suo numero.
Tra i principali vantaggi di questo tipo di organizzazione, ricordiamo che:
a ogni record corrisponde una chiave numerica indicante la posizione occupata dal record allinterno dellarchivio (indirizzo logico);
lorganizzazione relative pu essere utilizzata solo su supporti di memorizzazione ausiliari ad accesso diretto;
in tale tipo di organizzazione consentito sia laccesso sequenziale, sia quello
diretto, quindi lorganizzazione relative pu essere gestita indifferentemente
come archivio sequenziale o come archivio non sequenziale;
lorganizzazione relative risulta molto vantaggiosa per le operazioni interattive;
utilizzando puntatori in questo tipo di organizzazione possibile ottenere un
ordine logico diverso da quello fisico;
lorganizzazione relative offre la possibilit di accedere ai record con una chiave alfanumerica (ma ci a carico del programmatore).

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Lorganizzazione relative
e lorganizzazione hash

LEZIONE 2

Tra gli svantaggi, invece, ricordiamo che gli archivi relative presentano un inconveniente: spesso molto difficile riuscire a impostare una relazione univoca tra la
chiave primaria e la posizione nella quale memorizzare il record. Questo inconveniente obbliga il programmatore a utilizzare chiavi legate strettamente alla posizione relativa del singolo record allinterno dellarchivio, oppure a utilizzare particolari metodi di randomizzazione.
Ricordiamo, infine, che nellorganizzazione relative la cancellazione pu avvenire
solo logicamente, a eccezione dellultimo record.

Lorganizzazione hash
La tecnica hash si basa sullutilizzo di funzioni che trasformano la chiave primaria di ciascun record in un numero intero, che rappresenta lindirizzo logico, detto indirizzo hash, del record stesso.
Pi in generale, applicare la tecnica hash significa definire una funzione di randomizzazione H (funzione hash) che associ a ogni record lindirizzo di un record logico in cui possibile memorizzarlo, attraverso la trasformazione della chiave K
in un intero X compreso tra 1 e N, dove N il numero di indirizzi logici che sono
a disposizione.
H(K) = X
Lindirizzo X deve essere calcolato tutte le volte che occorre accedere al record di
chiave K per effettuare operazioni di I/O.

Numero
conto

Dati del conto

REGISTRA

Numero conto

Opzione del menu

GESTIONE
ARCHIVIO

AGGIORNA

CONTI

Numero conto
CANCELLA

Somma

VISUALIZZA

Dati del conto

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

La funzione hash

il libro si estende sul web

LEZIONE

La scelta della funzione hash assume un ruolo di fondamentale importanza, in


quanto una funzione di trasformazione non idonea pu rendere inefficiente o anche completamente invalida lorganizzazione stessa. Una funzione hash ottimale
deve:
1. essere facilmente calcolabile, cio composta da calcoli che siano i pi semplici possibile, in modo da non appesantire il procedimento di conversione della
chiave e diminuire, cos, il tempo di accesso;
2. produrre sempre lo stesso indirizzo a partire dalla stessa chiave;
3. generare indirizzi uniformemente distribuiti nellambito dellarchivio;
4. generare indirizzi casualmente distribuiti nellambito dellarchivio, relativamente a chiavi simili (esempi di chiavi simili possono essere X1, X2, X3, oppure DARE, MARE, CARE);
5. coprire lintero intervallo degli indirizzi evitando, se possibile, che ci siano indirizzi che non vengono mai generati;
6. generare indirizzi diversi per chiavi diverse.
Relativamente allultimo punto, quindi, la funzione ideale quella che a ogni valore della chiave primaria fa corrispondere sempre un indirizzo diverso, di modo
che ogni record possa essere raggiunto tramite un solo accesso. Quando ci accade si parla di trasformazione perfetta.
Supponiamo di dover memorizzare in un archivio i 1000 prodotti giacenti nel
magazzino di un generico punto vendita, con un codice che varia tra 5000 e
5999. Supponiamo, inoltre, che il campo Codice Prodotto, al quale attribuiamo
la funzione di chiave primaria, sia composto al massimo da quattro cifre. La
funzione hash pi semplice consiste nel sottrarre 5000 al valore di ogni codice
e, successivamente, addizionare 1:
H(K) = H(Codice Prodotto) = (Codice Prodotto) 5000) + 1
La funzione restituisce valori compresi tra 1 e 1000 facendo si che a ogni codice corrisponda un solo record.
La situazione presentata nellesempio per, ben lontana dalla realt, in quanto
molto difficile realizzare funzioni hash che consentano una corrispondenza
uno-a-uno tra chiave e indirizzo. Funzioni come quella dellesempio, infatti, richiedono che il numero di record che compongono larchivio fisico sia esattamente uguale al numero dei possibili valori che la chiave pu assumere.
Nella realt, il numero di chiavi effettive da gestire sensibilmente inferiore a
quello delle chiavi ipotetiche e ci porterebbe a un notevole spreco di memoria e,
di conseguenza, a uninefficienza generale dellintera organizzazione.
Per questi motivi si opta per altre funzioni hash che, pur non garantendo una corrispondenza uno-a-uno, cio una trasformazione perfetta, non si discostano molto dal modello ideale. La funzione, in tal caso, produce una corrispondenza molti-a-uno, cio accade che due o pi chiavi, in fase di trasformazione, possano
generare lo stesso indirizzo.
Chiavi
Chiave X
Collisioni
Sinonimi

Chiave K

Chiave Z

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Funzione
hash

Archivio
Rec 1
Rec 2
Rec 3
...
Rec 100
...

La funzione hash

LEZIONE 3

Quando ci accade si produce una collisione, per risolvere la quale occorre disporre di particolari procedure che collochino le registrazioni in conflitto, dette sinonimi, in record di indirizzo diverso. I requisiti descritti precedentemente per la
scelta della funzione hash al punto 4 e al punto 5 rappresentano la condizione necessaria per contenere il fenomeno della collisione.
A tal proposito, possiamo anche formulare un settimo requisito dicendo che scegliere una funzione hash ottimale significa scegliere una funzione che:
7. generi il minor numero possibile di collisioni e definisca apposite procedure
per lallocazione dei sinonimi (gestione delle collisioni).
Supponiamo di dover stabilire lindirizzo logico corrispondente a record aventi le
seguenti chiavi (BOLOGNA, LECCO, OTRANTO, BAGNOLO) per un archivio composto al massimo da 200 record. Per allocare le suddette chiavi ci serviamo del
seguente metodo:
1. si associa a ogni carattere della chiave il corrispondente valore ASCII;
2. si sommano tutti i valori ottenuti;
3. si moltiplica tale somma per il numero di cifre che compongono il nome della
chiave;
4. si calcola il resto della divisione del numero ottenuto per il numero di record
inseribili, cio 200, e si somma + 1, ottenendo il valore dellindirizzo.
Cominciamo con la prima chiave: BOLOGNA
66 + 79 + 76 + 79 + 71 + 78 + 65 = 514
514 x 7 = 3598

B
66

O
79

L
76

O
79

G
71

N
78

A
65

L
76

E
69

C
67

C
67

O
79

O
79

T
84

R
82

A
65

N
78

T
84

O
79

B
66

A
65

G
71

N
78

O
79

L
76

O
79

(3598 MOD 200) + 1 = 198 + 1


Seconda chiave: LECCO
76 + 69 + 67 + 67 + 79 = 358
358 x 5 = 1790
1790 MOD 200 = 190 + 1
Terza chiave: OTRANTO

Collisione

79 + 84 + 82 + 65 + 78 + 84 + 79 = 551
551 x 7 = 3857
3857 MOD 200 = 57 + 1
Quarta chiave: BAGNOLO
66 + 65 + 71 + 78 + 79 + 76 + 79 = 514
514 x 7 = 3598
(3598 MOD 200) +1 = 198 + 1

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

il libro si estende sul web

LEZIONE

Lorganizzazione hash:
calcolo degli indirizzi
Assodato che quasi impossibile realizzare funzioni che consentano una trasformazione perfetta e che, di conseguenza, il problema delle collisioni sar sempre
presente (indipendentemente dalla funzione), occorre concentrare le nostre forze sullo sviluppo di funzioni efficienti, piuttosto che perfette. Esistono molti metodi per calcolare gli indirizzi; esaminiamone solo alcuni.

Il metodo del troncamento


Questo metodo viene utilizzato quando la chiave numerica composta da un elevato numero di cifre e il numero di record che possono essere memorizzati abbastanza limitato. Consiste nellestrarre dalla chiave un sottoinsieme di cifre che
rappresentano lindirizzo.
Supponiamo di avere un archivio che contiene informazioni sui tesserati di una
palestra e sul quale possono essere memorizzati 1000 record partendo dallindirizzo 1. Il ruolo di chiave primaria viene attribuito al numero di tessera di ogni socio, che composto da un numero di sette cifre. Dobbiamo costruire una corrispondenza che a ogni valore della chiave di sette cifre associ un indirizzo di tre
cifre, ossia da 000 a 999. La funzione hash, pertanto, sar ottenuta eliminando
dalla chiave le prime quattro cifre e sommando 1:
H(1548968) + 1 = 969
H(0003254) + 1 = 255
H(3293001) + 1 = 002
H(6331254) + 1 = 255

...

...

...

...

25

Sinonimi

Questo semplicissimo metodo molto efficiente nel caso in cui le chiavi numeriche siano essenzialmente consecutive e con poche interruzioni. Gli svantaggi di
tale funzione risiedono nel fatto che essa produce sinonimi ogni volta che si incontrano chiavi aventi le ultime tre cifre uguali e che il numero di indirizzi logici a disposizione deve essere sempre una potenza di 10. Ci richiede (come spesso accade) che larchivio debba essere composto da un numero di record superiore a
quello effettivamente necessario. Riferiamoci allesempio precedente: se la palestra ha solo 130 soci, deve prevedere sempre un archivio composto da 1000: utile sovradimensionare larchivio (magari prevederne 160), ma predisporre 1000 record , ovviamente, un enorme spreco di memoria! Applichiamo questo metodo a
una chiave alfanumerica. Supponiamo che la chiave da trasformare debba essere
composta da quattro caratteri ottenuti estraendo gli ultimi quattro caratteri della
chiave primaria. Per procedere alla trasformazione, si pu utilizzare il semplicissimo metodo che pone in corrispondenza le 26 lettere dellalfabeto con i primi 26
numeri naturali, proprio come riportato nella tabella riportata a lato.
A questo punto, proprio come nei sistemi di numerazione pesati, si procede alla
costruzione di una funzione che calcoli la sommatoria dei prodotti di ogni carattere per il suo peso, ossia per 26 elevato alla posizione occupata allinterno della
parola. Proviamo a calcolare lindirizzo, o meglio, il numero corrispondente alla
chiave HELLOCIAO.
Estraiamo gli ultimi quattro caratteri dalla chiave HELLOCIAO:
CIAO = C x 263 + 1 x 262 + A x 261 + O x 260 =
= 2 x 263 + 8 x 262 + 0 x 261 + 14 x 260 =
= 2 x 17576 + 8 x 676 + 0 + 14 x 1 =
= 35152 + 5408 + 14 =
= 40574
A questo punto, per calcolare il reale indirizzo, si pu applicare il metodo del troncamento, ma, per farlo, il programmatore deve aver stabilito a priori qual il numero massimo di record che pu contenere larchivio, in modo da poterlo approssimare in modo migliore. Come per il caso di una chiave numerica, anche in

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Lorganizzazione hash:
calcolo degli indirizzi

LEZIONE 4

questo caso lo svantaggio principale deriva da un notevole spreco di memoria e


dalla possibilit di generare diverse collisioni, visto che esistono diverse parole
che possono iniziare o terminare con le stesse lettere.

Il metodo folding
Questo metodo consiste nel dividere la chiave numerica in due o pi parti.
Successivamente, tali parti vengono sommate tra loro e il valore ottenuto (o una
sua parte), viene utilizzato come indirizzo. Il nome folding (termine inglese che
significa piegare) si spiega se si immagina di piegare la chiave congiungendo le
sue estremit, proprio come se fosse scritta su un foglio di carta, e di sommare
tra loro le cifre che ricadono nella stessa posizione. Se la somma ottenuta supera
il numero massimo di cifre di cui deve essere composto lindirizzo, si procede al
troncamento delle prime cifre.
Supponiamo che la chiave sia 563710:
H(563710) = 365 + 710 = 1075
Graficamente abbiamo quanto riportato a lato.
Il valore dellindirizzo , quindi, 1075. Anche questo metodo genera diverse collisioni, poich, ad esempio, H(563710) = H(349132). Inoltre, presenta gli stessi
svantaggi del metodo di troncamento poich, anche in questo caso, allindirizzo
viene riservato uno spazio pari a una potenza di 10. Ribadiamo, infine, che la
scelta di suddividere la chiave in due o pi parti in relazione alla specifica applicazione. Tale suddivisione deve essere attentamente valutata, al fine di consentire una distribuzione uniforme degli indirizzi, per ridurre il pi possibile il numero delle collisioni.

Il metodo della divisione modulo N


Con questo metodo lindirizzo del record si ottiene dal resto della divisione della
chiave numerica per il numero massimo di record memorizzabili nellarchivio. In
generale, se indichiamo con k la chiave e con N il numero massimo di record, lindirizzo del record dato da:
H(K) = K MOD N
Sappiamo che loperatore modulo N fornisce sempre valori compresi tra 0 ed N
1. Se vogliamo che la funzione restituisca indirizzi Hash compresi tra 1 ed N dobbiamo apportare alla funzione la seguente modifica:
H(K) = (K MOD N) + 1
Anche questo metodo ha generato dei sinonimi, ma questo metodo presenta il
vantaggio di poter essere applicato anche in presenza di un numero massimo di
record che non multiplo di 10. Gli indirizzi generati, proprio per la definizione
di modulo, non necessitano di troncamento. Per quanto riguarda i sinonimi, la
scelta del valore N del modulo il punto fondamentale per ridurre al minimo la
loro presenza.
Supponiamo di dover memorizzare le seguenti dieci chiavi in un archivio composto, al massimo, da 20 record:
92
Chiave K
92
64
21
80
12
13
9
88
11
58

64

21

80

12

13

88

11

58

H(K) = (K mod 20) + 1


12 + 1 = 13
4+1=5
1+1=2
0+1=1
12 + 1 = 13
13 + 1 = 14
9 + 1 = 10
8+1=9
11 + 1 = 12
18 + 1 = 19

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Lorganizzazione hash:
gestione delle collisioni

il libro si estende sul web

LEZIONE

Anche ponendo il massimo scrupolo nella scelta della funzione hash, praticamente impossibile evitare il verificarsi delle collisioni.
Le tecniche di gestione delle collisioni sono metodi che consentono di individuare un indirizzo libero per la chiave K nel caso in cui la funzione hash H(K)
restituisca un valore gi ottenuto per unaltra chiave, cio lindirizzo logico di
un record gi occupato.
La gestione corretta di questa specifica situazione riveste particolare importanza
sia nella fase di inserimento dei record, sia in quella di ricerca di una chiave. Nel
caso dellinserimento, si applica a ogni chiave da inserire nellarchivio uno dei
metodi descritti in precedenza (o altri ancora). Ottenuto il valore dellindirizzo, si
effettua un test nella posizione indicata per controllare se occupata (collisione)
o meno. Se non occupata, il record pu essere inserito, mentre se il posto non
libero va ricercata una nuova posizione, sino a quando non se ne incontra una
libera. Per la ricerca il discorso analogo: si applica la funzione alla chiave da ricercare e si accede al record indicato dal valore restituito dalla funzione. Se la
chiave in esso contenuta coincide con quella cercata, il problema risolto, altrimenti si esegue la scansione dellarchivio andando su altre posizioni, sino a quando non si trova la chiave cercata. Come per la funzione hash, esistono vari metodi anche per gestire le collisioni: ne esaminiamo alcuni.

Scansione lineare o indirizzamento aperto


Quando la funzione hash produce un indirizzo gi occupato da un altro record, occorre effettuare la scansione
dellarchivio in modo da ricercare il primo posto libero in cui sistemare la chiave che ha generato la collisione.
La tecnica della scansione lineare, detta anche dellindirizzamento aperto, consiste proprio in questo. Se, ad
esempio, la collisione avviene sullindirizzo 15 e poniamo come passo di scansione 3, occorre esaminare i record di indirizzo 18, 21, 24, 27 sino al reperimento di un posto vuoto. Se, in particolare, p = 1 si parla di scansione lineare con passo unitario. La scelta del passo unitario assicura il controllo di tutti gli indirizzi, in quanto, se la chiave collide su un indirizzo, si va a controllare la posizione immediatamente successiva, quella
successiva ancora e cos via. Il processo termina quando si trova un posto libero, oppure quando stata esaminata met delle posizioni presenti allinterno dellarchivio (in tal caso viene comunicato un messaggio di archivio pieno). La scansione non si interrompe quando si incontra la fine
Archivio
Funzione
dellarchivio, ma riprende dalla priChiave primaria
Hash
ma posizione.
Questo metodo presenta un inconveniente, detto agglomerazione o adIndirizzo
Occupato
densamento primario delle chiavi
(clustering), cio la presenza di aree
di memoria (agglomerati o cluster)
nelle quali confluiscono varie sequenze di sinonimi, che presentano indirizzi coincidenti da un certo punto in poi (creando lunghe catene di record adiacenti, con conseguente significativo rallentamento del tempo di accesso ai record).
Supponiamo di memorizzare le seguenti chiavi in un archivio composto al massimo da 9 record:
9

28

29

35

24

48

71

64

Per generare gli indirizzi ci serviamo del metodo della divisione modulo 9. Abbiamo:
9
28
29
35
24
48
71

10

(9 mod 9) + 1 = 0 + 1 = 1
(28 mod 9) + 1 = 1 + 1 = 2
(29 mod 9) + 1 = 2 + 1 = 3
(35 mod 9) + 1 = 8 + 1 = 9
(24 mod 9) + 1 = 6 + 1 = 7
(48 mod 9) + 1 = 3 + 1 = 4
(71 mod 9) + 1 = 8 + 1 = 9

la chiave 9 viene memorizzata in posizione 1


la chiave 28 viene memorizzata in posizione 2
la chiave 29 viene memorizzata in posizione 3
la chiave 35 viene memorizzata in posizione 9
la chiave 24 viene memorizzata in posizione 7
la chiave 48 viene memorizzata in posizione 4
collisione con la chiave 35.

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Lorganizzazione hash:
gestione delle collisioni

LEZIONE 5

A questo punto, in base alla tecnica della scansione lineare con passo unitario, dobbiamo spostarci sul record
successivo per vedere se la posizione libera: dobbiamo andare sulla posizione 10. Ci, ovviamente, non realizzabile in quanto abbiamo supposto che larchivio sia composto al massimo da 9 record. Occorre, pertanto,
applicare la divisione anche allindirizzo prodotto. Abbiamo:
71

(71 mod 9) + 1 = 8 + 1 = 9
(9 mod 9) + 1 = 0 + 1 = 1
(1 mod 9) + 1 = 1 + 1 = 2
(2 mod 9) + 1 = 2 + 1 = 3
(3 mod 9) + 1 = 3 + 1 = 4
(4 mod 9) + 1 = 4 + 1 = 5

collisione con la chiave 35


collisione con la chiave 9
collisione con la chiave 28
collisione con la chiave 29
collisione con la chiave 48
la chiave 71 viene memorizzata in posizione 5.

Ora analizziamo lultima chiave:


64

(64 mod 9) + 1 = 1 + 1 = 2 collisione con la chiave 28.

Poich lindirizzo 2 interno allintervallo, si cominciano a esaminare una a una le successive posizioni, sino a
incontrare un posto libero.
Vengono quindi scandite le posizioni 3, 4, 5 e, infine, la posizione 6, sulla quale la chiave 64 viene memorizzata. Come si pu constatare, la chiave 64 ha dovuto attraversare una parte della catena precedente, anche se i
record individuati da questi indirizzi erano occupati.

Scansione non lineare o metodo pseudo-random


Il metodo che stiamo per descrivere rappresenta una variante dellindirizzamento aperto e, come tale, nasce
anchesso allo scopo di eliminare o di tamponare il problema dellagglomerazione. Per farlo, questo metodo ricorre a una tecnica di memorizzazione che non prevede una scansione sequenziale dellarchivio, poich, invece di utilizzare il passo di scansione, genera un numero casuale (o, meglio, pseudocasuale) ogniqualvolta si verifica una collisione. Tale metodo si definisce scansione non lineare o pseudo-random. In altri termini, si
calcola lindirizzo per iniziare la scansione: se su tale indirizzo si verifica una collisione, non ci si sposta nella
posizione immediatamente successiva bens si ricalcola un nuovo indirizzo, detto indirizzo di rehash, servendosi di una nuova
funzione, detta funzione di rehash.
Chiave 1
Chiave 2
Chiave 3
Chiave 4
Chiave 5
Lindirizzo di rehash
pu essere calcolato
con una qualsiasi
funzione che generi
Funzione Hash
numeri pseudocasuali e che, per ogni
passo, definisca un
Indirizzo 2
Indirizzo 1
Indirizzo 1
Indirizzo 8
Indirizzo 1
incremento differente per lindirizzo.
Chiave 3
Chiave 1
Chiave 2
Circa la casualit, riArchivio
Archivio
Archivio
badiamo che lindirizzo di rehash deve
essere necessariaFunzione
1
1 Chiave2
1 Chiave2
di rehash
mente pseudocasua2 Chiave1
2 Chiave1
2 Chiave1
3
3
3
le e non puramente
4
4
4 Chiave3
5
5
5
casuale, in quanto,
La funzione di rehash
6
6
6
genera casualmente
7
7
7
in fase di ricerca di
la posizione 4
8
8
8
una chiave, devono
essere ricalcolati gli
stessi indirizzi proChiave 4
Chiave 5
dotti per la memoArchivio
Archivio
rizzazione,
ossia
deve essere ripetuta
La funzione di rehash genera
Funzione
la stessa sequenza di
casualmente la posizione 4 che,
1 Chiave2
1 Chiave2
di
rehash
2 Chiave1
2 Chiave1
essendo occupata, provoca la
indirizzi.
3
3
4 Chiave3
5
6
7
8 Chiave4

4 Chiave3
5
6
7 Chiave5
8 Chiave4

riesecuzione della funzione

Funzione
di rehash

La funzione di rehash
genera casualmente
la posizione 7 che libera

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

11

il libro si estende sul web

LEZIONE

B-alberi
Nel corso della trattazione delle varie organizzazioni abbiamo notato che loperazione di ricerca diviene sempre pi efficiente se i record sono identificati per
mezzo delle loro chiavi di accesso e abbiamo visto come lutilizzo degli indici possa essere di valido aiuto per implementare archivi dinamici.
La gestione degli indici viene resa molto efficiente se si usano gli alberi binari di
ricerca per le chiavi, e pu essere ottimizzata se si mantiene lalbero bilanciato.
La seguente figura mostra un esempio di albero binario di ricerca. La caratteristica
che appare che partendo dalla chiave di valore 32 a sinistra si va verso chiavi di
valore minore e a destra verso chiavi di valore maggiore. Ci valido per qualsiasi
nodo dellalbero e per qualsiasi chiave che abbia delle altre chiavi sotto di s.
Quindi gli alberi binari di ricerca hanno una caratteristica ben precisa: possono essere facilmente osservati scorrendoli a partire dalla radice, nodo pi in alto.
32

45

43

54

17

Infatti a sinistra di ogni nodo si trovano sempre nodi di valore minore mentre a
destra si trovano sempre nodi di maggior valore.
Considerando ad esempio il nodo 45 si osserva che alla sinistra si incontra il nodo
43 e alla destra il nodo 54. Si potrebbe per notare come la ricerca di un record
che si trova pi in profondit (a un livello pi basso) rispetto a un altro impieghi
tempi pi lunghi, in quanto aumentano i nodi da attraversare.
Nel caso della figura precedente, cercare il nodo 17 differente dal cercare il
nodo 2, in quanto si attraversa un numero diverso di nodi.
Per rendere minimo il percorso di ricerca nasce quindi lesigenza di particolari alberi in cui la profondit si mantenga limitata per tutti i nodi. Una soluzione bilanciare lalbero, cio fare s che tutti i percorsi massimi abbiano la stessa lunghezza.
La figura seguente mostra la versione bilanciata del precedente albero binario di
ricerca. Ora, per prelevare il nodo 17 si effettuano tre accessi al file, contro i quattro accessi della versione precedente. Indubbiamente aumenta la complessit
delle operazioni di gestione degli alberi. Con laggiunta di nuovi nodi, la struttura
dellalbero binario aumenta sempre pi di dimensioni.

32

12

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

45

17

43

54

B-alberi

LEZIONE 6

Le caratteristiche di questi alberi implicano che bastano uno o due inserimenti


per sbilanciare lalbero e costringere alla procedura di bilanciamento, complessa e pesante dal punto di vista del tempo impiegato.
Si dunque cercata unaltra soluzione, di gestione meno impegnativa ma che fornisse prestazioni elevate: i b-alberi.
I b-alberi (b-tree o balanced trees in inglese) sono strutture di dati introdotte nei
primi anni 70 proprio per venire incontro allesigenza di disporre di modelli implementativi efficienti per la gestione dinamica e ordinata di archivi di dati.
Rappresentano una sorta di estensione degli alberi binari bilanciati di ricerca, poich sono alberi binari ordinati secondo la chiave e perfettamente bilanciati in altezza.
I b-alberi non sono alberi binari e hanno una struttura pi complessa di quelli visti in precedenza, ma presentano linnegabile vantaggio di ridurre enormemente
il costo delle operazioni di bilanciamento necessarie per mantenere efficiente la
ricerca dopo aver apportato modifiche (inserimenti o cancellazioni di dati) allalbero binario stesso.
Le qualit specifiche dei b-alberi possono cos sintetizzarsi:
offrono ottime prestazioni sia per quanto riguarda le operazioni di ricerca che
quelle di aggiornamento poich entrambe possono avvenire attraverso lutilizzo di procedure alquanto semplici;
su di essi anche possibile effettuare elaborazioni di tipo sequenziale dellarchivio primario senza alcuna necessit di sottoporlo a riorganizzazione.
Diamo, ora, una definizione pi formale di b-albero.
Un b-albero di ordine m un albero che soddisfa le seguenti propriet:
1. perfettamente bilanciato in altezza, cio ha tutte le foglie allo stesso livello;
2. il nodo radice ha un numero d di figli tale che 1 d 2m + 1;
3. ogni nodo dellalbero, esclusa la radice, ha un numero d di figli tale che m
d 2m.
Un esempio di b-albero di ordine 3 riportato di seguito. Allinterno di ogni nodo
di un b-albero possibile memorizzare pi record (chiavi) e da ciascun nodo possono uscire pi rami diretti verso altri nodi del b-albero.

200

137

185

198

203

217

220

218

268

300

286

223

254

400

305

346

399

457

488

558

255

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

13

Inserimento e ricerca
in un b-albero

il libro si estende sul web

LEZIONE

La ricerca
La ricerca di un record con una data chiave K in un B-albero viene eseguita con
criteri analoghi a quelli visti per gli alberi binari di ricerca; si cerca infatti la chiave K tra le chiavi dei record memorizzati in un dato nodo del B-albero a partire
dalla radice.
Nel caso che il nodo attualmente esaminato non contenga il record di chiave K si
sceglie quale debba essere il nodo del B-albero da esaminare successivamente in
base alla posizione della chiave K rispetto a quelle gi memorizzate nel nodo; il
criterio per stabilire se una ricerca termina senza successo analogo a quello per
gli alberi binari di ricerca.
Per comprendere meglio il criterio di ricerca in un B-albero si pu fare riferimento alla situazione descritta nella seguente figura.

200

Puntatore al nodo
con chiavi K < 200

300

400

Puntatore al nodo
con chiavi 300 < K < 400

Puntatore al nodo
con chiavi 200 < K < 300

Puntatore al nodo
con chiavi K > 400

La figura illustra che una qualunque chiave che non appartenga alla radice deve
necessariamente trovarsi in una delle parti nelle quali la linea suddivisa dalle
chiavi che si trovano in essa. A ciascuna suddivisione della linea associato il
puntatore che si riferisce al sottoalbero dellalbero di ordine 3 nel quale sono memorizzati tutti e soli i record che hanno la chiave nellintervallo corrispondente.
Per continuare la ricerca del record con chiave K si deve pertanto accedere al sottoalbero corrispondente allintervallo nel quale K si trova; il procedimento prosegue finch non si ritrova il record con chiave K (ricerca con successo) oppure pi
possibile procedere allinterno dellalbero di ordine n (ricerca senza successo).
Pi in dettaglio, il nodo di un B-albero ha la seguente struttura:

P0

K1

P1

K2

P2

...

Ki

Pi

Ki+1

...

Km

Pm

dove:
n rappresenta il numero di voci presenti nel nodo;
il puntatore P0 al primo figlio di sinistra consente di accedere al sottoalbero
che contiene tutte le chiavi aventi valore minore della pi piccola (ossia di K1);
i puntatori intermedi Pi permettono laccesso al sottoalbero che contiene tutte
le chiavi aventi valori compresi tra Ki e Ki+1;
il puntatore Pm allultimo figlio di destra consente di accedere al sottoalbero
che contiene tutte le chiavi aventi valore maggiore della chiave pi grande (ossia di Km).

14

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Inserimento e ricerca in un b-albero

LEZIONE 7

Alla luce di queste prime definizioni, possiamo concludere che un B-albero gode
delle seguenti propriet:

perfettamente bilanciato in altezza, cio ha tutte le foglie allo stesso livello;


ogni nodo, esclusa la radice, deve contenere almeno m chiavi;
ogni nodo, inclusa la radice, deve contenere al massimo 2m chiavi;
ogni nodo ha le chiavi disposte in ordine crescente;
un nodo pu essere una foglia, ossia una pagina terminale.

Linserimento nel b-albero


Loperazione di inserimento, ma anche quella di cancellazione, rappresentano le
operazioni pi complesse e delicate, poich devono garantire che la struttura rimanga sempre bilanciata.
Nel caso in cui si vada a inserire allinterno di un nodo saturo (cio di un nodo che
contiene gi 2m voci) occorrer allocarne uno nuovo. Riferiamoci alla successiva
figura e supponiamo di dover inserire la chiave 9. Tale chiave dovrebbe essere inserita allinterno di un nodo saturo.
Poich ci non possibile occorrer sdoppiare il nodo (splitting). Le chiavi saranno divise in parti uguali e lelemento centrale, cio 8, viene trasferito nel nodo di
livello superiore se c posto, altrimenti si ripete il procedimento.

14

11

16

12

18

21

17

13

14

10

15

22

23

24

28

Chiavi > 11

Chiavi < 5
4

19

20

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

15

Tutto in test...a

PROVE OGGETTIVE PER LA VERIFICA DELLE CONOSCENZE


1. Quale tra le seguenti non una tecnica di organizzazione non sequenziale?

10. Che cosa si intende con il termine collisione?


11. Che cosa si intende con il termine sinonimi?

b-tree

relative

12. Che cosa significa gestire le collisioni?

hash

ad aree dei trabocchi

13. Descrivi il procedimento seguito dal metodo dellindirizzamento aperto.

2. Stabilisci se le seguenti affermazioni sono vere o false


a

nellorganizzazione non sequenziale la


chiave non riveste un ruolo fondamentale --indirizzo logico e indirizzo hash non sono
la stessa cosa -------------------------------------------------------nellorganizzazione relative la gestione
degli indirizzi fisici affidata al sistema
operativo -------------------------------------------------------------------

14. Descrivi il procedimento seguito dal metodo del troncamento

15. Descrivi il procedimento seguito dal metodo folding.

16. Descrivi il procedimento seguito dal metodo della divisione modulo n.

3. Nellallocazione concatenata:

17. Descrivi il procedimento seguito dal metodo lineare o


indirizzamento aperto.
18. Che cosa si intende con agglomerazione o addensamento primario delle chiavi?

si utilizza la tecnica per gestire le liste


concatenate

ogni blocco contiene un riferimento al


successivo

19. Descrivi il procedimento seguito dal metodo quadratico o scansione quadratica.

ogni blocco contiene un riferimento al


precedente

20. Descrivi il procedimento seguito dal metodo pseudorandom o scansione non lineare.

si utilizza la tecnica per gestire i vettori

21. Completa le seguenti frasi

4. In che consiste la tecnica dellallocazione indicizzata?


5. Qual la caratteristica dellorganizzazione relative?
6. Qual la procedura seguita dal sistema operativo per
determinare lindirizzo dei un generico record K?
7. Completa correttamente le seguenti frasi:
a

lorganizzazione non sequenziale non necessita


che ____________________________________ in
maniera contigua allinterno del dispositivo
____________________________ .

gli archivi relative presentano un inconveniente:


spesso difficile riuscire ____________________
__________________________________________

8. Che cos una funzione hash?


9. Nella tecnica hash quando si parla di trasformazione
perfetta?

16

in un b-albero ogni nodo, inclusa la radice, deve


_____________________ voci.

in un b-albero ogni nodo ha le chiavi


______________________________

in un b-albero la radice pu essere una


___________________________

in un b-albero un nodo pu essere


_________________________, oppure avere
__________ discendenti, poich ____
rappresenta il numero ____________________

22. Costruisci un b-albero di ordine 3 inserendo, un record


alla volta, i record con chiave
1 2 5 12 15 8 3 29 27 39 36
42 21 80 50 60 47 45 65 44 73
23. Costruisci un b-albero di ordine 3 considerando come
chiavi i primi 50 numeri interi.

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

Diamoci il voto!!!
Con questa scheda puoi autovalutare il tuo livello di acquisizione delle conoscenze e delle abilit insegnate nellUnit formativa. Attribuisci un punto a ogni risposta esatta. Se totalizzi un punteggio:
<4

Tra 4 e 6

Tra 6 e 8

Rifletti un po sulle tue


disgrazie

Rivedi lunit formativa


nelle sue linee generali

Rivedi con attenzione


tutta lunit formativa

Ripeti il questionario

Rivedi lunit formativa


nelle sue linee generali

>8
Tutto OK

Ripeti il questionario

1.

2.

3.

4.

5.

Nellorganizzazione non sequenziale:

6.

La tecnica della scansione lineare si usa:

non possibile ricavare lindirizzo fisico

possibile ricavare direttamente lindirizzo di


una registrazione tramite la chiave del record

quando la funzione Hash produce un indirizzo gi


occupato da un altro record

possibile ricavare lindirizzo di un record solo


se la chiave primaria di tipo stringa

quando la funzione Hash produce un indirizzo


pari a zero;

nessuna delle precedenti affermazioni vera

quando la funzione Hash produce un indirizzo


maggiore del numero di record;

per scandire larchivio in modo da ricercare il


primo posto libero in cui sistemare la chiave che
ha generato la collisione

La FAT:
a

memorizzata in RAM

rappresenta limmagine virtuale dei blocchi su


disco

contiene i riferimenti tra i vari blocchi ed evita di


memorizzare gli stessi allinterno del file

si usa solo per dischi rimovibili

7.

I-node un metodo di allocazione:

Il metodo folding prende il nome dal verbo:


a

copiare

tagliare

piegare

incollare

usato nei sistemi Mac

usato nei sistemi Windows

usato nei sistemi DOS

funzione has

usato nei sistemi Unix

funzione di rehash

funzione di reload

funzione di recol

8.

La funzione hash H(K)=X calcola lindirizzo X:


a

tutte le volte che occorre accedere al record di


chiave K per effettuare operazioni di I/O

solo la prima volta che si accedere al record di


chiave K per effettuare operazioni di I/O

9.

Nella scansione non lineare la funzione che ricalcola


lindirizzo prende il nome di:

Un b-albero di ordine m:
a

perfettamente bilanciato in altezza

solo quando si generano indirizzi uguali

non bilanciato in altezza

in base ai dettagli forniti dal sistema operativo

ha solo due foglie

ha due radici

II metodo del troncamento utilizzato quando


a

la chiave numerica composta da poche cifre e


il numero di record alto;

la chiave alfanumerica composta da un elevato


numero di cifre e il numero di record limitato.

la chiave numerica composta da un elevato


numero di cifre e il numero di record limitato.

la chiave alfanumerica composta da poche


cifre.

10. In un b-albero loperazione di sdoppiamento di un


nodo prende il nome di:
a

rehashing

splitting

dumping

pseudo-random

P. Gallo F. Salerno Task 2 Gli archivi non sequenziali

17