C++ 将一组整数变量映射到值的有效方法
C++ efficient way to map a group of integer variables to values
为了将一组整数变量映射到值(假设我有 a1, a2, a3, a4, a5, a6
来确定值 v
; 这是一个像 map<tuple<int, int, int, int, int, int>,VALUE_TYPE>
或 map<struct{int, int, int, int, int, int},VALUE_TYPE>
), 我们可以使用
- 以整数为键构造的字符串
- 元组作为键
- 结构或class作为键
- 等等...
我很好奇这些方法的性能。在我的情况下,
- 少插入,多查询
- 范围广泛但整数键分布稀疏
- 时间更关心我,记忆更少
- 地图访问是最耗时的部分,因此即使是 10% 的加速也很重要
问题是哪种方式在我的情况下表现更好?
如果选择了 struct 或 class 键,是否有任何技巧可以提高比较器的效率?
unordered_map 是否更适合这种情况?我应该如何计算密钥的哈希值?
对于解决方案的任何建议或评论,我将不胜感激。也欢迎讨论更一般的情况。提前致谢。
基本上:实施不同的解决方案,编写性能测试程序并进行测量!
当然可以:
- 将整数用作整数比将它们转换为字符串更快。
- 结构(或class)应该比元组快(我的经验)。
- 也试试
std::array<>
容器(也已经提供了用于比较的运算符)。
- 哈希映射 (
std::unordered_map<>
) 比排序映射 (std::map<>
) 更快,但当然只能在不需要使用部分键进行搜索时使用。
此外,如果您的数字相对较小并且在一个键中有很多数字,请考虑实施 trie 数据结构。就像 std::unordered_map
这将允许您在 O(l)
时间内访问元素,其中 l
是键的长度,而且它还允许您以升序迭代抛出所有值并通过部分键找到一个值。这里的问题是你的内存消耗将与字母大小成正比(当然,你可以将内边存储在一些复杂的数据结构中,但这会对性能产生负面影响)。
为了将一组整数变量映射到值(假设我有 a1, a2, a3, a4, a5, a6
来确定值 v
; 这是一个像 map<tuple<int, int, int, int, int, int>,VALUE_TYPE>
或 map<struct{int, int, int, int, int, int},VALUE_TYPE>
), 我们可以使用
- 以整数为键构造的字符串
- 元组作为键
- 结构或class作为键
- 等等...
我很好奇这些方法的性能。在我的情况下,
- 少插入,多查询
- 范围广泛但整数键分布稀疏
- 时间更关心我,记忆更少
- 地图访问是最耗时的部分,因此即使是 10% 的加速也很重要
问题是哪种方式在我的情况下表现更好?
如果选择了 struct 或 class 键,是否有任何技巧可以提高比较器的效率?
unordered_map 是否更适合这种情况?我应该如何计算密钥的哈希值?
对于解决方案的任何建议或评论,我将不胜感激。也欢迎讨论更一般的情况。提前致谢。
基本上:实施不同的解决方案,编写性能测试程序并进行测量!
当然可以:
- 将整数用作整数比将它们转换为字符串更快。
- 结构(或class)应该比元组快(我的经验)。
- 也试试
std::array<>
容器(也已经提供了用于比较的运算符)。 - 哈希映射 (
std::unordered_map<>
) 比排序映射 (std::map<>
) 更快,但当然只能在不需要使用部分键进行搜索时使用。
此外,如果您的数字相对较小并且在一个键中有很多数字,请考虑实施 trie 数据结构。就像 std::unordered_map
这将允许您在 O(l)
时间内访问元素,其中 l
是键的长度,而且它还允许您以升序迭代抛出所有值并通过部分键找到一个值。这里的问题是你的内存消耗将与字母大小成正比(当然,你可以将内边存储在一些复杂的数据结构中,但这会对性能产生负面影响)。