将数十万条固定取值的长度为10的字符串列表高效转换为整数数组的算法方案求助
将数十万条固定取值的长度为10的字符串列表高效转换为整数数组的算法方案求助
各位大佬,我现在碰到一个性能瓶颈问题,想请大家帮忙出出主意:
我有一个包含数十万条元素的字符串列表,每个字符串的长度固定为10,而且所有字符串只能是58种固定取值中的一种,举个片段例子:
NORMAL NORMAL HUNT_GROUP CALL_TRANS RING_BACK FWD_NOREPL FWD_UNCOND ...
需求是把这些字符串按照预先约定的规则转换成整数,比如 NORMAL→1、CALL_TRANS→3、RING_BACK→19、HUNT_GROUP→11 这类映射。
我试过的方法及问题
- CASE语句匹配:最开始用CASE逐个判断字符串,结果速度慢到离谱,代码大概是这样:
case S of 'NORMAL ': I:=1; 'CALL_TRANS': I:=3; 'RING_BACK ': I:=19; 'HUNT_GROUP': I:=11; 'FWD_NOREPL': I:=7; 'FWD_UNCOND': I:=6; 'FWD_BUSY ': I:=5; ... end; - 数组循环匹配:后来改成用数组存所有58种取值,循环遍历匹配,找到后赋值并跳出循环:
把高频值放在数组开头后,性能稍微好了一点,但还是达不到预期的效率。for J:=0 to 57 do if S=A[J] then begin I:=J; break; end;
我想到的优化思路
我觉得全字符串比较和遍历所有58个值是性能瓶颈所在,所以想通过字符索引跳转的方式来提速:
比如先取字符串的第一个字符作为索引,查预先定义的数组A1,A1里存的是下一个需要检查的字符位置。比如以F开头的三个字符串(FWD_NOREPL、FWD_UNCOND、FWD_BUSY),第一个字符都是F,A1['F']就指向第5位字符;这三个字符串的第5位分别是N、U、B,再用这个字符去查数组A2,直接拿到对应的整数(A2['N']=7、A2['U']=6、A2['B']=5)。这样两步就能完成映射,不用遍历也不用全串比较,理论上会快很多。
但现在的问题是:怎么高效且确定性地构建A1、A2这类索引数组? 或者有没有成熟的已知算法能解决这类固定取值字符串到整数的快速映射问题?毕竟这58个长度为10的字符串相当于一个10×58的字符矩阵,会不会有代数或者其他领域的方法能用上?
希望有经验的大佬能给我指点一下,谢谢!
备注:内容来源于stack exchange,提问作者Vodnik
相关产品推荐
相关产品推荐

