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