[英]How to find if a point is within a set of intervals?
我正在尋找最快的方法來決定一條線上的一個點是否在這一行的一個子集內。 我給了一個整數Point,我也有一個“列表”:
在這個例子中,如果我的點的值是5,那么我返回true,因為它包含在一個區間中,對於55也是如此。如果我的點等於1000,我也返回true,因為它匹配點列表。
我正在尋找一種快速的方法(比線性更快)來檢查這種情況,而不必像可能的點那樣實現盡可能多的整數(即,對於1:1000的間隔,我不想實現1000個整數)。 這可以在對數時間內完成嗎?
謝謝
編輯:你可以認為任何時候預處理數據列表等於0,因為一旦我的初始間隔被處理,我需要將這個測試應用到10k點
如果排序的整數范圍和范圍不重疊,則可以執行二進制搜索以在對數時間內找到正確的范圍。
該范圍是否有任何限制? 基於此,你可以提出散列函數來恆定搜索。 但這取決於你的約束方式。
在反思之后,我認為以下代碼應該在對數時間內工作,不包括構建映射所需的時間:
enum pointType {
point,
open,
close
};
std::map<long int, pointType> mapPoints;
mapPoints.insert(std::pair<long int, pointType>(3, point));
//create the 5:10 interval:
mapPoints.insert(std::pair<long int, pointType>(5, open));
mapPoints.insert(std::pair<long int, pointType>(10, close));
int number = 4;
bool inside = false;
std::map<long int, pointType>::iterator it1 = mapPoints.lower_bound(number);
if(it1->first == number || it1->second == close) {
inside = true;
}
我認為只要地圖以非重疊的間隔正確填充,這就應該有效
首先檢查點的hash_map。 這是簡單的檢查。
然后,只需按第一個坐標排序間隔圖,然后找到該點的lower_bound。
然后檢查您是否包含在返回的元素中。 如果你不在,那你就不在。
您可以在次線性時間內執行此操作GIVEN樹數據結構(我建議使用B樹),如果您不計算構建樹所花費的時間(大多數樹需要n log n或類似的時間來構建)。
如果你只有一個簡單的列表,那么你不能比線性更好,因為在最壞的情況下你可能需要檢查所有的點和間隔。
您可以使用布隆過濾器來測試點,看看它不是在一個時間間隔,以線性O(1)時間。 如果它通過了該測試,你必須使用另一種方法,例如二進制搜索,以查看它是否是O(log n)時間內的間隔的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.