在lg(n)时间内在Erlang中进行二进制搜索

时间:2010-09-08 08:02:40

标签: erlang

我正在搜索在Erlang中进行二进制搜索的可能工作,我发现http://ruslanspivak.com/2007/08/15/my-erlang-binary-search/但我想知道博客中的解决方案是否在O(lg n)中运行。现在,因为二进制搜索的重复是:T(n)= T(n / 2)+ c,它给我一个O(lg n)的执行时间。

因为在C数组中,您可以在O(1)时间内访问任何元素。但是在erlang中,如果访问列表中间需要cn时间,则二进制搜索在线性整体时间内运行与线性搜索一样差。

我遇到了列表:第n / 2个BIF用于查找列表中的第n个项目,但我不确定其执行时间。

有何评论?

2 个答案:

答案 0 :(得分:6)

在Erlang中有一些允许O(1)访问的数据结构:ETS表,元组和二进制文件。

现在,它们都不适合二进制搜索。 ETS表支持从头开始搜索,否则,在返回结果时数据会被复制到您的进程,这可能不是您的用例的最佳选择。

元组允许O(1)访问element/2,但修改它们有一定的开销(这就是阵列模块使用元组树的原因)。

然后你有二进制文件(<<1,2,3,4,5>>),它允许类似于指针算术的东西,如下例所示:

1> Sorted = <<$a,$b,$c,$d,$e,$f,$g,$h>>.
<<"abcdefgh">>
2> <<_:3/binary, X:1/binary, _/binary>> = Sorted.
<<"abcdefgh">>
3> X.
<<"d">>

但是,在构建二进制文件时预测性能有点粗略,如果您的值在二进制文件中表示时具有不同类型和不同大小,则这种指针算法更难实现。

您最好的选择可能是使用值列表,对其进行排序,然后使用list_to_tuple/1使用element/2进行导航。

但我强烈建议您使用树进行搜索;使用gb_tree模块构建平衡树并仍然可以进行O(log N)搜索可能要简单得多。

答案 1 :(得分:-1)

nth是O(n)。使用array module作为常量访问数据结构(数组与C一样 - 差不多)。