トラック
/
Pharo
Pharo
/
演習
/
リングバッファ
リングバッファ

リングバッファ

中級

説明

循環バッファ、サイクリックバッファ、リングバッファは、単一の固定サイズのバッファを、端と端がつながっているかのように使うデータ構造です。

循環バッファは最初は空で、あらかじめ決められた長さを持ちます。 たとえば、これは7要素のバッファです:

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

バッファの真ん中に1が書き込まれたとします(循環バッファでは、正確な開始位置は問題になりません):

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

次に、さらに2つの要素、2と3が追加され、1の後に続けて入るとします:

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

そのあとでバッファから2つの要素を取り除くと、バッファの中で最も古い値が取り除かれます。 この場合に取り除かれる2つの要素は1と2で、バッファには3だけが残ります:

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

バッファに7つの要素が入ると、完全にいっぱいになります:

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

バッファがいっぱいになるとエラーが発生し、スロットが空くまでこれ以上書き込めないことをクライアントに知らせます。

バッファがいっぱいのとき、クライアントは強制書き込みで最も古いデータを上書きすることを選べます。 この場合、さらに2つの要素AとBが追加され、3と4を上書きします:

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

3と4はAとBに置き換えられ、バッファの中で最も古いデータは5になりました。 最後に、2つの要素を取り除くと、返されるのは5と6で、バッファはこうなります:

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

空きがあるので、ここでクライアントが再び上書きを使ってCとDを保存すると、使われるのは前に5と6が入っていた場所で、7と8の場所ではありません。 7は依然として最も古い要素で、バッファは再びいっぱいになります。

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

実装

操作中にエラーが起きた場合については、Errorクラスの階層(クラス側)を参照し、指定されたメッセージで例外を通知する方法を確認してください。


出典

Wikipediaリンクは新しいウィンドウまたはタブで開きます
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Pharo Exercism

リングバッファを始める準備はできましたか?

Exercismに登録すれば、50個の演習、そして本物の人間によるメンタリングとともに、Pharoを学んでマスターできます。すべて無料です。

リングバッファを深く掘り下げよう!

この動画では、リングバッファとは何か、どこで使われているか、さまざまな実装方法を見ていきます。キュー、静的配列と動的配列、イミュータブルなデータ構造、そしてエージェントベースの楽しい実装などです。