प्रतिनिधि इंटरव्यू विषय

कोडिंग इंटरव्यू: आप एक स्टैटिक Xor Filter कैसे लागू करेंगे और बिल्ड विफलता की व्याख्या कैसे करेंगे?

कोडिंगकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

बैच निर्माण और सदस्यता प्रश्नों (membership queries) के साथ एक स्टैटिक Xor Filter लागू करें। तीन-खंड लेआउट, पीलिंग कतार, फिंगरप्रिंट असाइनमेंट, बिल्ड पुनः प्रयास, फॉल्स-पॉजिटिव दर, और इन-प्लेस विलोपन (in-place deletion) असमर्थित क्यों है, इसकी व्याख्या करें।

प्रॉम्प्ट और संदर्भ

बैच निर्माण और सदस्यता प्रश्नों (membership queries) के साथ एक स्टैटिक Xor Filter लागू करें। तीन-खंड लेआउट, पीलिंग कतार, फिंगरप्रिंट असाइनमेंट, बिल्ड पुनः प्रयास, फॉल्स-पॉजिटिव दर, और इन-प्लेस विलोपन (in-place deletion) असमर्थित क्यों है, इसकी व्याख्या करें।

एक Xor Filter एक स्टैटिक सन्निकट-सदस्यता (approximate-membership) संरचना है: यह प्रत्येक कुंजी के लिए एक छोटा फिंगरप्रिंट संग्रहीत करता है और एक क्वेरी के दौरान तीन स्थितियों पर फिंगरप्रिंट का XOR करता है। शोध से पता चलता है कि यह स्पेस और लुकअप स्पीड पर Bloom और Cuckoo Filters के साथ प्रतिस्पर्धा कर सकता है, लेकिन इसका निर्माण एक पील करने योग्य (peelable) यादृच्छिक हाइपरग्राफ पर निर्भर करता है। एक असफल सीड के लिए पुनर्निर्माण की आवश्यकता होती है, इसलिए यह संरचना बैच निर्माण और उसके बाद केवल-पठनीय (read-only) प्रकाशन के लिए उपयुक्त है।

साक्षात्कारकर्ता क्या मूल्यांकन करता है

साक्षात्कारकर्ता यह जांचता है कि क्या आप तीन ऐरे का निर्माण कर सकते हैं, डुप्लिकेट और एक खाली सेट को संभाल सकते हैं, डिग्री कतार के साथ एक हाइपरग्राफ को पील कर सकते हैं, उल्टे क्रम में फिंगरप्रिंट असाइन कर सकते हैं, निर्माण और क्वेरी के लिए समान हैशिंग का उपयोग कर सकते हैं, फॉल्स पॉजिटिव की गणना कर सकते हैं, विलोपन और अपडेट सीमाओं की व्याख्या कर सकते हैं, और पुनः प्रयासों, पीक मेमोरी और समवर्ती रीड्स (concurrent reads) के बारे में तर्क कर सकते हैं।

स्पष्टीकरण हेतु प्रश्न

डेटासेट और अपडेट मॉडल

कुंजी गणना (key count), डुप्लिकेट नीति, पुनर्निर्माण आवृत्ति, अपडेट विलंबता, और क्या विलोपन अनिवार्य है, इसकी पुष्टि करें। Xor Filters स्टैटिक सेट को लक्षित करते हैं; गतिशील वर्कलोड के लिए Cuckoo Filters या लेयर्ड पुनर्निर्माण की तुलना की जानी चाहिए।

त्रुटि और स्पेस लक्ष्य

स्वीकार्य फॉल्स-पॉजिटिव दर, फिंगरप्रिंट की चौड़ाई, क्या फॉल्स नेगेटिव की अनुमति है, और लुकअप थ्रूपुट बनाम पीक बिल्ड मेमोरी के बीच प्राथमिकता की पुष्टि करें।

कुंजी और हैश सीमा

पुष्टि करें कि क्या कुंजियाँ पूर्णांक, बाइट स्ट्रिंग या संरचित ऑब्जेक्ट हैं; हैश सीड को कैसे संरक्षित (persist) किया जाता है; और क्या क्रॉस-लैंग्वेज कार्यान्वयन के लिए समान बाइट क्रम और सामान्यीकरण की आवश्यकता होती है।

30-सेकंड का उत्तर

“मैं टेबल को तीन खंडों में विभाजित करता हूँ; प्रत्येक कुंजी प्रत्येक खंड में एक स्थिति पर मैप होती है और एक निश्चित-चौड़ाई का फिंगरप्रिंट संग्रहीत करती है। निर्माण के दौरान मैं स्लॉट डिग्री और संबद्ध किनारों (incident edges) को ट्रैक करता हूँ, डिग्री-एक स्लॉट को पील करता हूँ, और यदि किनारे शेष रहते हैं तो एक नए सीड के साथ पुनर्निर्माण करता हूँ। उल्टे पील क्रम में, एक स्लॉट को कुंजी फिंगरप्रिंट XOR अन्य दो स्लॉट मान सौंपे जाते हैं। एक क्वेरी तीन स्थितियों की पुनर्गणना करती है और उनका XOR करती है; समानता का अर्थ है 'संभवतः मौजूद'। तालिका स्टैटिक और सन्निकट है, इसलिए यह सुरक्षित इन-प्लेस विलोपन का समर्थन नहीं करती है।”

