Алгоритм для 'k' 'наиболее часто встречающихся чисел

19

Я искал наиболее эффективный (потоковый ??) алгоритм, который сообщает мне «k» наиболее часто встречающихся элементов в потоке данных в любой момент времени. Этот пост: «Разделяй и властвуй» алгоритмы потока данных заинтересовали меня.

Например, предположим, что есть числа: (4,3,5,1,6,2,4,3,3,8,9,1), и я запрашиваю 3 наиболее часто встречающихся числа (скажем), тогда я должен получить (3,4,1) в качестве ответа.

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

Редактировать: я ищу алгоритм, который всегда дает правильный ответ, а не алгоритм согласования (многие из которых всплывают в результатах поиска), которые так или иначе полагаются на распределение данных

dhruvbird
источник
На самом деле существует три вида алгоритмов: точный, приблизительный и «зависимый от данных». Вы исключили последний тип, но допустимы ли приблизительные алгоритмы, которые НЕ зависят от распределения данных? как я указал, если нет, то у вас проблемы из-за известных нижних границ этой проблемы в настройке потока.
Суреш Венкат
1
Мне было любопытно, могут ли алгоритмы, которые используют ограниченную память (потоковые алгоритмы), действительно делать то, что я хотел, и кажется, что они не могут, как вы указали. Также известен ли точный непотоковый алгоритм, который решает проблему за O (n) гарантированное время наихудшего случая, о котором упоминалось здесь (цитируется в работе Cormode и Hadjileftheriou по предоставленной вами ссылке): citeseerx.ist.psu. edu / viewdoc / summary? doi = 10.1.1.106.7889
dhruvbird

Ответы:

20

k=1o(n)

n/k

kk

Суреш Венкат
источник
1
+1. Я думаю, что> 50% времени алгоритм хорошо известен (алгоритм мажоритарного элемента), как вы упомянули
dhruvbird
2
Благодарность!! Упомянутая вами статья Кормода и Хаджилефтериу цитирует эту статью: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.106.7889, в которой используется та же техника, о которой я думал. Поддерживает 2 связанных списка; один по частоте и внутри него другой список всех элементов с той же частотой.
dhruvbird
Можете ли вы уточнить алгоритм более чем на 50 процентов? а гугл пазл? Я не могу следовать этому неаккуратному рассуждению, поскольку вы только что затронули его и не полностью потратили на «хорошо известную уловку». Благодарю.
Вот ссылка: userweb.cs.utexas.edu/users/misra/scannedPdf.dir/…
Суреш Венкат
Это комментарий (недостаточно репутации) по ссылке Суреша Венката userweb.cs.utexas.edu/users/misra/scannedPdf.dir/… . Похоже, что представленный там алгоритм требует повторного прохождения данных, что недопустимо Вот. На самом деле, я не вижу, как может существовать однопроходный алгоритм с O (1) требованиями к пространству.
TonyK
2

Я также рекомендую прочесть раздел 8.1.3 «Поиск по частоте в потоках данных» следующей книги:

Джавэй Хан, Мишлин Камбер. Data Mining --- Концепции и методы, второе издание, издательство Morgan Kaufmann , 2006.

Он вводит алгоритм, известный как подсчет потерь , который аппроксимирует частые элементы (элементы, чья поддержка выше некоторого min_support ) с произвольной точностью.

Не совсем то, что вы хотите, но я подумал, что это может помочь.

М.С. Дусти
источник
может быть, вы можете помочь мне по моему вопросу здесь
Бен