我要求(非常)快速处理有限范围的字符串,统计它们的值.输入文件的格式如下:
January 7
March 22
September 87
March 36
Run Code Online (Sandbox Code Playgroud)
等等.因为线宽是相同的,所以我可以简单fread快速地阅读一行,并且我开发了一个完美的散列函数,但是我想知道是否有人可以提供任何关于如何使它更快的建议.我将介绍每个建议,看看它是怎么回事.
散列函数基于月份名称,以允许将值快速分配给存储桶.跟我来这儿.我首先想出了完美哈希的最小字符数:
January
February
March
April
May
June
July
August
September
October
November
December
Run Code Online (Sandbox Code Playgroud)
请记住,月是所有九个字符由于我拥有整个输入线.
不幸的是,没有一个列标记一个月的唯一.第1列重复J,第2列重复a,第3列重复r,第4列重复u,第5列向前复制<space>(还有其他重复但有一个足以阻止单列散列键).
但是,通过使用第一和第四列,我得到的值Ju,Fr,Mc,Ai,M<space>,Je,Jy,Au,St,Oo,Ne和De,这是独一无二的.此文件中没有无效值,因此我不必担心输入数据的存储桶不正确.
通过查看字符的十六进制代码,我发现通过与策略值进行AND运算可以获得较低的唯一值:
FirstChar Hex Binary &0x0f
--------- --- --------- -----
A x41 0100 0001 1 …Run Code Online (Sandbox Code Playgroud)