Upload
it-people
View
620
Download
1
Embed Size (px)
Citation preview
Приближённый подсчёт количества уникальных элементов
Иван Комаров
24 мая 2013 г.
Дневная аудитория Твиттера
Задача
241 млн твитов (без реплаев и ретвитов) за день; файл с никами авторовзанимает 2,7 ГБ. Сколько различных авторов среди всех авторов?
Возможные подходы к решениюПамять, КБ Время, с Результат
Сортировка ≈ 6 500 000 601 32639778Хеш-таблица ≈ 1 800 000 230 32639778Приближённый алгоритм 4 43 32945522
Ошибка приближённого алгоритма
|32945522− 32639778|32639778
≈ 0.0093 < 1%
Phillipe Flajolet
Probabilistic Counting Algorithms for Data Base Applications, 1985
Собираем массив битов
Идея
По входным элементам Elems ⊂ 𝒰 с помощью хеш-функцииℋ : 𝒰 → {0, 1}32 вычисляем массив битов Bitmap.
Bitmapi = 1 ⇐⇒ ∃e ∈ Elems : ntz(ℋ(e)) = i
Здесь ntz(x) — позиция самой младшей единицы в x (позициинумеруются с нуля).
Примерℋ(monster_tweet) = 11011001000101110101110110101010ℋ(thebloodyhippy) = 00110100111010111111100000110101ℋ(chiomajoyce) = 11011001000101110101110110101010ℋ(pyrocrewfx) = 10110101000011010010111001010100ℋ(zackkingkhan) = 10000100011110000101100001100000Bitmap = 00000000000000000000000000100111
Наблюдение
Повторяющиеся элементы никак не меняют массив битов.
И зачем мы это сделали?
Пример массива битов для 216 уникальных авторов0
00
10
20
30
40
50
60
70
80
90
100
111
120
130
141
151
161
171
181
191
201
211
221
231
241
251
261
271
281
291
301
31
R
Если среди элементов было N уникальных, то мы можем оценить log2N спомощью позиции самого младшего нуля в Bitmap (назовём её R).
P{ntz(x) = 0} = 12
P{ntz(x) = 1} = 14
P{ntz(x) = 2} = 18
· · ·P{ntz(x) = k} = 1
2k+1
Первый подход
Утверждение
E(R) ≈ log2 𝜙N
Магическая константа
𝜙 =e𝛾√2
∞∏︁p=1
(︂2p + 1
2p
)︂(−1)OneCount(p)
≈ 0.77351*
Вычисляем N
N =2R
𝜙
*(см. адский матан в статье)
Проблема
Среднеквадратичное отклонение слишком велико: 𝜎(R) ≈ 1, 12
Стохастическое усреднение
РешениеM = 2k независимых массивов битов, k младших битов хеша определяютномер массива.
Пример для M = 8
ℋ(thebloodyhippy) = 00110100111010111111100000110101
0 . . . 0 0 . . . 0 0 . . . 0 0 . . . 0 0 . . . 0 0 . . . 0 0 . . . 0 0 . . . 0
0 1 2 3 4 5 6 7
Вычисляем N
N =M
𝜙2R1+R2+...+RM
M
Стандартная ошибка приблизительно равна 0,78√M
.
Если вы ещё не заснули, поднимите руку
Для заинтересовавшихся
В твиттере @i_komarov и ЖЖ dfyz будет опубликована ссылка наподборку материалов по теме.