चरण-दर-चरण समाधान

चरण 1: लेआउट और फिंगरप्रिंट परिभाषित करें

स्वतंत्र 64-बिट हैश परिणामों से तीन स्थितियाँ और एक निम्न-बिट फिंगरप्रिंट प्राप्त करें। तालिका को लगभग समान खंडों में विभाजित करें और प्रत्येक स्थिति को उसके खंड के भीतर कम करें। शून्य-फिंगरप्रिंट हैंडलिंग को लगातार परिभाषित करें ताकि एक खाली स्लॉट को वास्तविक मान के साथ भ्रमित न किया जा सके।

चरण 2: हाइपरग्राफ डिग्री का निर्माण करें

प्रत्येक कुंजी को तीन स्लॉट जोड़ने वाले हाइपरएज के रूप में समझें। निर्माण के दौरान, प्रत्येक स्लॉट की डिग्री और संबंधित किनारों की सूची संग्रहीत करें, फिर डिग्री-एक स्लॉट को कतार में जोड़ें। पहले कुंजियों को डिडुप्लिकेट करें या सेट सिमेंटिक्स को स्पष्ट रूप से परिभाषित करें; अन्यथा एक ही हाइपरएज को बार-बार गिना जा सकता है।

चरण 3: ग्राफ को पील करें

डिग्री-एक स्लॉट को पॉप करें, उसके अद्वितीय किनारे को ढूंढें, और किनारे, अद्वितीय स्लॉट और अन्य दो स्लॉट को रिकॉर्ड करें। किनारे को हटा दें और तीनों स्लॉट की डिग्री घटाएं; नए डिग्री-एक स्लॉट को कतार में जोड़ें। यदि कतार खाली होने के बाद भी न हटाए गए किनारे शेष रहते हैं, तो इस सीड ने एक गैर-पील करने योग्य ग्राफ तैयार किया है।

चरण 4: उल्टे क्रम में फिंगरप्रिंट असाइन करें

रिकॉर्ड किए गए किनारों को उल्टे पील क्रम में प्रोसेस करें। अद्वितीय स्लॉट को कुंजी फिंगरप्रिंट XOR अन्य दो स्लॉट के वर्तमान मानों पर सेट करें। तीनों स्लॉट का XOR करने पर वह कुंजी फिंगरप्रिंट प्राप्त होता है; अलिखित स्लॉट शून्य का योगदान करते हैं।

चरण 5: लुकअप लागू करें

लुकअप निर्माण के समान सीड, स्थिति फ़ंक्शन और फिंगरप्रिंट फ़ंक्शन का उपयोग करता है, तीनों खंडों को पढ़ता है, और उनका XOR करता है। समानता का अर्थ केवल "संभवतः मौजूद" है, सदस्यता का प्रमाण नहीं; कॉलर को डेटाबेस या सटीक सेट के विरुद्ध हिट्स का समाधान करना होगा।

text
build(keys):
  repeat with a new seed:
    edges = positions_and_fingerprints(keys, seed)
    queue = all degree-1 slots
    order = peel(edges, queue)
    if order contains every edge:
      table = zeroed slots
      for edge in reverse(order):
        table[edge.unique] = edge.fp XOR table[edge.other1] XOR table[edge.other2]
      return seed, table
  fail after bounded retries

contains(key):
  a, b, c = positions(key, seed)
  return table[a] XOR table[b] XOR table[c] == fingerprint(key)

चरण 6: विफलता और संसाधनों को संभालें

बिल्ड विफलता लुकअप फॉल्स नेगेटिव नहीं है; इसका मतलब है कि इस सीड के ग्राफ में कोई पूर्ण पील क्रम नहीं है। पुनः प्रयासों को सीमित करें, सीड या तालिका का आकार बदलें, और आंशिक तालिका प्रकाशित करने के बजाय एक स्पष्ट त्रुटि लौटाएं। डिग्री ऐरे, किनारे सूचियाँ और पील स्टैक पीक बिल्ड मेमोरी को अंतिम केवल-पठनीय तालिका से बड़ा बनाते हैं।

चरण 7: अपडेट और सत्यापन की व्याख्या करें

तालिका पूर्ण कुंजी सेट पर समीकरणों को हल करती है, इसलिए एक प्रविष्टि या विलोपन अन्य कुंजियों के XOR संबंधों को तोड़ सकता है। पुनर्निर्माण करके, दो संस्करणों को परमाणु रूप से (atomically) स्वैप करके, या छोटे फिल्टर को लेयर करके अपडेट करें। एक खाली सेट, एक कुंजी, डुप्लिकेट, हैश टकराव, असफल बिल्ड, सीरियलाइज़ेशन रिकवरी, फॉल्स पॉजिटिव और समवर्ती रीड-ओनली लुकअप का परीक्षण करें।

