HyperLogLog adalah struktur data probabilistik . Itu menghitung jumlah elemen berbeda dalam daftar. Tetapi dibandingkan dengan cara mudah untuk melakukannya (memiliki set dan menambahkan elemen ke set) itu melakukan ini dengan cara perkiraan.
Sebelum melihat bagaimana algoritma HyperLogLog melakukan ini, kita harus memahami mengapa Anda membutuhkannya. Masalahnya dengan cara langsung adalah bahwa ia menghabiskan O(distinct elements)
ruang. Mengapa ada notasi O besar di sini, bukan hanya elemen yang berbeda? Ini karena elemen dapat memiliki ukuran yang berbeda. Satu elemen bisa menjadi 1
elemen lain "is this big string"
. Jadi, jika Anda memiliki daftar besar (atau aliran elemen besar) itu akan memakan banyak memori.
Penghitungan Probabilistik
Bagaimana seseorang bisa mendapatkan estimasi yang masuk akal dari sejumlah elemen unik? Asumsikan bahwa Anda memiliki untaian panjangm
yang terdiri dari {0, 1}
dengan probabilitas yang sama. Berapa probabilitas bahwa ia akan mulai dengan 0, dengan 2 nol, dengan k nol? Ya 1/2
, 1/4
dan 1/2^k
. Ini berarti bahwa jika Anda telah menemukan string dengan k
nol, Anda telah mendekati 2^k
elemen. Jadi ini adalah titik awal yang baik. Memiliki daftar elemen yang didistribusikan secara merata 0
dan 2^k - 1
Anda dapat menghitung jumlah maksimum awalan nol terbesar dalam representasi biner dan ini akan memberi Anda perkiraan yang masuk akal.
Masalahnya adalah asumsi memiliki angka yang terdistribusi secara merata dari 0
t 2^k-1
terlalu sulit untuk dicapai (data yang kami temui sebagian besar bukan angka, hampir tidak pernah terdistribusi secara merata, dan dapat berada di antara nilai apa pun. Tetapi menggunakan fungsi hashing yang baik, Anda dapat mengasumsikan bahwa bit keluaran akan didistribusikan secara merata dan sebagian besar fungsi hashing memiliki keluaran di antaranya0
dan 2^k - 1
( SHA1 memberi Anda nilai di antara 0
dan 2^160
). Jadi apa yang telah kami capai sejauh ini adalah bahwa kami dapat memperkirakan jumlah elemen unik dengan kardinalitas maksimum k
bit dengan menyimpan hanya satu jumlah log(k)
bit ukuran . Kelemahannya adalah kita memiliki variasi besar dalam perkiraan kita. Suatu hal yang keren yang hampir kita buatMakalah penghitungan probabilistik 1984 (ini sedikit lebih pintar dengan perkiraan, tapi kami masih dekat).
LogLog
Sebelum melangkah lebih jauh, kita harus memahami mengapa perkiraan pertama kita tidak terlalu bagus. Alasan di balik itu adalah bahwa satu kejadian acak elemen awalan 0 frekuensi tinggi dapat merusak segalanya. Salah satu cara untuk memperbaikinya adalah dengan menggunakan banyak fungsi hash, hitung maks untuk masing-masing fungsi hash dan pada akhirnya rata-rata keluar. Ini adalah ide yang bagus, yang akan meningkatkan estimasi, tetapi makalah LogLog menggunakan pendekatan yang sedikit berbeda (mungkin karena hashing agak mahal).
Mereka menggunakan satu hash tetapi membaginya menjadi dua bagian. Satu disebut ember (jumlah total ember 2^x
) dan lainnya - pada dasarnya sama dengan hash kita. Sulit bagi saya untuk mendapatkan apa yang sedang terjadi, jadi saya akan memberikan contoh. Asumsikan Anda memiliki dua elemen dan fungsi hash Anda yang memberikan bentuk nilai 0
untuk 2^10
menghasilkan 2 nilai: 344
dan 387
. Anda memutuskan untuk memiliki 16 ember. Jadi kamu punya:
0101 011000 bucket 5 will store 1
0110 000011 bucket 6 will store 4
Dengan memiliki lebih banyak ember Anda mengurangi varians (Anda menggunakan sedikit lebih banyak ruang, tetapi masih kecil). Dengan menggunakan keterampilan matematika, mereka dapat mengukur kesalahan (yaitu 1.3/sqrt(number of buckets)
).
HyperLogLog
HyperLogLog tidak memperkenalkan ide-ide baru, tetapi kebanyakan menggunakan banyak matematika untuk meningkatkan perkiraan sebelumnya. Para peneliti telah menemukan bahwa jika Anda menghapus 30% dari jumlah terbesar dari ember, Anda secara signifikan meningkatkan taksiran. Mereka juga menggunakan algoritma lain untuk rata-rata angka. Makalah ini sangat matematika.
Dan saya ingin menyelesaikan dengan makalah baru-baru ini, yang menunjukkan versi yang ditingkatkan dari algoritma hyperLogLog (sampai sekarang saya tidak punya waktu untuk sepenuhnya memahaminya, tapi mungkin nanti saya akan memperbaiki jawaban ini).