这是我的问题。
我有一个存储在循环缓冲区中的已排序日期数组。我有一个指向缓冲区中最后日期的指针。有些日期可能会丢失。客户需要一系列日期。如果缺少下限日期,则程序应返回第一个最接近的日期,该日期高于所需的日期,反之亦然,作为上限日期 这是一个例子:
循环缓冲区中的日期(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中,因此读取日期需要一段时间,我需要尽可能快地找到日期(最小读数)。
请帮忙。
答案 0 :(得分:0)
将p1设置为缓冲区的开头,将p2设置为结束。 X正是你要找的。 p>
如果p1Date的日期在X之后,则返回p1。如果p2Date在X之前返回p2。
查看p1和p2之间的中点,m。如果mDate在X之后,则p1 = m,否则p2 = m。
重复直到p1 = p2。