我举了一个反映我的用例的例子:
我在[0, 10000]
范围内有一个直方图。我想有效地支持类型的查询:
int j = maxYInXRange(20, 70);
哪个应返回给定Y
范围内的最大X
值。
我遇到了名为"优先搜索树"的数据结构。用于计算机图形学,但在这个主题上没有易于理解的资源。
答案 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;
对于较大的范围,这将更快地工作,因为它更可能包含列表开头的较高值之一。