范围内最大/最小值的数据结构

时间:2015-09-24 11:26:24

标签: java algorithm graphics

我举了一个反映我的用例的例子:

我在[0, 10000]范围内有一个直方图。我想有效地支持类型的查询:

int j = maxYInXRange(20, 70);

哪个应返回给定Y范围内的最大X值。

我遇到了名为"优先搜索树"的数据结构。用于计算机图形学,但在这个主题上没有易于理解的资源。

3 个答案:

答案 0 :(得分:2)

我相信你正试图解决range minimum/maximum query problem。如果您在开始时花费更多时间预先计算信息,则有多种方法可以实现每个查询的次线性时间。关于几种有效方法here有一个很好的教程。

例如,如果你的直方图没有改变,你可以用O(1)中的稀疏表回答查询,使用O(N log N)时间和内存进行预计算,其中N是元素的数量。直方图。如果你的直方图经常变化,一个分段树可用于O(log N)更新和查询,O(N)时间和内存可用于一次性预计算。

答案 1 :(得分:1)

标准TreeMap如何使用subMap(K,boolean,K,boolean)方法?

TreeMap histogram = ...
return histogram.subMap(20,true,70,true).values().stream().max()

边界的查找将是O(log n)。找到最大值将是O(m),其中m = max-min。我不认为你可以找到更好的数据结构,除非你预先计算所有内容,我认为计算和存储大小都需要O(n²)

答案 2 :(得分:0)

您可以按值从最高到最低对直方图索引进行排序。然后,对于给定的范围迭代它:

List<Entry> histogramEntries = ... //sorted by value


for(Entry entry: histogramEntries)
  if(range.contains(entry.index))
     return entry.value;

对于较大的范围,这将更快地工作,因为它更可能包含列表开头的较高值之一。