问题描述
我偶然发现了以下页面:http://jackfoxy.com/simple-lookups-in-fsharp/
它对各种用于插入和检索的集合进行基准测试。
如果我们查看此表(网页上的第二个表):
String Key by Number of Elements in Lookup Structure,10,000 random lookups
Map IntMap Dict HashTbl HshMltMap
10^2 1.3 n/a 0.4 0.3 1.5
10^3 1.7 n/a 0.4 0.4 1.5
10^4 3.0 n/a 0.7 0.7 1.8
10^5 5.3 n/a 1.5 1.2 2.4
10^6 8.4 n/a 1.6 1.5 6.3
我们可以看到,当Map变大时,其查找速度比Dictionary慢5倍。
由于Map是只读的,因此具有所有最佳的方式来组织数据,因为它不处理插入,调整大小等。为什么它这么慢?
解决方法
C#字典是使用哈希表实现的,因此查找速度接近O(1)
。
由于不可变性,F#Map必须使用二叉树,因此查找速度为O(logN)
。
F#Map和其他不变的数据结构实际上处理插入。您仍然需要在地图上插入元素,但是要获取新地图,而旧地图仍然完好无损。为了使这一点有效,新的和旧的必须共享元素(不涉及克隆/复制)。
是的,最好的方法是使用树(F#映射,设置)或链接列表(F#列表)。