這裏是我的問題。查找排序日期排列日期的算法
我有一個存儲在循環緩衝區中的日期排序數組。我有一個指向緩衝區中的最後日期的指針。有可能缺少一些日期。客戶需要一系列日期。如果缺少下限日期,則程序應返回第一個最接近的日期,該日期高於所需日期,反之亦然。
下面是一個例子:在循環緩衝器
日期(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中,所以讀取日期需要一段時間,我需要儘可能快地找到日期(以最小讀取次數)。
請幫忙。
謝謝你的迴應。當日期存儲在RAM內存中時,這是一個很好的解決方案。問題是我有一些設備的EEPROM中存有12000個日期,只需要幾秒鐘就可以讀取一個日期。該算法是否可以通過某種方式進行更改,以便假定沒有日期丟失,並嘗試通過提交需要的最後日期來查找它的位置?然後,如果沒有日期丟失(最常見的情況),算法會在一次迭代中找到日期。再次感謝您的快速回答。 –