Advertisement
Guest User

Untitled

a guest
Jun 21st, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 3.77 KB | None | 0 0
  1. -module(assoc).
  2. -export([new/0,to_list/1,from_list/1,hash/1,find/2,store/3,is_key/2,erase/2,fold/3,map/2,filter/2,size/1]).
  3.  
  4. new()->[].
  5.  
  6. % Получение списка пар {Key,List} из хэш-дерева
  7. to_list([])->[];
  8. to_list(HTree)->to_list_elem(HTree, []).
  9. to_list_elem([], List)->List;
  10. to_list_elem({Key,Value,Left,Right,_}, List)->to_list_elem(Left, to_list_elem(Right, [{Key,Value}|List])).
  11.  
  12.  
  13. % Получения хэш-дерева из списка пар {Key,Value}
  14. from_list(List)->from_list(List,[]).
  15. from_list([],HTree)->HTree;
  16. from_list([{Key, Value} | Tl],HTree)->from_list(Tl,store(Key,Value,HTree)).
  17.  
  18.  
  19. % Собирает все результаты применения F к каждой паре {Key,Value} в список
  20. fold(_Fun, Z, []) -> Z;
  21. fold(Fun, Z, {Key, Value, Left, Right, Hash}) -> fold(Fun, Z, to_list({Key, Value, Left, Right,Hash}));
  22. fold(Fun, Z, [{Key, Value}|List])->Fun(Key, Value, fold(Fun, Z, List)).
  23.  
  24.  
  25. % Проверяет, есть ли в хэш-дереве элемент с данным ключом
  26. is_key(Key,HTree)->
  27.     case find(Key,HTree) of
  28.         {ok,_} -> true;
  29.         _ -> false
  30.     end.
  31.  
  32.  
  33. % Собирает удаляет элементы не удовлетворяющие функции F
  34. filter(_, [])-> [];
  35. filter(F, {Key, Value, Left, Right, Hash})->
  36.     case F(Key,Value) of
  37.         true -> {Key, Value, filter(F,Left), filter(F, Right), Hash};
  38.         _ -> filter(F,erase(Key,{Key, Value, Left, Right, Hash}))
  39.     end.
  40.  
  41.  
  42. % Производит отображение функции дерева по функции F
  43. map(_,[])->[];
  44. map(F,{Key, Value, Left, Right, Hash})->
  45.     {Key, F(Key, Value),map(F, Left),map(F,Right),Hash}.
  46.  
  47.  
  48. % Интерфейс для size, возвращает размерность хэш-дерева
  49. size(Htree)->
  50.     sizeof(to_list(Htree),0).
  51.  
  52. sizeof([],I)->I;
  53. sizeof([{_,_}|Tl],I)->
  54.     sizeof(Tl, incr(I,1)).
  55.  
  56. incr(X,Y)->X+Y.
  57.  
  58.  
  59. % Интерфейс для get_elem, возвращает значение по ключу
  60. find(Key,HTree)->
  61.     get_elem(HTree,{Key,hash(Key)}).
  62.  
  63. get_elem([],_)->error;
  64. get_elem({Key,Value, _,_,Hash},{Key,Hash})->
  65.     {ok,Value};
  66. get_elem({_,_, Left,_,Hash1},{_,Hash}=KH) when Hash1>=Hash->
  67.     get_elem(Left,KH);
  68. get_elem({_,_,_,Right,Hash1},{_,Hash}=KH) when Hash1<Hash->
  69.     get_elem(Right,KH).
  70.  
  71.  
  72. % Интерфейс для put_elem, вставляет в словарь элемент {Key, Value}
  73. store(Key, Value, HTree)->
  74.     put_elem(HTree, {Key, hash(Key), Value}).
  75.  
  76. put_elem({Key,_, Left,Right,Hash},{Key,Hash,NewValue})->
  77.     {Key,NewValue, Left,Right,Hash};
  78. put_elem({Key,Value, Left,Right,Hash1},{_,Hash,_}=KHV) when Hash1>=Hash->
  79.     {Key,Value, put_elem(Left,KHV),Right,Hash1};
  80. put_elem({Key,Value, Left,Right,Hash1},{_,Hash,_}=KHV) when Hash1<Hash->
  81.     {Key,Value,Left,put_elem(Right,KHV),Hash1};
  82. put_elem([],{Key,Hash,NewValue})->
  83.     {Key,NewValue,[],[],Hash}.
  84.  
  85.  
  86. % Интерфейс для del_h, удаляет элемент с указанным ключом
  87. erase(Key,HTree)->
  88.     del_h(HTree,{Key,hash(Key)}).
  89.  
  90. del_h([],_)->[];
  91. del_h({Key,_, [],Right,Hash},{Key,Hash})->
  92.     Right;
  93. del_h({Key,_, Left,[],Hash},{Key,Hash})->
  94.     Left;
  95. del_h({Key,_, Left,Right,Hash},{Key,Hash})->
  96.     {LKey,LValue, _,_,LHash} = rightest(Left),
  97.     NLeft = del_h(Left,{LKey,LHash}),
  98.     {LKey,LValue, NLeft,Right,LHash};
  99. del_h({Key,Value, Left,Right,Hash1},{_,Hash}=KH) when Hash1>=Hash->
  100.     {Key,Value,del_h(Left,KH),Right,Hash1};
  101. del_h({Key,Value, Left,Right,Hash1},{_,Hash}=KH) when Hash1<Hash->
  102.     {Key,Value,Left,del_h(Right,KH),Hash1}.
  103.  
  104.  
  105. % Самый правый элемент поддерева
  106. rightest([])->[];
  107. rightest({_,_,_,[],_}=S)->S;
  108. rightest({_,_,_,Right,_})->rightest(Right).
  109.  
  110.  
  111. % Вычисляет хэш ключа
  112. hash(S)->erlang:phash(S,10000).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement