Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(lis_dc).
- -author({pranjal, pandit}).
- -export([test/1]).
- tree(List) ->
- lists:foldl(
- fun(Elem, AccIn) ->
- {Tree, V} = AccIn,
- case is_tuple(Elem) of
- true ->
- {OldKey, OldValue} = Elem,
- {mytrees:insert(OldKey, {OldValue, V}, Tree), V+1};
- false ->
- {mytrees:insert(Elem, V, Tree), V+1}
- end
- end,
- {mytrees:empty(), 0}, List).
- insert(Tree, []) -> Tree;
- insert(Tree, [{K, V} | Tail]) ->
- insert(mytrees:insert(K, V, Tree), Tail).
- update(Tree, []) -> Tree;
- update(Tree, [{K, V} | Tail]) ->
- update(mytrees:update(K, V, Tree), Tail).
- delete(Tree, []) -> Tree;
- delete(Tree, [K | Tail]) ->
- delete(mytrees:delete(K, Tree), Tail).
- test(List) ->
- {Tree, _} = tree(List),
- {Tree1, _} = tree(mytrees:to_list(Tree)),
- Left = Middle = mytrees:empty(),
- Left1 = mytrees:insert(0, length(List)-1, Left),
- Middle1 = mytrees:insert(lists:append(["0", "-", integer_to_list(length(List)-1)]) , 1, Middle),
- {Result, _,_,_} = lists:foldl(
- fun(Elem, AccIn) ->
- {Listqq, Leftqq, Middleqq, Treeqq} = AccIn,
- {value, {_, B}} = mytrees:lookup(Elem, Treeqq),
- case mytrees:lookup(B, Leftqq) of
- {value, Vzero} ->
- case mytrees:lookup(Vzero, Leftqq) of
- {value, Vnext} ->
- {_, MV}=mytrees:lookup(lists:append(["0", "-", integer_to_list(Vzero)]), Middleqq),
- L1 = delete( Leftqq, [Vzero] ),
- L2 = update( L1, [{0, Vnext}] ),
- M1 = delete( Middleqq, [lists:append(["0", "-", integer_to_list(Vzero)]),
- lists:append([integer_to_list(Vzero), "-", integer_to_list(Vnext)])] ),
- M2 = insert( M1, [{lists:append(["0", "-", integer_to_list(Vnext)]), MV+1}] ),
- {mytrees:insert(Elem, MV, Listqq), L2, M2, Treeqq};
- {neighbours, {{A1 , B1}, single}} ->
- {_, MV}=mytrees:lookup(lists:append([integer_to_list(A1), "-", integer_to_list(B1)]), Middleqq),
- M1 = update( Middleqq, [{lists:append([integer_to_list(A1), "-", integer_to_list(B1)]), MV+1}] ),
- {mytrees:insert(Elem, MV, Listqq), Leftqq, M1, Treeqq}
- end;
- {neighbours, {L, R}} ->
- case {L,R} of
- {{LK, LV}, single} ->
- {_, MV}=mytrees:lookup(lists:append([integer_to_list(LK), "-", integer_to_list(LV)]), Middleqq),
- M1 = delete( Middleqq, [lists:append([integer_to_list(LK), "-", integer_to_list(LV)])] ),
- M2 = insert( M1, [{lists:append([integer_to_list(LK), "-", integer_to_list(B)]), MV},
- {lists:append([integer_to_list(B), "-", integer_to_list(LV)]), MV+1}] ),
- L1 = update( Leftqq, [{LK, B}] ),
- L2 = insert( L1, [{B, LV}]),
- {mytrees:insert(Elem, MV, Listqq), L2, M2, Treeqq};
- {{LK, LV}, plus_inf} ->
- {_, MV}=mytrees:lookup(lists:append([integer_to_list(LK), "-", integer_to_list(LV)]), Middleqq),
- M1 = delete( Middleqq, [lists:append([integer_to_list(LK), "-", integer_to_list(LV)])] ),
- M2 = insert( M1, [{lists:append([integer_to_list(LK), "-", integer_to_list(B)]), MV},
- {lists:append([integer_to_list(B), "-", integer_to_list(LV)]), MV+1}] ),
- L1 = update( Leftqq, [{LK, B}] ),
- L2 = insert( L1, [{B, LV}]),
- {mytrees:insert(Elem, MV, Listqq), L2, M2, Treeqq};
- {{LK, LV}, {RK, RV}} ->
- {_, MV}=mytrees:lookup(lists:append([integer_to_list(LK), "-", integer_to_list(LV)]), Middleqq),
- {_, MV1}=mytrees:lookup(lists:append([integer_to_list(RK), "-", integer_to_list(RV)]), Middleqq),
- M1 = delete( Middleqq, [lists:append([integer_to_list(LK), "-", integer_to_list(LV)]),
- lists:append([integer_to_list(RK), "-", integer_to_list(RV)]) ]),
- M2 = insert( M1, [{lists:append([integer_to_list(LK), "-", integer_to_list(B)]), MV},
- {lists:append([integer_to_list(B), "-", integer_to_list(RV)]), MV1}] ),
- L1 = update( Leftqq, [{LK, B}] ),
- L2 = delete( L1, [RK] ),
- L3 = insert( L2, [{B, RV}] ),
- {mytrees:insert(Elem, MV, Listqq), L3, M2, Treeqq}
- end
- end
- end,
- {mytrees:empty(), Left1, Middle1, Tree1} , List),
- mytrees:to_list(Result).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement