Skip to content

Commit 00f41e8

Browse files
author
polvorin
authored
Avoid cuadratic complexity, keep track of current list length (#3)
Do not calculate length(List) on each item addition, keep a track of the current buffer length.
1 parent e0756fd commit 00f41e8

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/kpl_agg.erl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@
5757
%% A set of keys, mapping each key to a unique index.
5858
-record(keyset, {
5959
rev_keys = [] :: list(binary()), %% list of known keys in reverse order
60-
key_to_index = maps:new() :: map() %% maps each known key to a 0-based index
60+
rev_keys_length = 0 :: non_neg_integer(), %% length of the rev_keys list
61+
key_to_index = maps:new() :: map() %% maps each known key to a 0-based index
6162
}).
6263

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

279280
get_or_add_key(undefined, KeySet) ->
280281
{undefined, KeySet};
281-
get_or_add_key(Key, #keyset{rev_keys = RevKeys, key_to_index = KeyToIndex} = KeySet) ->
282+
get_or_add_key(Key, #keyset{rev_keys = RevKeys, rev_keys_length = Length, key_to_index = KeyToIndex} = KeySet) ->
282283
case maps:get(Key, KeyToIndex, not_found) of
283284
not_found ->
284-
Index = length(RevKeys),
285285
NewKeySet = KeySet#keyset{
286286
rev_keys = [Key | RevKeys],
287-
key_to_index = maps:put(Key, Index, KeyToIndex)
287+
rev_keys_length = Length + 1,
288+
key_to_index = maps:put(Key, Length, KeyToIndex)
288289
},
289-
{Index, NewKeySet};
290+
{Length, NewKeySet};
290291
Index ->
291292
{Index, KeySet}
292293
end.
293294

294295

295-
potential_index(Key, #keyset{rev_keys = RevKeys, key_to_index = KeyToIndex} = _KeySet) ->
296+
potential_index(Key, #keyset{rev_keys_length = Length, key_to_index = KeyToIndex} = _KeySet) ->
296297
case maps:get(Key, KeyToIndex, not_found) of
297-
not_found -> length(RevKeys);
298+
not_found -> Length;
298299
Index -> Index
299300
end.
300301

0 commit comments

Comments
 (0)