[英]Data range filters in C++
我想允許用戶能夠定義將過濾數據的范圍。 定義的范圍可以是連續的,重疊的或分開的(例如,用戶輸入以下范圍:1-10,5-10,10-12,7-13和15-20)。
然后我想過濾數據,以便用戶只顯示這些范圍內的數據。
我可能會在不同的層上創建代碼,在適當的情況下組合范圍(因此上面的示例將變為1-13和15-20,但我不希望我的數據服務與此相關,所以它必須是能夠處理上面的例子)
我有很多數據,速度是優先考慮因素,所以我不想迭代每個數據項的范圍列表來檢查它是否應該顯示給用戶。
是否有可用於實現此目的的數據結構(或某些算法)?
您可以使用boost的filter_iterator來實現此目的。
如果對范圍列表進行排序,則可以使用二進制搜索來最小化迭代。 但實際上,除非你有大量的范圍,迭代才會最快。
您可以將迭代器用於容器中。 例如,std :: vector提供“at”方法。 這些迭代器可以是連續的,重疊的或分離的。
使您的列表不相交(如您所建議),組合重疊的范圍。 然后對端點數組進行排序,並為每個數據元素執行二進制搜索,並確定它是在范圍內還是在范圍之外。 偶數元素將始終開始一個范圍,奇數元素將始終結束一個范圍。
HTH。
解決方案通常取決於范圍界限。
max
- min
不是那么大(例如,你在[1..1024]中定義了邊界),你可以只使用一個數組,它將每個X指向范圍列表。 對於您的示例,數組應該是: ranges=[0:(1,10), 1:(5,10), 2:(10,12), 3:(7,13), 4:(15-20)] points=[1:[0],2:[0],3:[0],4:[0],5:[0,1],...,7:[0,1,3],...10:[0,1,2,3],...15:[4],...20:[4],21:[]...]
因此,在這種情況下,您可以快速確定特定X的范圍。
一種方法是結合您收到的范圍,並將它們映射到底層位圖,指示在或不在范圍內。
基於類的設計允許你重載operator +=
for syntactic sugar,但是一個裸位圖也可以正常工作。 例如:
# original bitmap
bits = [ 0,0,0,0,0,0,0,0,0,0 ]
# add 1-5
bits = [ 0,1,1,1,1,1,0,0,0,0 ]
# add 4 - 6
bits = [ 0,1,1,1,1,1,1,0,0,0 ]
# Look for 3
bits[3] == 1 ?
我認為你想要做的事情被稱為范圍最小查詢 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.