Track
/
8th
8th
/
Esercizi
/
Buffer circolare
Buffer circolare

Buffer circolare

Medio

Istruzioni

Un buffer circolare, detto anche buffer ciclico o buffer ad anello, è una struttura dati che usa un unico buffer di dimensione fissa come se fosse collegato da un'estremità all'altra.

Un buffer circolare all'inizio è vuoto e ha una lunghezza predefinita. Ad esempio, questo è un buffer di 7 elementi:

[ ][ ][ ][ ][ ][ ][ ]

Supponi che venga scritto il valore 1 al centro del buffer (la posizione iniziale esatta non ha importanza in un buffer circolare):

[ ][ ][ ][1][ ][ ][ ]

Poi supponi che vengano aggiunti altri due elementi, 2 e 3, che vengono accodati dopo il valore 1:

[ ][ ][ ][1][2][3][ ]

Se poi vengono rimossi due elementi dal buffer, vengono rimossi i valori più vecchi presenti nel buffer. I due elementi rimossi, in questo caso, sono 1 e 2, lasciando nel buffer solo il valore 3:

[ ][ ][ ][ ][ ][3][ ]

Se il buffer ha 7 elementi, allora è completamente pieno:

[5][6][7][8][9][3][4]

Quando il buffer è pieno, viene generato un errore che avvisa il client che ulteriori scritture sono bloccate finché non si libera uno slot.

Quando il buffer è pieno, il client può scegliere di sovrascrivere i dati più vecchi con una scrittura forzata. In questo caso, vengono aggiunti altri due elementi, A e B, che sovrascrivono i valori 3 e 4:

[5][6][7][8][9][A][B]

3 e 4 sono stati sostituiti da A e B, rendendo ora 5 il dato più vecchio nel buffer. Infine, se vengono rimossi due elementi, quelli restituiti sarebbero 5 e 6, ottenendo il buffer:

[ ][ ][7][8][9][A][B]

Poiché c'è spazio disponibile, se il client usa di nuovo la sovrascrittura per memorizzare C e D, verrà usato lo spazio in cui erano stati memorizzati 5 e 6, non la posizione di 7 e 8. 7 è ancora l'elemento più vecchio e il buffer è di nuovo pieno.

[C][D][7][8][9][A][B]

Questo esercizio introdurrà un paio di concetti che potresti non aver mai visto prima:

Namespace definiti dall'utente

In 8th le parole appartengono tutte a un namespace: ad esempio, a:new fa riferimento alla parola new nel namespace a. Si possono anche definire namespace personalizzati, ed è quello che facciamo all'inizio del file circular-buffer.8th:

ns: cb

Questo significa che tutte le parole all'interno di quel file sono accessibili tramite cb:<word>, un ottimo modo per raggruppare funzionalità correlate.

Per maggiori informazioni, dai un'occhiata alla documentazione sui namespace.

Eccezioni

Ci si aspetta che entrambe le parole read e write lancino un'eccezione quando vengono chiamate su un buffer circolare con uno stato non valido. Per maggiori informazioni, consulta la documentazione su eccezioni e gestione degli errori.

Oggetti

Anche se sei libero di implementare il buffer circolare come preferisci, potresti prendere in considerazione il supporto agli oggetti di 8th.


Fonte

WikipediaIl link si apre in una nuova finestra o scheda
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
8th Exercism

Vuoi iniziare Buffer circolare?

Iscriviti a Exercism per imparare e padroneggiare 8th con 70 esercizi e il mentoring di persone reali, tutto gratis.

Approfondimento su Buffer circolare!

In questo video daremo un'occhiata ai buffer circolari: cosa sono, dove vengono usati e le diverse implementazioni, tra cui code, array statici e dinamici, strutture dati immutabili e una divertente implementazione basata su agenti.