[英]Is there a faster way to search whether a value is within an interval given a list of intervals?
作為我的代碼的一部分,我遇到以下問題:我有以下列表:
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函數更快嗎?
您可以在開始時間間隔上執行二進制搜索,以減少每次搜索到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。現在,我們可以輕松地檢查給定標簽是否屬於此間隔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.