【发布时间】:2018-07-20 13:05:36
【问题描述】:
给定一组长度为 l (l > 64) 的 n (n
我想要达到的目标如下:
L["000010001 ... 00101010"] = 0
L["111000000 ... 01000100"] = 1
...
L["001101100 ... 01010111"] = n-1
位数组,如果转换为小数,则无序。
我目前正在使用std::unordered_map<std::bitset<81>, int> 和std::unordered_map::find,但我感觉有一种更快的方法。
【问题讨论】:
-
你的感觉从何而来?
-
根据您的解释,unordered_map 是一个不错的选择。如果我们知道更改率,或者您的应用将进行多少次查找,那么其他方法可能会更好。
-
“女巫是最简单的?” 和“更快的方法” 通常是相互排斥的。请选择一个。
-
Unordered_map 将从您的 bitset 的内容生成哈希,然后使用该哈希进行索引。这应该相对较快进行索引,但可能不是唯一的,具体取决于哈希的计算方式,因此可能会发生一些线性最终搜索。哈希是在插入项目时计算的,因此如果您使用 std::set,则每次 find() 调用需要进行 1000 次哈希计算,而每次调用 log2(1000)=10 次更复杂的比较。所以 std::set 在 100 find() 之后肯定会丢失
-
有 2^81 ~= 10^24 个不同的
std::bitset<81>,但你只有 1000 个。这 10^24 个是否都是可能的值?如果没有,您可以将范围缩小到更易于管理的范围。