pro*_*nce 45 haskell hashtable hashmap
我正在编写有很多表查找的程序.因此,我仔细阅读Haskell的文档时,我偶然发现了Data.Map
(当然),但也Data.HashMap
和Data.Hashtable
.我不是哈希算法的专家,在检查包之后,它们看起来都非常相似.因此我想知道:
1:如果有什么主要差异?
2:在大约4000个键值对的地图/表上进行大量查找,哪个性能最高?
mer*_*ict 52
1:如果有什么主要差异?
Data.Map.Map
内部是一个平衡的二进制树,因此查找的时间复杂度为O(log n).我相信它是一个" 持久的 "数据结构,这意味着它的实现使得变异操作产生了一个新的副本,只更新了结构的相关部分.Data.HashMap.Map
是一个Data.IntMap.IntMap
内部,反过来实现为帕特里夏树; 查找的时间复杂度为O(min(n,W)),其中W是整数中的位数.它也是"持久的".Data.HashTable.HashTable
是一个实际的哈希表,时间复杂度为O(1),用于查找.但是,它是一个可变数据结构 - 操作是就地完成的 - 所以IO
如果你想使用它,你就会陷入monad.2:在大约4000个键值对的地图/表上进行大量查找,哪个性能最高?
不幸的是,我能给你的最佳答案是"它取决于".如果从字面上理解渐近复杂性,则得到O(log 4000)=约12 Data.Map
,O(min(4000,64))= 64 for Data.HashMap
,O(1)= 1 for Data.HashTable
.但它并没有真正起作用......你必须在代码的上下文中尝试它们.
Dan*_*her 11
Data.Map
和之间的明显区别Data.HashMap
是前者需要键Ord
,后者Hashable
键.大多数公共密钥都是,所以这不是一个决定性的标准.我没有任何经验Data.HashTable
,所以我不能对此发表评论.
API的Data.HashMap
和Data.Map
非常相似,但是Data.Map
导出更多的函数,有些,比如alter
缺少Data.HashMap
,有些是严格和非严格的变体,而Data.HashMap
(我假设你的意思是无序容器的散列图)提供了懒惰和严格的API单独的模块.如果您只使用API的公共部分,那么切换实际上是无痛的.
关于性能Data.HashMap
的无序的容器有漂亮的快速查找,最后我衡量,这显然快于Data.IntMap
或Data.Map
,在特别适用于的(尚未发布)HAMT分支无序的容器.我认为对于插入来说,它或多或少与之相当,但Data.IntMap
有点快Data.Map
,但我对此有点模糊.
对于大多数任务而言,两者都具有足够的性能,对于那些不需要的任务,您可能还需要量身定制的解决方案.考虑到你专门询问查找,我会给出Data.HashMap
优势.
归档时间: |
|
查看次数: |
10897 次 |
最近记录: |