9
Приближённый подсчёт количества уникальных элементов Иван Комаров 24 мая 2013 г.

DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Embed Size (px)

Citation preview

Page 1: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Приближённый подсчёт количества уникальных элементов

Иван Комаров

24 мая 2013 г.

Page 2: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Дневная аудитория Твиттера

Задача

241 млн твитов (без реплаев и ретвитов) за день; файл с никами авторовзанимает 2,7 ГБ. Сколько различных авторов среди всех авторов?

Возможные подходы к решениюПамять, КБ Время, с Результат

Сортировка ≈ 6 500 000 601 32639778Хеш-таблица ≈ 1 800 000 230 32639778Приближённый алгоритм 4 43 32945522

Ошибка приближённого алгоритма

|32945522− 32639778|32639778

≈ 0.0093 < 1%

Page 3: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Phillipe Flajolet

Probabilistic Counting Algorithms for Data Base Applications, 1985

Page 4: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Собираем массив битов

Идея

По входным элементам 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

Наблюдение

Повторяющиеся элементы никак не меняют массив битов.

Page 5: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

И зачем мы это сделали?

Пример массива битов для 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

Page 6: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Первый подход

Утверждение

E(R) ≈ log2 𝜙N

Магическая константа

𝜙 =e𝛾√2

∞∏︁p=1

(︂2p + 1

2p

)︂(−1)OneCount(p)

≈ 0.77351*

Вычисляем N

N =2R

𝜙

*(см. адский матан в статье)

Page 7: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Проблема

Среднеквадратичное отклонение слишком велико: 𝜎(R) ≈ 1, 12

Page 8: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Стохастическое усреднение

Решение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

.

Page 9: DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементов - Комаров Иван

Если вы ещё не заснули, поднимите руку

Для заинтересовавшихся

В твиттере @i_komarov и ЖЖ dfyz будет опубликована ссылка наподборку материалов по теме.