Я помню, как несколько лет назад слышал о следующем алгоритме, но не могу найти на него упоминания в Интернете. Он идентифицирует верхние элементы k (или сильные удары) в потоке данных из n элементов, используя только счетчики m. Это особенно полезно для поиска популярных поисковых запросов, нарушителей сетевых правил и т. Д. При минимальном использовании памяти.
Алгоритм: для каждого элемента,
- If the element does not already have a counter and counters < m, create a counter for the element and initialize to 1.
- Else if the element does have a counter, increment it.
- Else if the element does not have a counter and counters > m, decrement an existing counter c. If c reaches 0, replace its corresponding element, with the current element. (c is an index into the list of existing counters, where c increases in round robin fashion for each element that reaches this step.)
Я нашел много других подобных алгоритмов (многие из которых перечислены, но не описаны в этой статье в Википедии о алгоритмы потоковой передачи), но не этот. Мне это особенно нравится, потому что его так же просто реализовать, как и описать.
Но я хотел бы узнать больше о его вероятностных характеристиках - если меня интересуют только 100 лучших предметов, какой эффект дает использование 1000 жетонов вместо 100 жетонов?