HyperLogLog เป็นโครงสร้างข้อมูลความน่าจะเป็น มันนับจำนวนองค์ประกอบที่แตกต่างในรายการ แต่เมื่อเปรียบเทียบกับวิธีการทำแบบตรงไปตรงมา (มีชุดและการเพิ่มองค์ประกอบในชุด) จะทำแบบนี้ในลักษณะโดยประมาณ
ก่อนที่จะดูว่าอัลกอริทึม HyperLogLog ทำสิ่งนี้ได้อย่างไรคุณต้องเข้าใจว่าทำไมคุณจึงต้องการมัน ปัญหาเกี่ยวกับวิธีที่ตรงไปตรงมาก็คือการใช้O(distinct elements)พื้นที่ ทำไมถึงมีสัญกรณ์ O ขนาดใหญ่ที่นี่แทนที่จะเป็นเพียงแค่องค์ประกอบที่แตกต่างกัน? นี่เป็นเพราะองค์ประกอบอาจมีขนาดแตกต่างกัน องค์ประกอบหนึ่งสามารถเป็นองค์ประกอบอื่น1 "is this big string"ดังนั้นถ้าคุณมีรายการจำนวนมาก (หรือองค์ประกอบจำนวนมาก) มันจะใช้หน่วยความจำมาก
การนับความน่าจะเป็น
เราจะได้ประมาณจำนวนองค์ประกอบที่เป็นเอกลักษณ์ได้อย่างไร สมมติว่าคุณมีสตริงmที่{0, 1}มีความน่าจะเป็นเท่ากัน ความน่าจะเป็นที่จะเริ่มต้นด้วย 0 ด้วย 2 ศูนย์ด้วย k เป็นเท่าไหร่? มันเป็น1/2, และ1/4 1/2^kซึ่งหมายความว่าหากคุณพบสตริงที่มีkเลขศูนย์คุณจะต้องตรวจสอบ2^kองค์ประกอบต่างๆโดยประมาณ ดังนั้นนี่คือจุดเริ่มต้นที่ดี มีรายการองค์ประกอบที่มีการกระจายอย่างเท่าเทียมกันระหว่าง0และ2^k - 1คุณสามารถนับจำนวนสูงสุดของคำนำหน้าที่ใหญ่ที่สุดของศูนย์ในการเป็นตัวแทนไบนารีและสิ่งนี้จะให้ประมาณการที่สมเหตุสมผล
ปัญหาคือการสันนิษฐานว่าการมีตัวเลขที่กระจายอย่างสม่ำเสมอจาก0t 2^k-1นั้นยากเกินกว่าจะทำได้ (ข้อมูลที่เราพบส่วนใหญ่ไม่ใช่ตัวเลขแทบจะไม่กระจายเท่า ๆ กันและสามารถอยู่ระหว่างค่าใดก็ได้ แต่การใช้ฟังก์ชัน hashing ที่ดีคุณสามารถสันนิษฐานได้ว่า เอาท์พุทบิตจะถูกกระจายอย่างเท่าเทียมกันและฟังก์ชั่นการแฮ็กส่วนใหญ่มีเอาต์พุตระหว่าง0และ2^k - 1( SHA1ให้ค่าระหว่าง0และ2^160) ดังนั้นสิ่งที่เราประสบความสำเร็จจนถึงตอนนี้คือเราสามารถประมาณจำนวนองค์ประกอบที่ไม่ซ้ำกันด้วยความสำคัญสูงสุดของkบิตlog(k)บิตขนาดหนึ่งจำนวนข้อเสียคือเรามีความแปรปรวนอย่างมากในการประเมินของเราสิ่งดีๆที่เราเกือบสร้างขึ้นกระดาษนับความน่าจะเป็นของปี 1984 (มันค่อนข้างฉลาดกว่าที่คาดไว้ แต่ก็ยังใกล้กัน)
LogLog
ก่อนที่จะเดินหน้าต่อไปเราต้องเข้าใจว่าทำไมประมาณการครั้งแรกของเราจึงไม่ดีนัก เหตุผลที่อยู่เบื้องหลังก็คือการเกิดขึ้นแบบสุ่มขององค์ประกอบ 0 คำนำหน้าความถี่สูงสามารถทำให้เสียทุกอย่าง วิธีหนึ่งในการปรับปรุงคือการใช้ฟังก์ชั่นแฮชจำนวนมากนับจำนวนสูงสุดสำหรับฟังก์ชั่นแฮชแต่ละตัว นี่เป็นแนวคิดที่ยอดเยี่ยมซึ่งจะปรับปรุงการประมาณการ แต่กระดาษ LogLogใช้แนวทางที่แตกต่างกันเล็กน้อย (อาจเป็นเพราะการแฮ็ชมีราคาแพง)
พวกเขาใช้แฮชหนึ่งอัน แต่แบ่งออกเป็นสองส่วน หนึ่งเรียกว่าฝากข้อมูล (จำนวนถังทั้งหมด2^x) และอีกอัน - โดยทั่วไปเหมือนกับแฮชของเรา มันยากสำหรับฉันที่จะได้รับสิ่งที่เกิดขึ้นดังนั้นฉันจะยกตัวอย่าง สมมติคุณมีสององค์ประกอบและฟังก์ชันแฮชของคุณซึ่งจะช่วยให้รูปแบบค่า0การ2^10ผลิต 2 ค่า: และ344 387คุณตัดสินใจที่จะมี 16 ถัง ดังนั้นคุณมี:
0101 011000 bucket 5 will store 1
0110 000011 bucket 6 will store 4
การมีที่เก็บมากขึ้นทำให้คุณลดความแปรปรวน (คุณใช้พื้นที่เพิ่มขึ้นเล็กน้อย แต่ก็ยังเล็กอยู่) การใช้ทักษะทางคณิตศาสตร์พวกเขาสามารถหาจำนวนข้อผิดพลาด (ซึ่งก็คือ1.3/sqrt(number of buckets))
HyperLogLog
HyperLogLogไม่แนะนำแนวคิดใหม่ใด ๆ แต่ส่วนใหญ่ใช้คณิตศาสตร์เป็นจำนวนมากเพื่อปรับปรุงการประมาณการก่อนหน้านี้ นักวิจัยพบว่าหากคุณลบ 30% ของจำนวนที่มากที่สุดออกจากที่เก็บข้อมูลคุณจะปรับปรุงการประมาณการได้อย่างมีนัยสำคัญ พวกเขายังใช้อัลกอริทึมอื่นสำหรับหมายเลขเฉลี่ย กระดาษเป็นคณิตศาสตร์หนัก
และฉันต้องการจบด้วยกระดาษล่าสุดซึ่งแสดงอัลกอริทึม hyperLogLog รุ่นปรับปรุง (จนถึงตอนนี้ฉันยังไม่มีเวลาที่จะเข้าใจอย่างถ่องแท้ แต่ภายหลังฉันจะปรับปรุงคำตอบนี้)