通过二分查找获取一系列对象

时间:2010-06-11 07:38:21

标签: search binary-search range

我有一些这样的数据:

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

它们是对象(不是纯文本) 我希望获得ID = 2的所有对象 我可以进行二进制二进制搜索并得到索引3,但是如何得到(2和4)是否有任何有效的算法?
真正的问题列出了大约一百万件物品。

除了bf和lisp之外的任何语言都可以提供帮助。

1 个答案:

答案 0 :(得分:1)

您可以创建一个Map,将id映射到值集合;

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

这将具有O(1)的有效查找时间。您也可以进行二进制搜索,但查找效率会降低。

二进制搜索算法:

首先创建一个排序列表(arraylist,linkedlist等)。它必须按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,它不匹配。这将终止向上循环。