簡體   English   中英

C ++中的數據范圍過濾器

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

解決方案通常取決於范圍界限。

  1. 如果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的范圍。

  1. 您可以使用Interval樹 - 效率較低,但內存不足(當然比蠻力解決方案更有效)

一種方法是結合您收到的范圍,並將它們映射到底層位圖,指示不在范圍內。

基於類的設計允許你重載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 ?

我認為你想要做的事情被稱為范圍最小查詢

如果您的數據已經全部排序,那就不難了。 使用組合

對於每個子范圍[min,max],您可以找到迭代器i_min和i_max並將它們用作

std::make_pair(i_min, i_max)

使其“范圍”兼容。 然后使用boost :: join將所有子范圍連接到一個范圍(當然是懶惰),然后在下游處理中使用此范圍。

顯然,您應該預先處理所有范圍,以確保它們不重疊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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