将长位数组映射到查找表

时间:2018-07-20 13:05:37

标签: c++ algorithm c++11

给出一组长度为l(l> 64)的n(n <1000)个唯一位数组(例如c ++ std :: bitset类模板),这是将此类位数组存储在查找表中的最佳映射L从0到n-1的元素,找到它们最快?

我要实现的目标如下:

L["000010001 ... 00101010"] = 0
L["111000000 ... 01000100"] = 1
...
L["001101100 ... 01010111"] = n-1

如果将位数组转换为小数,则不进行排序。

我目前正在使用std::unordered_map<std::bitset<81>, int>std::unordered_map::find,但是我觉得有一种更快的方法。

3 个答案:

答案 0 :(得分:2)

NSManagedObject具有强大的优势:它存在,经过广泛测试并经过优化。

我能想到的唯一选择是在成对的数组(bit_pattern,索引)中进行二进制搜索:对于大小小于1000的数组,需要少于10次比较。

但是...需要代码,测试和基准测试...

现在我的白发告诉我:如果它已经存在并满足您的需要,请使用它

答案 1 :(得分:2)

很大程度上取决于您所关心的:

  • 记忆:可能是一个特里
  • 性能:用作稀疏数组的哈希集(通常比while(! feof($file)){ $current_data = fgetcsv($file); for ($i=0; $i < $total_title ; $i++) { if( empty( $current_data[ $i ] ) ){ unset($information[$itt]); break; } $information[$itt][ $titles[$i] ] = $current_data[$i] ; } $itt = $itt+1; } 更快,并且知道输入域通常可以使您极大地优化哈希函数)
  • 如果它是结构化的,可能只是一个掩码操作

通常,在遗传学中对长的简单序列的索引和搜索进行了广泛的研究,因此也许您可以在其中找到一些算法。

答案 2 :(得分:-1)

经典的“查找表”将需要2 ** 81个条目,因此无法绕过find函数。 unordered_map必须线性搜索,但std :: map(希望)执行二进制搜索。效率取决于您必须为位集提供的运算符<()。