假设有很多范围。例如,大小为5000的集合:
[100,200],[1,59],[3,5],[70,70]...
如何在Java中检查整数n是否有效地落入这些范围中的至少一个?
答案 0 :(得分:5)
执行此操作的时间有效方法是为所有集合中的所有整数创建一个Bitset
位。然后,您可以通过一次O(1)
调用来测试会员资格。
问题在于,如果整数的组合范围很大,那么Bitset
会占用大量内存。
第二种方法是组合重叠范围,并构造一个TreeMap<Integer, Integer>
,其中键是下限,值是每个组合范围的上限。然后使用TreeMap::floorKey
和测试来查找匹配的范围。此过程为O(logN)
,其中N
是组合范围的数量。空间使用情况为O(N)
。