如何将专门化字符串映射到指定的整数
how to map a specialized string into specified integer
我在做一些金融交易的工作。我有一套股票代码,但它们有非常清晰的图案:它由两个字符AB
, AC
, AD
和当前月份组成,这是一个四位数字:1503
, 1504
, 1505
。例如:
AB1504
AB1505
AC1504
AC1505
AD1504
AD1505
....
由于这些字符串设计得很好,我想将每个字符串映射(哈希)成一个唯一的整数,这样我就可以使用整数作为数组索引进行快速访问,因为我在系统中有很多检索,std::unordered_map
或任何其他哈希映射都不够快。我的测试表明,一般哈希映射的延迟级别为百纳秒,而数组索引总是低于100纳秒。我的理想情况是,例如,AB1504
映射到整数1
, AB1505
映射到2
....,然后我可以在里面创建一个数组来更快地访问与这些符号相关的信息。我试图找出一些哈希算法或其他方法,可以达到我的目标,但没有找到。你们对这个问题有什么建议吗?
您可以将字符串视为可变基数的表示形式,并将其转换为整数。例如:
AC1504:
A (range: A-Z)
C (range: A-Z)
15 (range: 0-99)
04 (range: 1-12)
提取部分;那么哈希函数可以是
int part1, part2, part3, part4;
...
part1 -= 'A';
part2 -= 'A';
part4 -= 1;
return (((part1 * 26 + part2) * 100 + part3) * 12 + part4;
以下值应该用32位整数表示:
XYnnnn => (26 * X + Y) * 10000 + nnnn
此处X
和Y
取值范围为[0,26),n
取值范围为[0,10)。
你总共有6,760,000个可表示的值,所以如果你只想将少量数据与之关联(例如计数或指针),你可以创建一个平面数组,其中每个符号占用一个数组条目。
如果您将字符串解析为混合基数,首先是2个以26为基数的数字,然后是4个以10为基数的数字,您将很快获得每个字符串的唯一索引。唯一的问题是,如果您可能得到一个稀疏填充的数组。
在计算索引时,您可以随时重新排序数字,以尽量减少上述问题。
由于这些数字实际上是月,我将从第一个条目计算月数,并将其与前缀中的2位26进制数相乘。
希望你能从我的平板电脑上打字的这一刻得到一些意义。: D
我假设格式为'AAyymm',其中A是大写字符yy是两位数字的年份,mm是两位数字的月份。
因此可以将其映射为10 (AA) + Y (yy) + 4 (mm)位。其中Y = 32 - 10 - 4 = 18位表示32位(或262144年)。有了这些,您就可以将格式表示为整数,方法是在将这些字符转换为整数后,将这些字符移到这些位置,并将年和月对移到这些位置。
注意:在二进制表示中总是存在空白,这里是5+5位表示字符(6 + 6个值),而在4位表示月份(4个值)
为了避免间隙,将表示法更改为ABmmmm,其中AB对由数字26* a +B表示,mm是相对于某一年中的某个零月份的月份(涵盖2^32/1024/12 = 349525年-有32位)。
但是,您可以考虑将股票符号和时间分开。在一个字段中组合两个值通常很麻烦(它可能是一个很好的存储格式,但不是一个好的'程序数据格式')。
- 碱基对映射 - 将 argv[i] 移动到整数或字符作为输入
- 整数键映射到头文件中的成员函数指针
- 如何将整数向量插入到键中,标准::映射的值
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 将整数范围映射到另一个范围
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 从文件读取到映射中,该映射将键作为整数,并将相应的值设置为设置
- 如何使用 std::multimap 将整数键映射到两个用作多维数组坐标的整数值(对于井字)?
- 整数和元组的静态 STL 映射返回 0
- 如何将字符设置为函数?我对语法感到困惑...设置<char>max_freq(映射<字符,整数>频率)
- C++:使用一对(cpp_int,int)整数作为无序映射中的键(其中cpp_int是boost多精度整数)
- 如何打印包含整数和整数集的std::映射
- C++将一组整数变量映射到值的有效方法
- 如何访问映射的向量(整数和字符串的向量)
- 高效实现 64 位和 32 位无符号整数之间的双向映射
- 如何让整数映射到 C++ 中的类定义
- 计算一组关系的整数映射的更有效的算法
- 如何将两个正整数映射为一个唯一的整数
- 用于将整数映射到令牌的字符串的宏