这几天尝试将以前用 java 编写的动态规划程序转化为 c++,发现 c++ 反而运算速度更慢呢,觉得可能有以下几条原因:
在递归运算时,为了加快运算速度,使用 map 类型存储计算过的数据。但 c++ 的 map 没有 java 的 hash map 查找速度快。c++ 中的 map 可以转化为 unordered_map,但我总是出错,c++ 自定义类的 hash 值定义比 java 麻烦多了。
若使用 vector 容器存储计算过的数据,速度应该能快不少。但是涉及到动态规划不同的状态以及对应的结果在 vector 里很快找到的问题。跟一位认识的朋友聊过,可以近似用进制转换的思想:将动态规划中的状态转化为 vector 的索引。但是我觉得浪费了很多 vector 的空间,小规模问题这种方法还是蛮不错的。
java 在递归运算时,hash map 有一个函数 computeIfAbsent 计算查找速度特别快,而 c++ 中的 map 再带的 find 函数大大拖累了速度。
我估计在使用 c++ 中的 map 类型时,要进行更多设置,但目前还不清楚怎么弄。
虽然 c++ 原则上比 java 运算速度快,但是经过这两天的折腾,发现 c++ 太难用了,java 的很多函数与功能都可以看做是对 c++ 的改进。当然,也可能是我对 c++ 不熟的缘故。