有没有一种更快的方法来搜索值是否在给定间隔列表中的间隔内?

时间:2019-01-17 01:15:22

标签: python search data-structures

作为我的代码的一部分,我遇到以下问题: 我有以下列表:

    intervals = [(1,3), (5,12), (16,20)]
    labels = [[1,2],[1],[2,3]]

第一个是已排序的,非重叠间隔的列表,第二个是相应间隔的“允许”标签。例如,标签1和2在间隔(1,3)中是允许的。而且,间隔的形式为[a,b)。

我想查找是否为元组(t, l)

  1. t在列表间隔的间隔内。
  2. 在该时间间隔内允许
  3. l

我能想到的方法是将间隔列表打破为低点和高点:

    lows = np.array([1,5,16])
    highs = np.array([3,12,20])
    find_indx = np.where(lows >= t)
    if len(find_indx[0]) > 0:
         indx = find_indx[0][0]
         if t < highs[low_indx] and l in labels[low_indx]:
              return 'Yes'
    return 'No'

是否有更快/更清洁的方法解决此问题?使用二进制搜索比内置的python函数更快吗?

1 个答案:

答案 0 :(得分:0)

您可以在开始间隔执行二进制搜索,以减少每次搜索到log(N)的时间复杂性。例如,让

label = [10,11]
intervals = [(1,3), (5,12), (16,20)]

由于间隔不重叠,我们需要找到第一个间隔起始位置小于或等于标签的起始位置。

    int val = 10;
    int arr[] = {1,5,16};

    int low = 0;
    int high = arr.length-1;

    while(high>=low)
    {
        int mid = low + (high-low)/2;
        if(arr[mid] == val)
            return arr[mid];
        else if(high == arr.length-1 && arr[mid]<val)
            return arr[high];
        else if(low == 0 && arr[mid]>val)
            return arr[low];
        else if(arr[mid]>val)
            high = mid-1;
        else
            low = mid+1;
    }

    System.out.println(arr[low]);

这里的输出将是5。现在,我们可以轻松地检查给定标签是否属于此间隔。