2010-06-11 39 views
3

我有這樣一些數據:獲得一定範圍內的對象與二進制搜索

ID Value 
1 AAA 
1 ABC 
2 dasd 
2 dsfdsf 
2 dsfsd 
3 df 
3 dwqef 

它們是對象(不是純文本)。
我想獲得ID = 2的所有對象。
我可以做一個二進制二進制搜索並獲得索引3,但我怎麼能得到(2和4)是否有任何有效的算法?
真正的問題有大約一百萬件物品。

除bf和lisp之外的任何語言都可以提供幫助。

+0

如果我理解正確,您的二分查找返回索引,其中將放置具有給定值的新元素。如果你只對索引範圍感興趣,那麼當我的解決方案的每個id值很高時,這可能會更快。如果您需要這些值(不僅僅是索引範圍)或每個ID值的數量很低,我的解決方案會更快一些。 您的類型轉換(整數到浮點數)可能會降低性能。 – 2010-06-11 11:07:15

回答

1

你可以創建一個Map來將一個id映射到一組值;

Map: 
1 => { AAA, ABC } 
2 => { dasd, dsfdsf, dsfsd } 
... 

這將有效的查找時間O(1)。您也可以執行二分查找,但查找效率較低。

二進制搜索算法:

首先創建一個排序列表(數組列表,鏈表等)。它必須在id上排序。然後你做一個標準的二進制搜索來找到一個匹配id的元素。然後你遍歷列表中的元素,直到元素與id不匹配。這將找到具有給定ID的所有對象。

實施例列表:

List Index, Object 
0 Id=1 Value=A 
1 Id=2 Value=B 
2 Id=2 Value=C 
3 Id=3 Value=D 
4 Id=3 Value=E 

二進制搜索返回索引2.現在環向下將首先找到元件1:ID = 2相匹配,則元素0:ID = 1不匹配,並且因此終止該向下循環。向上循環首先找到不匹配的元素3:Id = 3。這終止了向上循環。

+0

+1爲我以前的解決方案,我正在做這樣的事情,以避免使用map.my的目標是使用較少的內存和良好的性能。 – Behrooz 2010-06-11 07:52:59

+0

你的回答幫助我回答了我自己。我會將其添加到原始問題中。 – Behrooz 2010-06-11 09:47:38