簡體   English   中英

有沒有一種更快的方法來搜索值是否在給定間隔列表中的間隔內?

[英]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)

  1. t在列表間隔的間隔內。
  2. 在該時間間隔內允許使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM