एक हाइपरलॉग एक संभावना डेटा संरचना है । यह एक सूची में विभिन्न तत्वों की संख्या को गिनता है। लेकिन इसे करने के एक सीधे तरीके की तुलना में (एक सेट होने और सेट में तत्वों को जोड़ना) यह एक अनुमानित तरीके से करता है।
यह देखने से पहले कि हाइपरलॉग एल्गोरिथ्म कैसे करता है, किसी को यह समझना होगा कि आपको इसकी आवश्यकता क्यों है। सीधे तरीके से समस्या यह है कि यह O(distinct elements)
अंतरिक्ष की खपत करता है। सिर्फ अलग-अलग तत्वों के बजाय यहां एक बड़ा O अंकन क्यों है? ऐसा इसलिए है क्योंकि तत्व विभिन्न आकारों के हो सकते हैं। एक तत्व 1
दूसरा तत्व हो सकता है "is this big string"
। इसलिए यदि आपके पास एक विशाल सूची (या तत्वों की एक विशाल धारा) है तो यह बहुत अधिक स्मृति लेगा।
संभाव्य गणना
कई अनूठे तत्वों की एक उचित अनुमान कैसे प्राप्त कर सकते हैं? मान लें कि आपके पास लंबाई की एक स्ट्रिंग है m
जो {0, 1}
समान संभावना के साथ होती है। क्या संभावना है कि यह 0 के साथ शुरू होगा, 2 शून्य के साथ, के शून्य के साथ? यह है 1/2
, 1/4
और 1/2^k
। इसका मतलब है कि यदि आपने k
शून्य के साथ एक स्ट्रिंग का सामना किया है , तो आपने लगभग 2^k
तत्वों के माध्यम से देखा है। तो यह एक अच्छा शुरुआती बिंदु है। उन तत्वों की एक सूची है, जो समान रूप से वितरित किए जाते हैं 0
और 2^k - 1
आप बाइनरी प्रतिनिधित्व में शून्य के सबसे बड़े उपसर्ग की अधिकतम संख्या की गणना कर सकते हैं और यह आपको एक उचित अनुमान देगा।
समस्या यह है कि 0
टी से समान रूप से वितरित संख्या होने की धारणा 2^k-1
को प्राप्त करना बहुत कठिन है (हमारे द्वारा सामना किया गया डेटा ज्यादातर संख्या नहीं है, लगभग कभी समान रूप से वितरित नहीं किया जा सकता है, और किसी भी मूल्य के बीच हो सकता है। लेकिन एक अच्छे हैशिंग फ़ंक्शन का उपयोग करके आप यह मान सकते हैं। आउटपुट बिट्स समान रूप से वितरित किए जाएंगे और अधिकांश हैशिंग फ़ंक्शन के बीच आउटपुट होते हैं 0
और 2^k - 1
( SHA1 आपको बीच 0
- बीच में मान देते हैं 2^160
)। इसलिए हमने अब तक जो हासिल किया है, वह यह है कि हम k
केवल स्टोर करके बिट्स की अधिकतम कार्डिनैलिटी के साथ अद्वितीय तत्वों की संख्या का अनुमान लगा सकते हैं। आकार log(k)
बिट्स की एक संख्या । नकारात्मक पक्ष यह है कि हमारे अनुमान में एक विशाल विचरण है। एक अच्छी बात जो हमने लगभग बनाई है1984 की संभाव्य मतगणना कागज़ (यह अनुमान के साथ थोड़ी सी होशियार है, लेकिन फिर भी हम करीब हैं)।
LogLog
आगे बढ़ने से पहले, हमें यह समझना होगा कि हमारा पहला अनुमान इतना महान क्यों नहीं है। इसके पीछे कारण यह है कि उच्च आवृत्ति 0-उपसर्ग तत्व की एक यादृच्छिक घटना सब कुछ खराब कर सकती है। इसे सुधारने का एक तरीका कई हैश फ़ंक्शंस का उपयोग करना है, प्रत्येक हैश फ़ंक्शंस के लिए अधिकतम गणना करना और अंत में उन्हें औसत करना है। यह एक उत्कृष्ट विचार है, जो अनुमान में सुधार करेगा, लेकिन लॉगलॉग पेपर ने थोड़ा अलग दृष्टिकोण का उपयोग किया (शायद इसलिए हैशिंग बहुत महंगा है)।
उन्होंने एक हैश का उपयोग किया लेकिन इसे दो भागों में विभाजित किया। एक को बाल्टी कहा जाता है (बाल्टी की कुल संख्या 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% निकालते हैं तो आप अनुमान में काफी सुधार करते हैं। उन्होंने औसत संख्या के लिए एक और एल्गोरिथ्म का भी उपयोग किया। पेपर गणित-भारी है।
और मैं हाल ही में एक पेपर के साथ समाप्त करना चाहता हूं, जो हाइपरलॉग एल्गोरिथ्म का एक उन्नत संस्करण दिखाता है (अब तक मेरे पास इसे पूरी तरह से समझने का समय नहीं था, लेकिन शायद बाद में मैं इस उत्तर को सुधारूंगा )।