Skip to content

Commit

Permalink
Avoid cuadratic complexity, keep track of current list length (#3)
Browse files Browse the repository at this point in the history
Do not calculate length(List) on each item addition,  keep a track
of the current buffer length.
  • Loading branch information
polvorin authored Jun 11, 2018
1 parent e0756fd commit 00f41e8
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions src/kpl_agg.erl
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@
%% A set of keys, mapping each key to a unique index.
-record(keyset, {
rev_keys = [] :: list(binary()), %% list of known keys in reverse order
key_to_index = maps:new() :: map() %% maps each known key to a 0-based index
rev_keys_length = 0 :: non_neg_integer(), %% length of the rev_keys list
key_to_index = maps:new() :: map() %% maps each known key to a 0-based index
}).

%% Internal state of a record aggregator. It stores an aggregated record that
Expand Down Expand Up @@ -278,23 +279,23 @@ is_key(Key, #keyset{key_to_index = KeyToIndex} = _KeySet) ->

get_or_add_key(undefined, KeySet) ->
{undefined, KeySet};
get_or_add_key(Key, #keyset{rev_keys = RevKeys, key_to_index = KeyToIndex} = KeySet) ->
get_or_add_key(Key, #keyset{rev_keys = RevKeys, rev_keys_length = Length, key_to_index = KeyToIndex} = KeySet) ->
case maps:get(Key, KeyToIndex, not_found) of
not_found ->
Index = length(RevKeys),
NewKeySet = KeySet#keyset{
rev_keys = [Key | RevKeys],
key_to_index = maps:put(Key, Index, KeyToIndex)
rev_keys_length = Length + 1,
key_to_index = maps:put(Key, Length, KeyToIndex)
},
{Index, NewKeySet};
{Length, NewKeySet};
Index ->
{Index, KeySet}
end.


potential_index(Key, #keyset{rev_keys = RevKeys, key_to_index = KeyToIndex} = _KeySet) ->
potential_index(Key, #keyset{rev_keys_length = Length, key_to_index = KeyToIndex} = _KeySet) ->
case maps:get(Key, KeyToIndex, not_found) of
not_found -> length(RevKeys);
not_found -> Length;
Index -> Index
end.

Expand Down

0 comments on commit 00f41e8

Please sign in to comment.