C 查找n个值中最新值的算法

C 查找n个值中最新值的算法,c,algorithm,C,Algorithm,我正在研究一个问题,其中有三个内存页可用,数据应该写入其中一个内存页 为了保存历史记录,首先将数据写入第一页,当第一页已满时,应使用下一页。最后,最后一页也满了,所以我们必须删除第一页中的数据并使用第一页。等等 我怎么知道哪一页是“最老的”?如何确定要删除的内容 我认为需要一个计数器,每次使用新页面时,这个计数器都会递增。计数器值在开始时读取,以确定哪一页是最新的,然后下一页是最旧的(因为循环方法)。但是,最终计数器将溢出,计数器将重新启动,并且无法确定哪个值最高(因为新值为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(我不知道…)

问题清楚了吗?否则我可以试着重新解释。

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


您需要这样做的原因是,在开始时—直到缓冲区满—只有一个缓冲区将前进,而另一个将保持静止。

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

您可以遵循的一个简单方法是,按照注释中的建议,您可以通过不断计算(计数器模3)来更新计数器

另一种(更通用的)方法是为计数器设置三个寄存器。每当需要写入页面时,首先扫描这三个寄存器并检查组合,其中
(C[i]!=C[i-1]+1)


这个链接有关于这个主题的更多信息:

我做这样的循环:

// 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页所有实际数据
  • 它很容易扩展到任意数量的页面
  • 您可以存储页码而不是地址。。。使用更适合您的任务的工具

为什么不简单地用旧值+1模3更新该值?您好,谢谢您的回答。我正在尝试此算法,测试在以下位置停止:255 01(0!=255+1)=>TRUE。但应使用“1”。你有什么想法吗?@user3201357我认为你永远不会有255,0,1。应该是255,0254。您可能可以将计数器变量的类型设置为8位(如char)。这样,如果将1添加到255,它将自动滚动到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;