Я помню, что слышал о следующем алгоритме несколько лет назад, но не могу найти ссылки на него в Интернете. Он идентифицирует верхние элементы k (или сильные нападающие) в потоке данных n элементов, используя только счетчики m . Это особенно полезно для поиска наиболее популярных поисковых терминов, злоумышленников в сети и т. Д. При использовании минимального объема памяти.
Алгоритм: для каждого элемента
- Если элемент еще не имеет счетчика и счетчиков <<i> m , создайте счетчик для элемента и установите значение 1.
- В противном случае, если элемент имеет счетчик, увеличьте его.
- Иначе, если элемент не имеет счетчика и счетчиков> m , уменьшить существующий счетчик c . Если c достигает 0, замените его соответствующий элемент текущим элементом. ( c - это индекс в списке существующих счетчиков, где c увеличивается в циклическом порядке для каждого элемента, который достигает этого шага.)
Я нашел много других подобных алгоритмов (многие из которых перечислены, хотя и не описаны, в этой статье википедии о алгоритмах потоковой передачи ), но не этот.
Мне особенно нравится это, потому что это так же просто реализовать, как и описать.
Но я хотел бы узнать больше о его вероятностных характеристиках - если меня интересуют только первые 100 элементов, какой эффект дает использование 1000 счетчиков вместо 100?