【问题标题】:How to check if an integer is in a set of given ranges? [closed]如何检查一个整数是否在一组给定的范围内? [关闭]
【发布时间】:2018-05-30 18:55:17
【问题描述】:

假设有一大组范围。例如大小为 5000 的集合:

[100,200],[1,59],[3,5],[70,70]...

如何在 Java 中有效地检查整数 n 是否在这些范围中的至少一个范围内?

【问题讨论】:

  • 为什么你在这个问题上有一个python标签?
  • 这些范围代表什么对象?长度为 2 的整数数组还是 Range 类?
  • 合并任何重叠的范围,然后对它们进行排序。使用二分查找检查是否包含测试值。或者,如果域相当小,则构建一个位集,其中设置了所有位 100-200、1-59 等,然后使用 bitset.get(testValue)
  • 您如何解决问题取决于范围的上限和下限以及您必须测试多少项目才能获得成员资格。如果最高和最低可能范围界限相差一个“小”量(即小于 10,000),那么基于数组的解决方案可能是最好的。如果界限大得多,那么@AndyTurner 的建议将适用。您没有向我们提供足够的信息,也没有展示您的尝试。

标签: java algorithm data-structures hashmap


【解决方案1】:

节省时间的方法是创建一个Bitset,并为所有集合中的所有整数设置一个位。然后,您可以通过单个 O(1) 调用来测试成员资格。

问题是如果整数的组合范围很大,那么Bitset会占用大量内存。

第二种方法是组合重叠范围,并构造一个TreeMap<Integer, Integer>,其中键是下限,值是每个组合范围的上限。然后使用TreeMap::floorKey 和一个测试来查找匹配范围。此过程是O(logN),其中N 是组合范围的数量。空间使用量将为O(N)

【讨论】:

  • 第二种方法的替代方法是使用Guava's RangeSet 之类的方法,它可以简单地从组合范围和查询所包含的值中减少一些苦差事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2014-05-21
  • 2021-03-15
  • 2011-06-29
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多