1

循環バッファーの縮小操作を実装しようとしています。バッファーには開始ポインター ( m_start ) があり、要素の数 ( m_numelements) が格納されます。バッファーがいっぱいになると、古い値を削除するだけです。

サイズ 16 の配列があるとします。 m_start = 9 m_numelements = 11.

この配列をサイズ 8 の配列に縮小したい (要素を破棄できます)。

ここでの制約は、古い配列の m_start( 9 ) が、新しい配列の m_start % 新しい容量 ( 9 % 8 = 1 ) にマップされる必要があることです。

コードを書いてみましたが、多くの if-else はしごになってしまいました。これのための効率的な実装はありますか?

4

2 に答える 2

1

ストレージ配列にゼロベースのインデックスがあり、サイズが 2 の累乗 (2,4,8...) で、m_start が開始インデックスであるとします。

配列が拡大している場合:

 double array length
 if m_start > 0 then
    copy (m_start elements) from (0th index) to (old size index) 

例:

  3 0 1 2|. . . .
  . 0 1 2|3 . . . 

配列が縮小している場合:

  if m_start > 0 then
     copy (m_start elements) from (newsize index) to (0th index) 
  half array length  

例:

  . 0 1 2|3 . . . 
  3 0 1 2|. . . .

このスキームを 1 ベースの配列インデックスに変更できます。

于 2013-07-05T11:21:57.267 に答える
0

縮小は、内容全体を一時バッファーにデキューし、そのバッファーの内容を指定された容量の新しい循環バッファーにエンキューすることと同じです。これはあなたが望むものではありませんが、コードがどのように見えるべきかを知らせてくれます。

したがって、循環バッファーの内容全体をデキューし、既存のメソッドを使用してそれらを新しい循環バッファーにエンキューするコードを記述し、使用したメソッドに含まれるコードをインライン化し、そのコードをリファクタリングして内容を既存のバッファーに配置します。新しいものではなく循環バッファー (サイズ変更後) を作成し、不要なコピーやケースを最適化します。

于 2013-07-05T20:38:16.990 に答える