C++ “有效地”;“散列”;要指示的一组值

C++ “有效地”;“散列”;要指示的一组值,c++,hash,lookup,lookup-tables,C++,Hash,Lookup,Lookup Tables,首先,免责声明;哈希是一个有点不准确的术语,我的目标是,请随意建议一个更好的标题 无论如何,我目前正试图编写一个实时运行的复杂空间算法。为了节省周期,我决定生成一个包含32000种可能性的查找表 如果我按惯例这样做,值(包括范围和字段计数)2x+0->+15和3x-2->+2将分别映射到两个四位值和三个三位值,使我的查找表大小为2^(2*4+3*3)=131072个条目,这几乎是410%的浪费 考虑到该算法的性质,冲突将绝对削弱其功能(因此,除非我能保证所有相关值都不会发生冲突,否则没有传统的哈

首先,免责声明;哈希是一个有点不准确的术语,我的目标是,请随意建议一个更好的标题

无论如何,我目前正试图编写一个实时运行的复杂空间算法。为了节省周期,我决定生成一个包含32000种可能性的查找表

如果我按惯例这样做,值(包括范围和字段计数)2x+0->+15和3x-2->+2将分别映射到两个四位值和三个三位值,使我的查找表大小为2^(2*4+3*3)=131072个条目,这几乎是410%的浪费

考虑到该算法的性质,冲突将绝对削弱其功能(因此,除非我能保证所有相关值都不会发生冲突,否则没有传统的哈希函数)。除此之外,我正在使用的结构相当大(即,我会/真的/想避免分配超过我需要的200%的资源)。最后,由于这个表经常被引用,我希望避免在bucket查找和过于复杂的哈希函数中使用传统哈希表的开销


采用了更传统的计算机科学方法后,我开始坚信解决方案在于一些我完全不知道的基转换数学。如果是这样的话,你知道吗?

你可以用计算最大组合数的方法计算一个指数,将每个元素相乘。将每个元素从最高有效到最低有效,添加一个常数使其范围从0到n-1,然后乘以剩余的组合数

假设a、b的值为0到15(范围为16)和c、d、e的值为-2到+2(范围为5):


谢谢你的回答,马克!虽然我实现的解决方案略有不同,但我刚才也解决了这个问题。既然两个16范围的值可以简单地连接并映射到一个字节,允许简化的U7b(c+d*5+e*5*5)请原谅我明显没有参加七年级的数学课,我想哈哈?
index = a * 16*5*5*5 + b * 5*5*5 + (c+2) * 5*5 + (d+2) * 5 + (e+2);