给出一组长度为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,但是我觉得有一种更快的方法。
答案 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(希望)执行二进制搜索。效率取决于您必须为位集提供的运算符<()。