查找排序日期排列日期的算法

问题描述:

这里是我的问题。查找排序日期排列日期的算法

我有一个存储在循环缓冲区中的日期排序数组。我有一个指向缓冲区中的最后日期的指针。有可能缺少一些日期。客户需要一系列日期。如果缺少下限日期,则程序应返回第一个最接近的日期,该日期高于所需日期,反之亦然。
下面是一个例子:在循环缓冲器

日期(INT [18]):
1,2,3,4,5,11,12,13,14,15,21,22,23, 24,25,26,27,28
如果客户想要从8到23, 程序应该返回11,12,13,14,15,21,22,23。

我想是这样的:
注:
- 两颗恒星之间的数字是当前的日期,并且DIFF就是去找到8
步数 - 指针不能为小于0或者高于17 。

{1,2,3,4,5,11,12,13,14,15,21,22,23,24,25,26,27,*28*}, diff = -20 
{*1*,2,3,4,5,11,12,13,14,15,21,22,23,24,25,26,27,28}, diff = +7 
{1,2,3,4,5,11,12,*13*,14,15,21,22,23,24,25,26,27,28}, diff = -5 
{1,2,*3*,4,5,11,12,13,14,15,21,22,23,24,25,26,27,28}, diff = +5 -> (5/2)+1=+3<br /> 
(if I detect that I will just go x steps forward and x steps backward I split x in half) 
{1,2,3,4,5,*11*,12,13,14,15,21,22,23,24,25,26,27,28}, diff = -3 -> (-3/2)-1 = -2 
{1,2,3,*4*,5,11,12,13,14,15,21,22,23,24,25,26,27,28}, diff = 4 
{1,2,3,4,5,11,12,*13*,14,15,21,22,23,24,25,26,27,28}, diff = -5 
{1,2,*3*,4,5,11,12,13,14,15,21,22,23,24,25,26,27,28}, diff = +5 -> (5/2)+1=+3 

如果我们继续这样,我们会一遍又一遍地得到13,3,11,4。

备注:
- 我们在这里得到11只是巧合。当我使用一些真实的例子和更多的日期时,这个算法会跳过其他4(或3)个数字。
- 日期存储在uC的EEPROM中,所以读取日期需要一段时间,我需要尽可能快地找到日期(以最小读取次数)。

请帮忙。

将p1设置为缓冲区的开始,p2为结束。 X就是你要找的东西。

如果p1Date的日期在X之后,则返回p1。如果p2Date在X之前返回p2。

看看p1和p2,m之间的中点。如果mDate在X之后,则p1 = m否则p2 = m。

重复,直到p1 = p2。

+0

谢谢你的回应。当日期存储在RAM内存中时,这是一个很好的解决方案。问题是我有一些设备的EEPROM中存有12000个日期,只需要几秒钟就可以读取一个日期。该算法是否可以通过某种方式进行更改,以便假定没有日期丢失,并尝试通过提交需要的最后日期来查找它的位置?然后,如果没有日期丢失(最常见的情况),算法会在一次迭代中找到日期。再次感谢您的快速回答。 –