将长位数组映射到查找表

Mapping long bit arrays to a lookup table

本文关键字:查找 映射 数组      更新时间:2023-10-16

给定一组长度为l(l>64(的n(n<1000(个唯一位数组(例如c++std::位集类模板(,将这些位数组存储在元素从0到n-1的查找表l中的最佳映射是什么?

我想要实现的是:

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

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

我目前正在使用std::unordered_map<std::bitset<81>, int>和std::unordereded_map::find,但我觉得有一种更快的方法可以做到这一点

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

我能想象的唯一替代方案是在对数组(bit_pattern,index(中进行二进制搜索:对于大小<1000.

但是。。。需要代码、测试和基准测试。。。

我现在的白发告诉我:如果它已经存在并满足你的需求,那么就使用它

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

  • 内存:可能是trie
  • 性能:用作稀疏数组的哈希集(通常有比std::unordered_map更快的哈希集,并且知道输入域通常可以让你对哈希函数进行大量优化(
  • 如果它是结构化的,可能只是一个掩码操作

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