缩小循环缓冲区

时间:2013-07-05 11:02:37

标签: algorithm data-structures circular-buffer circular-list

我正在尝试为循环缓冲区实现收缩操作。 缓冲区有一个开始指针(m_start)并存储元素的数量(m_numelements)。当缓冲区已满时,我只清除旧值。

假设我们有一个16号的数组。 m_start = 9 m_numelements = 11。

我想将这个数组缩小为一个大小为8的数组(可以丢弃元素)。

这里的约束是旧数组的m_start(9)应映射到新数组的m_start%新容量(9%8 = 1)。

我尝试编写代码但最终得到了很多if-else梯形图。这个有效的实现吗?

2 个答案:

答案 0 :(得分:0)

让我们的存储阵列具有从零开始的索引,并且它的大小是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 :(得分:0)

收缩相当于将整个内容出列到临时缓冲区,然后将该缓冲区的内容排入具有指定容量的新循环缓冲区。这不是你想要的,但它将告知代码必须是什么样的。

所以:编写代码以使循环缓冲区的整个内容出列,并使用您已有的方法将它们排入新的循环缓冲区,然后内联您使用的方法中包含的代码,然后重构该代码以放置内容进入现有的循环缓冲区(调整大小后)而不是新的缓冲区,并优化掉任何不必要的副本或案例。