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
คุณสามารถนับจำนวนสูงสุดของคำนำหน้าที่ใหญ่ที่สุดของศูนย์ในการเป็นตัวแทนไบนารีและสิ่งนี้จะให้ประมาณการที่สมเหตุสมผล
ปัญหาคือการสันนิษฐานว่าการมีตัวเลขที่กระจายอย่างสม่ำเสมอจาก0
t 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 รุ่นปรับปรุง (จนถึงตอนนี้ฉันยังไม่มีเวลาที่จะเข้าใจอย่างถ่องแท้ แต่ภายหลังฉันจะปรับปรุงคำตอบนี้)