范围搜索算法的实现

时间:2017-09-27 07:39:53

标签: java algorithm search data-structures

我想问一个关于算法的问题。

假设有几个段。(段号不固定,可能很长)

例如:

segment                  data range (data range not fixed)

**A                             0~10**

**B                             11~45**

**C                             46~49**

**D                             50~100**

**E                             101~105**

**F                             106~128**

如果输入→99

我会从我的程序中获得输出'D'。

我将把这个示例实现放在java中。

那么,你有什么方法或算法可以让程序执行时间更快吗?

4 个答案:

答案 0 :(得分:0)

你可以使用番石榴的范围。如果输入在范围内,则创建范围,检查(简单循环)。

Guava's Range Tutorial

Ranges Explanation

Docs

答案 1 :(得分:0)

您可以使用ConcurrentSkipListMap并添加以映射范围和值

答案 2 :(得分:0)

假设您的数据范围都已排序且不重叠,那么您可以尝试使用二进制搜索样式方法。

您可以将每个范围的起始值放入数组中:

[0, 11, 46, 50, 101, 106]

正确的起始值(如果存在)将具有以下两个属性:

  • 小于90
  • 右边的相邻值大于90或不存在(例如,如果起始值是数组中的最后一个范围)

在这种情况下搜索90是微不足道的,因为我们会立即点击它。让我们说我们想找到20.我们将采取以下步骤:

[0, 11, 46, 50, 101, 106]
Choose 50; fails because 50 > 20; go left
[0, 11, 46]
Choose 11; succeeds because 20 > 11 and 20 < 46

因此,这将产生范围11-45,我们需要再检查一次以确保20在此范围内。在这种情况下,它是,但它不是必须的。上面描述的二分搜索方法只能找到最合适的范围,它不一定要包含实际的数字。

答案 3 :(得分:0)

你可以使用Interval Tree - 我前段时间发布了一个实现here

间隔树也可以处理重叠范围。