आदर्श उत्तर

मैं कुंजी सेट को तीन-खंड वाले 3-समान हाइपरग्राफ में मैप करूंगा, इसे एक डिग्री कतार के साथ पील करूंगा, और उल्टे पील क्रम में छोटे फिंगरप्रिंट असाइन करूंगा। लुकअप तीन स्लॉट रीड और XOR निष्पादित करता है, इसलिए यह निरंतर समय (constant time) है, लेकिन परिणाम सन्निकट सदस्यता है। बिल्ड विफलता का अर्थ है कि वर्तमान सीड पील करने योग्य नहीं है; मैं एक सीमा के तहत एक नए सीड के साथ पुनः प्रयास करूंगा और सीमा के बाद प्रकाशन को अस्वीकार कर दूंगा। चूंकि तालिका प्रत्येक कुंजी पर निर्भर करती है, इन-प्लेस प्रविष्टि या विलोपन असुरक्षित है; प्रोडक्शन अपडेट एक नई तालिका का पुनर्निर्माण करते हैं और इसे परमाणु रूप से स्वैप करते हैं। संस्करण के साथ सीड, तालिका का आकार, फिंगरप्रिंट की चौड़ाई और बाइट क्रम को बनाए रखें, फिर एक सटीक सेट के विरुद्ध फॉल्स पॉजिटिव को मापें।

सामान्य गलतियाँ

  • गलती: निर्माण विफल होने के बाद आंशिक तालिका लौटाना। → यह क्यों विफल होता है: अप्रसंस्कृत किनारे फॉल्स नेगेटिव बना सकते हैं। → सुधार: सीड या तालिका का आकार बदलें और प्रत्येक किनारे को असाइन किए जाने के बाद ही प्रकाशित करें।
  • गलती: लुकअप पर एक अलग सीड या सेगमेंट मैपिंग का उपयोग करना। → यह क्यों विफल होता है: बिल्ड और लुकअप विभिन्न स्लॉट को संदर्भित करते हैं। → सुधार: सीड, सेगमेंट सीमाओं और हैश कार्यान्वयन को बनाए रखें और उनका संस्करण बनाएं।
  • गलती: एक सकारात्मक लुकअप को सटीक सदस्यता मानना। → यह क्यों विफल होता है: छोटे फिंगरप्रिंट फॉल्स पॉजिटिव उत्पन्न करते हैं। → सुधार: फ़िल्टर का उपयोग प्री-चेक के रूप में करें, फिर सटीक स्टोरेज से परामर्श करें।
  • गलती: इन-प्लेस विलोपन का समर्थन करना। → यह क्यों विफल होता है: साझा स्लॉट अन्य XOR समीकरणों में भाग लेते हैं। → सुधार: पुनर्निर्माण करें, दो संस्करणों का उपयोग करें, या एक गतिशील फ़िल्टर चुनें।

फॉलो-अप और उत्तर

एक ऐरे के बजाय तीन खंडों का उपयोग क्यों करें?

तीन खंड प्रत्येक किनारे को प्रत्येक क्षेत्र में एक स्लॉट देते हैं, जिससे पील करने योग्य हाइपरग्राफ निर्माण और निरंतर-समय लुकअप व्यावहारिक हो जाता है। सटीक अनुपात और लोड कारक का बेंचमार्क किया जाना चाहिए।

आप फिंगरप्रिंट की चौड़ाई कैसे चुनते हैं?

छोटे फिंगरप्रिंट स्थान को कम करते हैं लेकिन फॉल्स पॉजिटिव को बढ़ाते हैं। स्वतंत्र कुंजियों के साथ विफलता दर को मापें और परिणामी सटीक-स्टोरेज लुकअप लागत को मेमोरी बचत के विरुद्ध संतुलित करें।

क्या सीड पुनः प्रयास परिणामों को अस्थिर बनाते हैं?

तालिका बदलती है, लेकिन लुकअप तब पुनरुत्पादित होते हैं जब अंतिम सीड, संस्करण और तालिका को एक साथ बनाए रखा जाता है। निर्माण मेटाडेटा को उसी रिलीज़ मेनिफेस्ट में शामिल करें।

आप इसके बजाय Bloom या Cuckoo Filter कब चुनेंगे?

लगातार प्रविष्टि, विलोपन, गिनती या ऑनलाइन आकार बदलना एक गतिशील फ़िल्टर का पक्ष लेता है। Xor Filters स्टैटिक, बैच-निर्मित सेटों के लिए सबसे मजबूत हैं जहां कॉम्पैक्ट केवल-पठनीय लुकअप मायने रखता है।

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें