查找最新n个值的算法

时间:2014-01-16 07:46:13

标签: c algorithm

我正在解决一个问题,即有三个内存页面可用,而且数据应该写在其中一个页面中。

要保留历史记录,首先将数据写入第1页,当该数据已满时,应使用下一页。最后,最后一页也已满,所以我们必须删除第一页中的数据并使用第一页。等等...

我怎么知道哪个页面是'最老的'?如何确定要删除的内容?

我认为需要一个计数器,每次使用新页面时此计数器都会递增。在开始时读取计数器值以查找哪个页面是最新的,然后下一页是最旧的(从循环方法开始)。但是,最终计数器将溢出,计数器重新启动,并且无法确定哪个值最高(因为新值为0)。

示例:

  • 0 0 0(从开始)
  • 1 0 0(使用了第0页)
  • 1 2 0(使用第1页)
  • 1 2 3(使用第2页)
  • 4 2 3(使用第0页)
  • 4 5 3(使用了第1页)
  • ...
  • 255 0 254(我不知道......)

问题是否清楚?否则我可以尝试重新解释。

3 个答案:

答案 0 :(得分:0)

您使用循环缓冲区的想法很好。除此之外,您还需要索引,一个指向最旧的页面,一个指向最新的页面。无论何时添加或替换页面,都需要更新这些索引。

你需要的原因是在开始时 - 直到缓冲区已满 - 只有其中一个会前进而另一个将保持静止。

答案 1 :(得分:0)

这是 EEPROM耗损均衡中使用的技术。这个概念是因为EEPROM通常具有有限的写入/擦除周期,我们可以平衡存储器中的磨损,从而有效地延长寿命。由于EEPROM中的数据即使在断电时也会保留在控制器中,因此我们可能需要在EEPROM上定期存储某些变量的日志值以供进一步使用。

您可以遵循的一个简单方法是,根据评论中的建议,您可以通过保持计算来更新计数器(计数器模3)。

其他(更一般)方法是为计数器设置三个寄存器。每当您必须写入页面时,首先扫描这三个寄存器并检查(C[i] != C[i-1] + 1)

的组合
0 0 0 
1 0 0  // 1 to 0
1 2 0  // 2 to 0
1 2 3  // 3 to 1
4 2 3  // 4 to 2 
...
255 0 254  // 0 to 254.

此链接提供了有关此主题的更多信息:Is there a general algorithm for microcontroller EEPROM wear leveling?

答案 2 :(得分:0)

我这样做这样的周期:

// init
int page0=adress of page0; // oldest data
int page1=adress of page1; // old data
int page2=adress of page2; // actual data (page for write)

// after page 2 is full
int tmp;
tmp=page0;
page0=page1;
page1=page2;
page2=tmp;
  • 这样你总是知道哪个页面是哪个
  • 第0页总是最旧的数据
  • 第1页总是旧数据
  • 第2页总体实际数据
  • 可以轻松扩展到任意数量的页面
  • 而不是地址,您可以存储页码...使用更适合您的任务