我有一些这样的数据:
ID Value
1 AAA
1 ABC
2 dasd
2 dsfdsf
2 dsfsd
3 df
3 dwqef
它们是对象(不是纯文本)
我希望获得ID = 2的所有对象
我可以进行二进制二进制搜索并得到索引3,但是如何得到(2和4)是否有任何有效的算法?
真正的问题列出了大约一百万件物品。
除了bf和lisp之外的任何语言都可以提供帮助。
答案 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,它不匹配。这将终止向上循环。