Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,41 @@
|
|||
module(lcs).
|
||||
-compile(export_all).
|
||||
|
||||
lcs_length(S,T) ->
|
||||
{L,_C} = lcs_length(S,T,dict:new()),
|
||||
L.
|
||||
|
||||
lcs_length([]=S,T,Cache) ->
|
||||
{0,dict:store({S,T},0,Cache)};
|
||||
lcs_length(S,[]=T,Cache) ->
|
||||
{0,dict:store({S,T},0,Cache)};
|
||||
lcs_length([H|ST]=S,[H|TT]=T,Cache) ->
|
||||
{L,C} = lcs_length(ST,TT,Cache),
|
||||
{L+1,dict:store({S,T},L+1,C)};
|
||||
lcs_length([_SH|ST]=S,[_TH|TT]=T,Cache) ->
|
||||
case dict:is_key({S,T},Cache) of
|
||||
true -> {dict:fetch({S,T},Cache),Cache};
|
||||
false ->
|
||||
{L1,C1} = lcs_length(S,TT,Cache),
|
||||
{L2,C2} = lcs_length(ST,T,C1),
|
||||
L = lists:max([L1,L2]),
|
||||
{L,dict:store({S,T},L,C2)}
|
||||
end.
|
||||
|
||||
lcs(S,T) ->
|
||||
{_,C} = lcs_length(S,T,dict:new()),
|
||||
lcs(S,T,C,[]).
|
||||
|
||||
lcs([],_,_,Acc) ->
|
||||
lists:reverse(Acc);
|
||||
lcs(_,[],_,Acc) ->
|
||||
lists:reverse(Acc);
|
||||
lcs([H|ST],[H|TT],Cache,Acc) ->
|
||||
lcs(ST,TT,Cache,[H|Acc]);
|
||||
lcs([_SH|ST]=S,[_TH|TT]=T,Cache,Acc) ->
|
||||
case dict:fetch({S,TT},Cache) > dict:fetch({ST,T},Cache) of
|
||||
true ->
|
||||
lcs(S,TT,Cache, Acc);
|
||||
false ->
|
||||
lcs(ST,T,Cache,Acc)
|
||||
end.
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
77> lcs:lcs("thisisatest","testing123testing").
|
||||
"tsitest"
|
||||
78> lcs:lcs("1234","1224533324").
|
||||
"1234"
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
lcs(Xs0, Ys0) ->
|
||||
CacheKey = {lcs_cache, Xs0, Ys0},
|
||||
case get(CacheKey)
|
||||
of undefined ->
|
||||
Result =
|
||||
case {Xs0, Ys0}
|
||||
of {[], _} -> []
|
||||
; {_, []} -> []
|
||||
; {[Same | Xs], [Same | Ys]} ->
|
||||
[Same | lcs(Xs, Ys)]
|
||||
; {[_ | XsRest]=XsAll, [_ | YsRest]=YsAll} ->
|
||||
A = lcs(XsRest, YsAll),
|
||||
B = lcs(XsAll , YsRest),
|
||||
case length(A) > length(B)
|
||||
of true -> A
|
||||
; false -> B
|
||||
end
|
||||
end,
|
||||
undefined = put(CacheKey, Result),
|
||||
Result
|
||||
; Result ->
|
||||
Result
|
||||
end.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
-module(lcs).
|
||||
|
||||
%% API exports
|
||||
-export([
|
||||
lcs/2
|
||||
]).
|
||||
|
||||
%%====================================================================
|
||||
%% API functions
|
||||
%%====================================================================
|
||||
|
||||
lcs(A, B) ->
|
||||
{LCS, _Cache} = get_lcs(A, B, [], #{}),
|
||||
lists:reverse(LCS).
|
||||
|
||||
%%====================================================================
|
||||
%% Internal functions
|
||||
%%=====================================================
|
||||
|
||||
get_lcs(A, B, Acc, Cache) ->
|
||||
case maps:find({A, B, Acc}, Cache) of
|
||||
{ok, LCS} -> {LCS, Cache};
|
||||
error ->
|
||||
{NewLCS, NewCache} = compute_lcs(A, B, Acc, Cache),
|
||||
{NewLCS, NewCache#{ {A, B, Acc} => NewLCS }}
|
||||
end.
|
||||
|
||||
compute_lcs(A, B, Acc, Cache) when length(A) == 0 orelse length(B) == 0 ->
|
||||
{Acc, Cache};
|
||||
compute_lcs([Token |ATail], [Token |BTail], Acc, Cache) ->
|
||||
get_lcs(ATail, BTail, [Token |Acc], Cache);
|
||||
compute_lcs([_AToken |ATail]=A, [_BToken |BTail]=B, Acc, Cache) ->
|
||||
{LCSA, CacheA} = get_lcs(A, BTail, Acc, Cache),
|
||||
{LCSB, CacheB} = get_lcs(ATail, B, Acc, CacheA),
|
||||
LCS = case length(LCSA) > length(LCSB) of
|
||||
true -> LCSA;
|
||||
false -> LCSB
|
||||
end,
|
||||
{LCS, CacheB}.
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
48> lcs:lcs("thisisatest", "testing123testing").
|
||||
"tsitest"
|
||||
Loading…
Add table
Add a link
Reference in a new issue