簡體   English   中英

高效的算法來搜索數據集

[英]Efficient algorithm to search sets of data

給定幾組元素,例如:

int set1[5] {5601, 935, 4153, 2195, 422};
int set2[5] {5601, 935, 23, 44, 422};
int set3[5] {4205, 935, 4153, 2195, 15};
int set4[5] {4205, 589, 4015, 44, 422};

在順序很重要的地方(即1、2、3不同於2、1、3),什么是找到特定集合的有效算法? 例如,您要查找:

int value[5] {5601, 935, 23, 44, 422};

注意事項:

  1. 新集的插入成本不是問題,因此可以將它們存儲在任何數據結構中,以優化搜索時間。

  2. 這些集合將分別包含1到1,000,000個元素之間的任意位置(大約,並且將包含1到1000個元素之間的任意位置(再次大約是)。但是,對於任何給定的集合,元素的數量將始終相同(例如,如果一個集有10個元素,那么所有集將有10個元素)。

后續問題,我將在C ++中實現此功能,因此我很想找出任何推薦的算法,無論它們是否存在於開源C ++庫(最好是STL,Boost或QT)中,但我會考慮其他)。

如果順序很重要,那么您正在查看的是序列,而不是集合。 術語很重要。

由於您僅考慮大約1000個序列,因此將其存儲在哈希表中具有良好的性能應該很容易。 我會考慮構造一個字符串來表示每個序列,例如,通過串聯每個元素的字符串表示形式,再加上某種定界符,然后對其進行哈希處理。

使用std::vector<set_type>存儲設置。 將所有套件插入容器。 使用std::sort對容器進行std::sort 使用std::binary_search (或std::lower_bound如果需要元素的迭代器)查找元素。

用於set_type的類型取決於每個集合中的元素數量。 如果已知元素的數量很小,則std::array<T, N>就足夠了; 否則,請考慮std::vector<T>

為這些集定義順序,然后將它們插入樹中。 或者定義一個哈希碼和一個比較器並對其進行哈希表化。

在這種情況下,我將使用哈希表。 您的訪問時間大約為O(1) (最壞的情況是O(n)但具有良好的哈希函數,這不是問題)

因此,如果您的Hashtabel足夠大並且您不必擔心空間,那么這肯定是最快的搜索方式。 (考慮到二進制搜索在O(log(n))

哈希表僅在新的C ++ 0x標准的STL中可用。 參見STL :: TR1

暫無
暫無

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

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