Advertisement
Guest User

Longest Incresing Subsequence

a guest
Feb 21st, 2011
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 4.74 KB | None | 0 0
  1. -module(lis_dc).
  2. -author({pranjal, pandit}).
  3. -export([test/1]).
  4.  
  5. tree(List) ->
  6.     lists:foldl(
  7.         fun(Elem, AccIn) ->
  8.             {Tree, V} = AccIn,
  9.             case is_tuple(Elem) of
  10.             true ->
  11.                 {OldKey, OldValue} = Elem,
  12.                 {mytrees:insert(OldKey, {OldValue, V}, Tree), V+1};
  13.             false ->
  14.                 {mytrees:insert(Elem, V, Tree), V+1}
  15.             end
  16.         end,
  17.     {mytrees:empty(), 0}, List).
  18.  
  19. insert(Tree, []) -> Tree;
  20. insert(Tree, [{K, V} | Tail]) ->
  21.     insert(mytrees:insert(K, V, Tree), Tail).
  22.  
  23. update(Tree, []) -> Tree;
  24. update(Tree, [{K, V} | Tail]) ->
  25.     update(mytrees:update(K, V, Tree), Tail).
  26.  
  27.  
  28. delete(Tree, []) -> Tree;
  29. delete(Tree, [K | Tail]) ->
  30.     delete(mytrees:delete(K, Tree), Tail).
  31.  
  32. test(List) ->
  33.     {Tree, _} = tree(List),
  34.     {Tree1, _} = tree(mytrees:to_list(Tree)),
  35.     Left = Middle = mytrees:empty(),
  36.     Left1 = mytrees:insert(0, length(List)-1, Left),
  37.     Middle1 = mytrees:insert(lists:append(["0", "-", integer_to_list(length(List)-1)]) , 1, Middle),
  38.     {Result, _,_,_} = lists:foldl(
  39.         fun(Elem, AccIn) ->
  40.             {Listqq, Leftqq, Middleqq, Treeqq} = AccIn,
  41.             {value, {_, B}} = mytrees:lookup(Elem, Treeqq),
  42.             case mytrees:lookup(B, Leftqq) of
  43.             {value, Vzero} ->
  44.                 case mytrees:lookup(Vzero, Leftqq) of
  45.                 {value, Vnext} ->
  46.                     {_, MV}=mytrees:lookup(lists:append(["0", "-", integer_to_list(Vzero)]), Middleqq),
  47.                     L1 = delete( Leftqq, [Vzero] ),
  48.                     L2 = update( L1, [{0, Vnext}] ),
  49.                     M1 = delete( Middleqq, [lists:append(["0", "-", integer_to_list(Vzero)]),
  50.                         lists:append([integer_to_list(Vzero), "-", integer_to_list(Vnext)])] ),
  51.                     M2 = insert( M1, [{lists:append(["0", "-", integer_to_list(Vnext)]), MV+1}] ),
  52.                     {mytrees:insert(Elem, MV, Listqq), L2, M2, Treeqq};
  53.                 {neighbours, {{A1 , B1}, single}} ->
  54.                     {_, MV}=mytrees:lookup(lists:append([integer_to_list(A1), "-", integer_to_list(B1)]), Middleqq),
  55.                     M1 = update( Middleqq, [{lists:append([integer_to_list(A1), "-", integer_to_list(B1)]), MV+1}] ),
  56.                     {mytrees:insert(Elem, MV, Listqq), Leftqq, M1, Treeqq}
  57.                 end;
  58.             {neighbours, {L, R}} ->
  59.                 case {L,R} of
  60.                 {{LK, LV}, single} ->
  61.                     {_, MV}=mytrees:lookup(lists:append([integer_to_list(LK), "-", integer_to_list(LV)]), Middleqq),
  62.                     M1 = delete( Middleqq, [lists:append([integer_to_list(LK), "-", integer_to_list(LV)])] ),
  63.                     M2 = insert( M1, [{lists:append([integer_to_list(LK), "-", integer_to_list(B)]), MV},
  64.                         {lists:append([integer_to_list(B), "-", integer_to_list(LV)]), MV+1}] ),
  65.                     L1 = update( Leftqq, [{LK, B}] ),
  66.                     L2 = insert( L1,  [{B, LV}]),
  67.                     {mytrees:insert(Elem, MV, Listqq), L2, M2, Treeqq};
  68.                 {{LK, LV}, plus_inf} ->
  69.                     {_, MV}=mytrees:lookup(lists:append([integer_to_list(LK), "-", integer_to_list(LV)]), Middleqq),
  70.                     M1 = delete( Middleqq, [lists:append([integer_to_list(LK), "-", integer_to_list(LV)])] ),
  71.                     M2 = insert( M1, [{lists:append([integer_to_list(LK), "-", integer_to_list(B)]), MV},
  72.                         {lists:append([integer_to_list(B), "-", integer_to_list(LV)]), MV+1}] ),
  73.                     L1 = update( Leftqq, [{LK, B}] ),
  74.                     L2 = insert( L1,  [{B, LV}]),
  75.                     {mytrees:insert(Elem, MV, Listqq), L2, M2, Treeqq};
  76.                    
  77.                 {{LK, LV}, {RK, RV}} ->
  78.                     {_, MV}=mytrees:lookup(lists:append([integer_to_list(LK), "-", integer_to_list(LV)]), Middleqq),
  79.                     {_, MV1}=mytrees:lookup(lists:append([integer_to_list(RK), "-", integer_to_list(RV)]), Middleqq),
  80.                     M1 = delete( Middleqq, [lists:append([integer_to_list(LK), "-", integer_to_list(LV)]),
  81.                         lists:append([integer_to_list(RK), "-", integer_to_list(RV)]) ]),
  82.                     M2 = insert( M1, [{lists:append([integer_to_list(LK), "-", integer_to_list(B)]), MV},
  83.                         {lists:append([integer_to_list(B), "-", integer_to_list(RV)]), MV1}] ),
  84.                     L1 = update( Leftqq, [{LK, B}] ),
  85.                     L2 = delete( L1, [RK] ),
  86.                     L3 = insert( L2, [{B, RV}] ),
  87.                     {mytrees:insert(Elem, MV, Listqq), L3, M2, Treeqq}
  88.  
  89.                 end
  90.             end    
  91.         end,
  92.     {mytrees:empty(), Left1, Middle1, Tree1} , List),
  93.     mytrees:to_list(Result).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement