我想知道Erlang OTP dict
模块是否实现为哈希表,在这种情况下它是否提供了这样的性能?
平均案例
Search: O(1 + n/k)
Insert: O(1)
Delete: O(1 + n/k)
最坏情况
Search: O(n)
Insert: O(1)
Delete: O(n)
答案 0 :(得分:7)
因为dict模块是使用内置数据类型(元组和列表)在Erlang中实现的,并且是非破坏性的,也就是说,每次“更新”实际上都会创建一个稍微重写的新版本的前一个dict,时间复杂性永远不会比对数更好(实现必须使用某种树),但细节可能随实现而变化。
当条目数量变大时,当前的实现(已存在多年)实际上并不能很好地扩展。作者(Robert Virding)最近一直在试验其他树实现,例如2-3树,并且有可能在将来的版本中更改dict模块的默认实现。见http://erlang.org/pipermail/erlang-questions/2012-June/067311.html
如果您对此类事情感兴趣,可能需要阅读有关纯功能数据结构的更多信息。这似乎是一个很好的起点:http://en.wikipedia.org/wiki/Purely_functional(特别是与冈崎论文的链接)。
答案 1 :(得分:3)
嗯,这里有点离开我的联盟。首先,它是一个哈希表,但我不确定执行时间。
查看dict模块的源代码(lib / stdlib / src / dict.erl),显示:
%% We use the dynamic hashing techniques by Per-�ke Larsson as
%% described in "The Design and Implementation of Dynamic Hashing for
%% Sets and Tables in Icon" by Griswold and Townsend. Much of the
%% terminology comes from that paper as well.
关于该论文的Google搜索显示了与相关PDF的许多链接,您可以参考实施的技术细节(此外,源代码中有更多可能有用的注释)
希望它对此有所了解!