简体   繁体   English

确定一个数字是否在区间数组中

[英]Determine whether a number is in array of intervals

I'd like to perform a binary search for an element in array of intervals.我想对间隔数组中的元素执行二进制搜索。 For example, i need to find the index of the interval that includes 35 in intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]] .例如,我需要在intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]] Also, if the number is not found in any of intervals, the algorithm needs to return -1.此外,如果在任何间隔中都找不到该数字,则算法需要返回 -1。 Is that possible on python3?这在python3上可能吗? How can i modify my standard binary search function so it returns what i need?如何修改我的标准二分搜索函数,使其返回我需要的内容? Here's what my binary search function looks like:这是我的二进制搜索功能的样子:

def b_search(array, element, start, end):
    if start > end:
        return -1
    mid = (start + end) // 2
    if element == array[mid]:
        return mid
    if element < array[mid]:
        return b_search(array, element, start, mid-1)
    else:
        return b_search(array, element, mid+1, end)

Thanks in advance.提前致谢。

You need to modify the binary search such that instead of checking if the element is equal to mid, you need to check whether the element is in the mid interval:您需要修改二分查找,而不是检查元素是否等于 mid,您需要检查元素是否在 mid 间隔中:

def b_search(array, element, start, end):
    if start > end:
        return -1
    mid = (start + end) // 2
    if array[mid][0] <= element <= array[mid][1]:
        return mid
    if element < array[mid][0]:
        return b_search(array, element, start, mid-1)
    return b_search(array, element, mid+1, end)
intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]]
number = 50
idx_list = [i for i,interval in enumerate(intervals) if interval[0] <= number <= interval[1]]
idx = -1  if not idx_list else idx_list[0]
print(idx)

For binary search us the below code:对于二进制搜索,我们使用以下代码:

def b_search_2d(arr_2d, element, start=0, end=0):
    if end == 0:
        end = len(arr_2d) - 1
    if start > end:
        return -1
    mid = (start + end) // 2
    if arr_2d[mid][0] <= element <= arr_2d[mid][1]:
        return mid
    elif element < arr_2d[mid][0]:
        return b_search_2d(arr_2d, element, start, mid-1)
    else:
        return b_search_2d(arr_2d, element, mid+1, end)       
intervals = [[1,10], [11, 18], [21, 24], [25, 32], [33, 40], [42, 43]]
print(b_search_2d(intervals, 35))
print(b_search_2d(intervals, 50))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM