хранить лучшие k результатов из count-min-sketch - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужно хранить топ k наиболее часто встречающихся элементов в потоке. Для оценки частоты я использую алгоритмы count-min-sketch. Мой поток состоит из ключей (в виде строки). Таким образом, в основном каждый раз, когда я сталкиваюсь с новым ключом в своем потоке, я вычисляю частоту текущего ключа, просматривая структуру данных count-min-sketch. Однако я не могу хранить топ k наиболее часто используемых ключей.

Моей первой идеей было хранить их в мини-куче с фиксированным размером k. И я храню [частоту, ключ] внутри этой минимальной кучи с частотой компаратора. Таким образом, каждый раз, когда я получаю частоту ключа, я пытаюсь увидеть, превышает ли размер кучи k, если это так, тогда я сравниваю частоту текущего ключа с верхней (самой маленькой) частотой в минимальной куче, если мой текущий ключ Частота выше, чем когда я открываю верх и вставляю свой ключ в кучу.

Однако я понимаю, что min-heap - это не набор, что означает, что он допускает дублирование. Допустим, у меня есть очень горячая клавиша, и я продолжаю считать ее в потоке, поэтому каждый раз, когда я вставляю эту [частоту, ключ] в кучу, в итоге моя куча будет заполнена одним и тем же ключом, только разными частотами.

Так что мне интересно, есть ли хороший способ сохранить верхний k более частый элемент в count-min-sketch.

1 Ответ

0 голосов
/ 01 ноября 2018

Имеет смысл поддерживать хэш-карту из [key,<frequency,position>] пар, уже находящихся в куче. position относится к индексу ключа в куче (при условии, что куча основана на массиве). Когда ключ приходит, вы проверяете 2 условия:
ключ находится в хэш-карте
частота изменилась

Если оба значения верны, вы найдете ключ в куче за O(1) раз, поскольку его позиция уже сохранена в хэш-карте, затем измените частоту ключа и, в зависимости от того, увеличена или уменьшена частота, вы делаете вниз или всплеск от этой позиции (O(logn)). После изменения позиции вы обновите запись в хэш-карте для этого ключа, указав новые значения частоты и положения.

Если 1-е значение ложно, вы следуете обычной логике, то есть сравниваете ключ с корнем, если куча заполнена, а частота ключа больше частоты корня, вы извлекаете корень из кучи и удаляете его из hashmap, и тем временем вставьте ключ в кучу и хэш-карту.

Если ключ находится в хэш-карте, но его частота не была изменена, вы ничего не делаете.

...