tabelle dnamche Tabelle dnamche Spesso non s conosce a pror quanta memora serve per memorzzare una struttura dat (tabella d dat ~ array, tabella hash, heap, stack, ecc.. Può captare qund d allocare una certa quanttà d memora e po accorgers, durante l esecuzone del programma, che tale memora non è suffcente. In tal caso bsogna allocare una memora maggore, rcopare l contenuto della veccha memora nella nuova e rlascare la veccha memora. E anche opportuno, dopo aver rmosso molt element, rdurre la memora allocando una memora pù pccola n cu memorzzare gl element rmast. Vedremo come sa possble aggungere e toglere un elemento dalla tabella n tempo ammortzzato costante O( benchè tal operazon abbano costo maggore quando comportano espansone o rduzone della memora. Vedremo anche che questo s può fare garantendo che la memora nutlzzata sa sempre nferore ad una frazone costante della memora allocata. Supporremo che una tabella T abba seguent attrbut: a un puntatore pt[t] alla memora rservata per memorzzare gl element. b due camp nter [T] e sze[t] che contengono rspettvamente l ero d element present nella tabella e la dmensone della tabella. Le operazon che voglamo realzzare sono. Table(T: costrusce una tabella vuota T.. Insert(T, x: nsersce l oggetto x nella tabella T. 3. Delete(T, x: rmuove l oggetto x dalla tabella T. 3 Non c cureremo d come gl element sano organzzat nella memora allocata né d altr dettagl mplementatv ma c lmteremo ad assumere che sano defnte le tre operazon: Push(pt, x memorzza l elemento x nella memora Pop(pt, x rmuove l elemento x dalla memora Copy(pt, pt, n rcopa nella memora n element memorzzat nella memora Per allocare e rlascare memora utlzzeremo le due operazon: Allocate(n che rserva memora per n element e resttusce un puntatore a tale memora. Free(pt, n che rlasca la memora per n element. 5 6
Espansone Consderamo dapprma l caso n cu vengono esegute soltanto nserzon d nuov element e nessuna rmozone. Defnamo come fattore d carco della tabella l rapporto α = / sze. Quando α =la tabella è pena ed occorre espanderla allocando nuova memora. Una eurstca comune è raddoppare la memora, l che garantsce un fattore d carco α > /. La defnzone della funzone Table(T che nzalzza una tabella vuota è: Table(T sze[t] 0 [T] 0 pt[t] nl Essa rchede un tempo costante. Espansone 7 La defnzone della funzone Insert(x è: Insert(T, x f sze[t] = 0 then pt[t] Allocate( sze[t] f [T] = sze[t] then pt Allocate( * sze[t] Copy(pt, pt[t], [T] Free(pt[T], sze[t] pt[t] pt sze[t] * sze[t] Push(pt[T], x [T] [T] + 9 Per l anals della complesstà d Insert possamo assumere che le operazon Allocate, Free e Push rchedano tempo costante e che Copy rcheda tempo proporzonale al ero d element copat. Consderamo l costo d una sequenza d n operazon Insert esegute a partre da una tabella vuota. Il costo della -esma Insert è se non v è espansone ed è se v è espansone ( -per la Copy degl -element precedent pù per le altre operazon. 0 Sccome sze[t] è sempre una potenza d e l espansone s ha quando [T] = -èuguale a sze[t] l costo della -esma Insert è: se è una potenza d c = altrment e l costo totale della sequenza d n Insertè: C( n = n = c log ( n j log ( n + = n + = n + < 3n j= 0 Insert ha qund costo ammortzzato O(3n/n = O(. Il metodo degl accantonament mostra perchè l costo ammortzzato debba essere 3.. una untà d costo vene spesa subto per l nsermento dell elemento stesso,. una vene attrbuta come credto all elemento stesso per pagare un suo successvo rcopamento e 3. la terza vene attrbuta come credto ad un (eventuale altro elemento rcopato prma e rmasto prvo d credto. Al momento dell espansone ogn elemento ha una untà d costo per pagars l rcopamento.
Possamo usare l metodo del potenzale sceglendo una funzone potenzale Φ che vale 0 (all nzo e subto dopo un rcopamento e che cresce tra una espansone e la successva, raggungendo la dmensone della tabella quando questa è pena. Una tale funzone è: Φ = sze 3 6 sze Φ = -sze Subto dopo l rcopamento: Φ = sze sze = 0 Quando la tabella è pena: Φ = sze sze = sze 6 3 3 Il costo ammortzzato d un nsermento senza espansone è: = c + Φ Φ ( sze ( sze ( + sze + sze con espansone c (tabella vuota e per > : ˆ = + ( sze ( + ( + sze + 5 Espansone e contrazone Delete(x s realzza con una Pop(pt, x che rmuove l elemento x dalla tabella. Ad evtare uno spreco eccessvo d memora è opportuno contrarre la tabella quando l fattore d carco α = / sze dventa troppo pccolo. Questo s fa allocando una memora pù pccola, rcopando element present nella tabella, e rlascando la veccha memora. Espansone e contrazone 6 La stratega ovva è dmezzare la memora quando l fattore d carco α dventa /. Questo c asscura un fattore d carco α > / anche n presenza d operazon Delete. Purtroppo, con questa stratega l costo ammortzzato delle operazon non è pù costante. Consderamo una successone d n = k (k>3 operazon delle qual le prme k- sono Insert mentre le altre k- sono una rpetzone d k-3 grupp d quattro operazon: una Insert seguta da due Delete segute da una Insert. L esecuzone d ogn gruppo comporta una espansone da sze = k- a k d costo k- ed una contrazone da sze = k a k- anch essa con costo k-. 7 3
Il costo della sequenza d k-3 grupp è qund par a k-3 (+ k- + k- = O( k = O(n. Qund l costo ammortzzato d una operazone è O(n / n = O(n. Il problema è che dopo l espansone (che porta α ad / e consuma tutt credt non s eseguono rmozon suffcent ad accumulare credt per la successva contrazone. Occorre qund aspettare che sa stata rmossa almeno una metà degl element, ossa che α dvent /. La defnzone della funzone Delete(x è: Delete(T, x f [T] sze[t] / then pt Allocate(sze[T] / Copy(pt, pt[t], [T] Free(pt[T], sze[t] pt[t] pt sze[t] sze[t] / Pop(pt[T], x [T] [T] - 9 0 Usamo l metodo del potenzale sceglendo una funzone potenzale Φ che vale 0 sa all nzo che subto dopo una espansone o contrazone e che cresce fno a raggungere l ero d element present nella tabella quando l fattore d carco α aumenta fno ad o dmnusce fno ad /. Una funzone d questo tpo è Φ = sze sze / se α / se α / 3 6 sze Φ 6 3 Se α / l costo ammortzzato d un nsermento senza espansone è: ( sze ( ( + sze sze con espansone c (tabella vuota e per > : ˆ = = c + Φ Φ + ( sze ( + ( + + sze sze + 3 Se α </non v è scuramente espansone e l costo ammortzzato d un nsermento è: = c + Φ Φ ( sze / ( sze / sze / ( + sze / + = 0
Se α / l costo ammortzzato d una rmozone senza contrazone è: = c + Φ Φ ( sze / ( sze / sze / ( sze / + = mentre con contrazone è: = + ( sze / ( sze + ( / + 5 Se α > / non v è scuramente contrazone e l costo ammortzzato d una rmozone è: = c + Φ Φ ( sze ( sze ( sze + sze = 6 Eserczo 6 Eserczo 6. Assumere che la contrazone della tabella dnamca venga effettuata quando α = /3 nvece che quando α = / e che nvece d rdurre la sua dmensone ad / sze essa venga rdotta a /3 sze. Calcolare l costo ammortzzato delle operazon usando la funzone potenzale: Φ = - sze 7 5