📅  最后修改于: 2023-12-03 15:26:39.891000             🧑  作者: Mango
对于一个给定的数字,我们可能需要检查它是否在一个包含多个范围的区间内。比如,我们可能需要检查一个 IP 地址是否在一个 IP 段内,或者检查一个年龄是否在多个年龄段内等等。本文介绍了一种查询多个范围并检查数字是否在这些范围内的方法。
我们可以将每个范围表示为一个二元组 (L, R),其中 L 和 R 分别表示范围的左端点和右端点。对于一个给定的数字 X,我们可以在这些范围中二分查找 X。首先,我们将所有的二元组按照左端点的大小进行排序。然后,使用二分查找 X 在哪个范围内。
这个算法的时间复杂度是 O(logN),其中 N 是总范围数。如果只需要查询一次,那么时间复杂度为 O(NlogN)。如果需要多次查询,我们可以将这些范围用线段树或者其他数据结构预处理一下,使得每次查询的时间复杂度为 O(logN)。
下面是使用 Python 实现这个算法的代码片段:
# 二分查找 X 在哪个范围内
def search(intervals, x):
l = 0
r = len(intervals) - 1
while l <= r:
mid = (l + r) // 2
if intervals[mid][0] <= x <= intervals[mid][1]:
return mid
elif intervals[mid][0] > x:
r = mid - 1
else:
l = mid + 1
return -1
# 排序范围二元组
intervals = [(1, 3), (5, 7), (2, 4)]
intervals.sort()
# 查询数字是否在范围内
x = 6
idx = search(intervals, x)
if idx == -1:
print(f"{x} is not in any interval")
else:
print(f"{x} is in interval {idx}")
本文介绍了一种查询多个范围并检查数字是否在这些范围内的方法。这个算法的时间复杂度是 O(logN),其中 N 是总范围数。如果需要多次查询,我们可以用线段树或者其他数据结构预处理这些范围,使得每次查询的时间复杂度为 O(logN)。