Мы получаем эти файлы данных размером 50 ГБ, состоящие из 16 байтовых кодов, и я хочу найти какой-либо код, который имеет значение 1/2% времени или больше. Есть ли способ сделать это за один проход по данным?
Изменить: существует множество кодов - возможно, что каждый код отличается.
ЭПИЛОГ. Я выбрал Дариуса Бэкона как лучший ответ, потому что я считаю, что лучший алгоритм - это модификация элемента большинства, с которым он связан. Алгоритм большинства должен быть модифицируемым, чтобы использовать только крошечный объем памяти - например, 201 код, чтобы получить 1/2%, я думаю. В основном вы просто проводите поток, подсчитывая до 201 различных кодов. Как только вы найдете 201 отдельный код, вы бросаете один из каждого кода (вычитаете 1 из счетчиков, забывая все, что становится 0). В конце вы сбросили максимум N/201 раз, поэтому любой код, который появляется больше времени, чем все еще должен быть.
Но это двухпроходный алгоритм, а не один. Вам понадобится второй проход, чтобы подсчитать количество кандидатов. На самом деле легко убедиться, что любое решение этой проблемы должно использовать как минимум 2 прохода (первая партия элементов, которые вы загружаете, может быть различной, и один из этих кодов может составлять ровно 1/2%)
Спасибо за помощь!