我正在为haskell中的翻译器实现一个符号表。我的问题是,在从关联列表转换为trie / map / hashmap之前,表应该在平均用例上有多大,假设我的键是小字符串或字节串?我不想使用哈希表,因为从io Monad中解包似乎在效率方面倒退了一步(在这里插入haskell效率笑话:))
编辑:打开关于哈希表的评论。根据最近的实施,它们与其他选项一样好。
答案 0 :(得分:3)
我认为你应该总是*使用(哈希)地图来做任何事情而不仅仅是一个快速的脚本。
第一个参数,使用设计点中的最佳数据类型。地图缩放到更大的尺寸。即使对于规模较小的关联列表,如果它实际上同样快,也不会让我感到惊讶(并且几乎可以预期)。这种感觉背后的原因来自于1,Set
使用nub
,他们发现即使是小型列表,它也不会慢。此外,Maps还有一些与它们相关的有用功能,可用于操作它们。对于它们不存在的列表,或者您必须自己编写它们(它们可能不会那么快)。
第二个论点,如果不需要,不要优化。正如kqr在他对你的回答的评论中指出的那样,在有证据表明你需要它之前不要进行优化(并且你真的需要优化这个列表/地图)。要记住这一点的问题是这样一个小字典发生的频率是多少?那么它是否会为你的节目总时间贡献很多时间。或者执行是否已经很小,以至于没有明显的差异?
*:我现在能想到的一个例外是你想创建一个无限的关联列表。
P.S。有关列表(和公司政策)可能出现问题的好文章,请参阅http://thedailywtf.com/Articles/Coding-Practices-MUST-Be-Followed.aspx