作为我的代码的一部分,我遇到以下问题: 我有以下列表:
intervals = [(1,3), (5,12), (16,20)]
labels = [[1,2],[1],[2,3]]
第一个是已排序的,非重叠间隔的列表,第二个是相应间隔的“允许”标签。例如,标签1和2在间隔(1,3)
中是允许的。而且,间隔的形式为[a,b)。
我想查找是否为元组(t, l)
:
t
在列表间隔的间隔内。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函数更快吗?
答案 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。现在,我们可以轻松地检查给定标签是否属于此间隔。