应该使用哪种数据结构进行范围查找?

时间:2015-03-11 13:35:27

标签: data-structures

我正在考虑使用HashMap,但我认为要么必须自定义它,要么我必须为它创建自定义数据结构。我们知道HashMap存储键值对但我需要一个数据结构,而不是单个键我应该能够放置一个范围。例如:

Range        Should return
0 to 50      Object1
51 to 100    Object2
90 to 150    Object3

所以 如果用户搜索10.他应该能够获得Object1, 如果用户搜索55.他应该能够获得Object2, 如果用户搜索95.他应该能够获得Object2和Object3。

我想在每个对象中放置范围并将所有对象放入ArrayList或LinkedList中然后我可以迭代它并找到满足输入的所有对象。但它的时间复杂性会更多。对于每个输入,我必须遍历整个列表。我也考虑过树,但是在重叠范围的情况下(如51到100和90到150),我无法弄清楚这将有多大帮助。

让我知道你的观点,我的目标是时间复杂度应该不像或接近hashmap

1 个答案:

答案 0 :(得分:1)

你可以使用 B-Tree B-Tree
或者可能是一个不相交的结构:Disjoint-set另一个S.O.用户建议 TreeMap TreeMap
最终的可能性(可能解决您的重叠范围困境)是 R-Tree: R-Tree



R-Tree可视化: R-Tree Structure Visualization


使用 B-Tree ,您可以在每个节点对象中放置一个小的“目录”字段,该字段可以立即告诉您每个节点/对象中包含的内容。但是,您必须考虑当包含节点充满对象时发生的情况,并且您必须向另一个节点捐赠/采用对象。

话虽如此,使用路径压缩 Disjoint-set结构为您提供了O(1)的分期运行时间,以及O(log * N)的最坏情况!这也非常容易实现;你真的只需要一些核心方法,(Union,Find,Union By Size,Find By Size),让它运行起来。

R-Trees 将允许您处理具有重叠范围的情况,但您也牺牲了一点运行时间。在最坏的情况下,最终搜索时间为O(M logMn),这比HashMap慢。