2015-09-28 89 views
0

這裏是我的問題。查找排序日期排列日期的算法

我有一個存儲在循環緩衝區中的日期排序數組。我有一個指向緩衝區中的最後日期的指針。有可能缺少一些日期。客戶需要一系列日期。如果缺少下限日期,則程序應返回第一個最接近的日期,該日期高於所需日期,反之亦然。
下面是一個例子:在循環緩衝器

日期(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中,所以讀取日期需要一段時間,我需要儘可能快地找到日期(以最小讀取次數)。

請幫忙。

回答

0

將p1設置爲緩衝區的開始,p2爲結束。 X就是你要找的東西。

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

看看p1和p2,m之間的中點。如果mDate在X之後,則p1 = m否則p2 = m。

重複,直到p1 = p2。

+0

謝謝你的迴應。當日期存儲在RAM內存中時,這是一個很好的解決方案。問題是我有一些設備的EEPROM中存有12000個日期,只需要幾秒鐘就可以讀取一個日期。該算法是否可以通過某種方式進行更改,以便假定沒有日期丟失,並嘗試通過提交需要的最後日期來查找它的位置?然後,如果沒有日期丟失(最常見的情況),算法會在一次迭代中找到日期。再次感謝您的快速回答。 –