[erlang-questions] How can I implement a priority queue with Erlang?

Jeffrey Chen bitcowboy@REDACTED
Fri Aug 31 07:09:24 CEST 2007


It's a good idea of exchang left and right branch in each merge
operate to trying to balance the tree.

On 8/31/07, Pierpaolo Bernardi <olopierpa@REDACTED> wrote:
> On 8/30/07, Jeffrey Chen <bitcowboy@REDACTED> wrote:
> > I'm trying to implement a priority queue using heap struct. But I
> > can't do that efficient. Can anybody help me? I'll post my code below.
>
> For priority queues, I use the one below.
>
> HTH
>
> P.
>
> %%% File    : skew.erl
> %%% Author  :  <olopierpa@REDACTED>
> %%% Description : Skew heaps
> %%% Created : 30 May 2003 by Pierpaolo BERNARDI <olopierpa@REDACTED>
>
> -module(skew).
>
> -export([empty/0,
>         is_empty/1,
>         min/1,
>         delete_min/1,
>         insert/2,
>         merge/2
>         ]).
>
>
> %% Aggressive inlining - will increase code size.
> %%-compile(inline).
> %%-compile({inline_size,100}).
>
> %%-define(TESTING,true).
>
> -ifdef(TESTING).
> -compile(export_all).
> -endif.
>
> -define(THE_EMPTY_HEAP, the_empty_heap).
>
> empty() ->
>    ?THE_EMPTY_HEAP.
>
> is_empty(?THE_EMPTY_HEAP) -> true;
> is_empty(_) -> false.
>
> min({X, _, _}) -> X.
>
> delete_min({_X, A, B}) -> merge(A, B).
>
> insert(X, A) ->
>    merge({X, ?THE_EMPTY_HEAP, ?THE_EMPTY_HEAP}, A).
>
> merge(A, ?THE_EMPTY_HEAP) ->
>    A;
> merge(?THE_EMPTY_HEAP, B) ->
>    B;
> merge({MA, LA, RA}, B={MB, _, _}) when MA =< MB ->
>    {MA, RA, merge(LA, B)};
> merge(A, {M, L, R}) ->
>    {M, R, merge(L, A)}.
>
>
> -ifdef(TESTING).
>
> test() ->
>    test(100000, 1, 1000000000).
>
> test(N, Da, A) ->
>    pblib:randomize(),
>    Q = fa_random_heap(N, Da, A),
>    scrivi_heap(Q).
>
> misura() ->
>    T0 = pblib:mo(),
>    _Q = fa_random_heap(100000, 1, 1000000000),
>    T1 = pblib:mo(),
>    T1 - T0.
>
> fa_random_heap(Quanti, Da, A) ->
>    fa_random_heap(Quanti, Da, A, empty()).
>
> fa_random_heap(0, _Da, _A, Q) ->
>    Q;
> fa_random_heap(N, Da, A, Q) ->
>    fa_random_heap(N-1, Da, A, insert(random:uniform(A- Da+1)+Da-1, Q)).
>
>
> fa_random_heap2(Quanti, Da, A) ->
>    fa_random_heap2(Quanti, Da, A, empty()).
>
> fa_random_heap2(0, _Da, _A, Q) ->
>    Q;
> fa_random_heap2(N, Da, A, Q) ->
>    fa_random_heap2(N-1, Da, A, insert(1000000-N, Q)).
>
> scrivi_heap(Q) ->
>    case is_empty(Q) of
>        true ->
>            ok;
>        false ->
>            M = min(Q),
>            Q1 = delete_min(Q),
>            io:fwrite("~s\n", [pblib:ultospun(M)]),
>            scrivi_heap(Q1)
>    end.
>
> profo(?THE_EMPTY_HEAP) ->
>    0;
> profo({_, A, B}) ->
>    1 + lists:max([profo(A),
>                   profo(B)]).
>
> dimen(?THE_EMPTY_HEAP) ->
>    0;
> dimen({_, A, B}) ->
>    1 + dimen(A) + dimen(B).
>
> -endif.
>


-- 
Victory won't come to me, unless I go to it.



More information about the erlang-questions mailing list