用于在排序的日期数组中查找日期的算法

时间:2015-09-28 11:51:50

标签: arrays date find

这是我的问题。

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

循环缓冲区中的日期(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。

我试过这样:
注:
- 两颗星之间的数字是当前日期,差异是要找到的步数 - 指针不能小于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中,因此读取日期需要一段时间,我需要尽可能快地找到日期(最小读数)。

请帮忙。

1 个答案:

答案 0 :(得分:0)

将p1设置为缓冲区的开头,将p2设置为结束。 X正是你要找的。

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

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

重复直到p1 = p2。