Erlang中如何加快“双栈排队”[duplicate]

gkn4icbw  于 2022-12-16  发布在  Erlang
关注(0)|答案(2)|浏览(182)

此问题在此处已有答案

How to efficiently read thousand of lines from STDIN in Erlang?(2个答案)
两年前关闭了。
这是一个常见的编程问题,我用Python、Java等语言做过,没有问题。下面的Erlang(我刚刚开始学习)运行得很慢(10^5次操作需要大约44秒的用户时间),我不知道为什么。
正如HackerRank上所写的,程序从stdin中取出一行,用一个整数表示后面的操作数,后面的每一行应该是1 X(入队X)、2(出队并丢弃)或3(查看并打印队列中的下一个值)。
lists:reverse/1是否使用错误?

-module(two_stacks).
%% API exports
-export([main/1]).

enqueue(Num, F, B) ->
    {[Num | F], B}.
dequeue(F, []) ->
    [_|B] = lists:reverse(F),
    {[], B};
dequeue(F, [_|B]) -> 
    {F, B}.

peek(F, []) ->
    [H|T] = lists:reverse(F),
    io:format(H),
    {[], [H|T]};

peek(F, [H|T]) ->
    io:format(H),
    {F, [H|T]}.

dispatchOperation(_, {F, B}) ->
    [Code|Line] = io:get_line(""),

    case Code of
        49 -> 
            [_|Num] = Line,
            enqueue(Num, F, B);
        50 -> dequeue(F, B);
        51 -> peek(F, B)
    end.

main(_) ->
    {Count, _} = string:to_integer(io:get_line("")),
    _ = lists:foldl(fun dispatchOperation/2, {[], []}, lists:seq(1, Count)),
    erlang:halt(0).

字符串
https://www.hackerrank.com/challenges/queue-using-two-stacks/problem

zqdjd7g9

zqdjd7g91#

您运行的是escript吗?如果是这样的话,您应该在那里添加一个-mode(compile).,否则它将以解释模式运行脚本。
此外,您还可以比较使用queue模块(使用两个堆栈实现)的时间

c90pui9n

c90pui9n2#

问题出在解析输入的方式上,请参见46493207
因为所有的输入都是整数,所以我可以使用这里使用的相同技术。完整的代码是:

-module(solution).
-export([main/0]).

enqueue(Num, F, B) ->
    {[Num | F], B}.
dequeue(F, []) ->
    [_|B] = lists:reverse(F),
    {[], B};
dequeue(F, [_|B]) -> 
    {F, B}.

peek(F, []) ->
    [H|T] = lists:reverse(F),
    io:format("~B~n", [H]),
    {[], [H|T]};

peek(F, [H|T]) ->
    io:format("~B~n", [H]),
    {F, [H|T]}.

run(_, {F, B}) ->
    Line = io:get_line(""),
    [X| Y] = binary:split(Line, [<<$\s>>, <<$\n>>], [global]),
    Code = binary_to_integer(X),

    case Code of
        1 -> 
            Num = binary_to_integer(lists:nth(1, Y)),
            enqueue(Num, F, B);
        2 -> dequeue(F, B);
        3 -> peek(F, B)
    end.

main() ->
    ok = io:setopts(standard_io, [binary]),
    {Count, _} = string:to_integer(io:get_line("")),
    _ = lists:foldl(fun run/2, {[], []}, lists:seq(1, Count)),
    erlang:halt(0).

相关问题