2011-08-29 20 views
10

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

प्रश्न था: एक फ़ंक्शन लिखें, जो पूर्णांक (अनियंत्रित) की धारा प्रदान करता है, एक संतुलित खोज वृक्ष बनाता है। अब, आप इनपुट समाप्त होने की प्रतीक्षा नहीं कर सकते (यह एक धारा है), इसलिए आपको फ्लाई पर पेड़ को संतुलित करने की आवश्यकता है।

मेरा पहला जवाब लाल-काले पेड़ का उपयोग करना था, जो निश्चित रूप से नौकरी करता है, लेकिन मुझे लगता है कि उन्होंने मुझे 15 मिनट में लाल काले पेड़ को लागू करने की उम्मीद नहीं की थी।

तो, क्या इस समस्या के लिए कोई आसान समाधान है, मुझे पता नहीं है?

धन्यवाद,

डेव

+0

क्या आप पूर्णांक के बारे में कुछ भी जानते हैं (तथ्य यह है कि वे बिना छेड़छाड़ किए गए हैं)? क्या आपको किसी तत्व को देखने वाले किसी व्यक्ति के जवाब में बीएसटी बनाने की अनुमति है, या क्या आपके पास हर समय बीएसटी उपलब्ध होना चाहिए? क्या आप कई अलग-अलग बीएसटी बना सकते हैं, या आपको केवल एक बनाना है? – templatetypedef

+0

ठीक है, शायद आप नियमों की काफी उदार व्याख्या के तहत एक लाल काले पेड़ का उपयोग कर सकते हैं। चूंकि 15 मिनट बहुत समय नहीं है, अगर आपको एसटीएल कंटेनर और एल्गोरिदम का उपयोग करने की तरह कुछ मूर्खतापूर्ण करने की इजाजत है, तो आप केवल एक std :: map बना सकते हैं, फिर ऑब्जेक्ट्स को सीधे इसमें डालें (लेकिन मुझे यह स्वीकार करना होगा कि यह है मूल रूप से धोखाधड़ी)। – Mikola

+0

प्रश्न जैसा प्रतीत होता है, इनपुट या उपयोग पर कोई अन्य धारणा नहीं थी। मैंने सोचा कि शायद इसके लिए एक आम एल्गोरिदम है और मुझे इसके बारे में पता नहीं है। जाहिर है, वे चाहते थे कि मैं एक संतुलित पेड़ को लागू करूँ क्योंकि मुझे पता है। उसके साथ अच्छा भाग्य। – Dave

उत्तर

3

AA Trees थोड़ा लाल काले पेड़ों से सरल हैं, लेकिन मैं अपने सिर के ऊपर से एक को लागू नहीं कर सका।

+0

मुझे लगता है कि यह सबसे अच्छा जवाब है। यदि आप स्मृति के लिए एक संतुलित पेड़ एल्गोरिदम प्रतिबद्ध करने जा रहे हैं तो यह सबसे सरल है। यह एक दोगुना अच्छा जवाब है क्योंकि एए-ट्री के लिए हटाएं कार्यान्वित करने के लिए सबसे जटिल है और प्रश्न को कार्यक्षमता को हटाने की आवश्यकता नहीं लगती है। –

9

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

  1. नए जोड़े गए तत्व को असाइन करने के लिए यादृच्छिक संख्या चुनें।
  2. मानक बीएसटी सम्मिलन का उपयोग कर बीएसटी में तत्व डालें।
  3. जबकि नव-सम्मिलित तत्व की कुंजी अपने माता-पिता की कुंजी से अधिक है, तो अपने तत्व के ऊपर नया तत्व लाने के लिए पेड़ रोटेशन करें।

वह अंतिम चरण केवल एकमात्र कठिन है, लेकिन यदि आपके पास व्हाइटबोर्ड पर काम करने के लिए कुछ समय था, तो मुझे पूरा यकीन है कि आप इस साक्षात्कार में इस पर उड़ान भर सकते हैं।

एक और विकल्प जो काम कर सकता है splay tree का उपयोग करना होगा। यह एक और प्रकार का तेज़ बीएसटी है जिसे यह मान लिया जा सकता है कि आपके पास मानक बीएसटी सम्मिलन समारोह और वृक्षारोपण करने की क्षमता है। महत्वपूर्ण बात यह है कि, पेप्ले पेड़ अत्यंत अभ्यास में तेज़ी से हैं, और यह ज्ञात है कि वे कम से कम किसी अन्य स्थिर बाइनरी खोज पेड़ के रूप में अच्छे (एक स्थिर कारक के भीतर) हैं।

"खोज पेड़" के अर्थ के आधार पर, आप पूर्णांक की तलाश के लिए अनुकूलित कुछ संरचनाओं में पूर्णांक को संग्रहीत करने पर भी विचार कर सकते हैं। उदाहरण के लिए, आप एक पूर्णांक को स्टोर करने के लिए bitwise trie का उपयोग कर सकते हैं, जो मशीन शब्द में बिट्स की संख्या के अनुपात में लुकअप के समय में लुकअप का समर्थन करता है। बिट्स को देखने के लिए इसे रिकर्सिव फ़ंक्शन का उपयोग करके काफी अच्छी तरह से कार्यान्वित किया जा सकता है, और किसी भी प्रकार के घूर्णन की आवश्यकता नहीं होती है। यदि आपको पंद्रह मिनट में कार्यान्वयन को विस्फोट करने की आवश्यकता है, और यदि साक्षात्कारकर्ता आपको मानक बाइनरी खोज पेड़ से विचलित करने की अनुमति देता है, तो यह एक अच्छा समाधान हो सकता है।

आशा है कि इससे मदद मिलती है!

+0

ठीक है, सबसे पहले, यह मदद करता है :) लेकिन मुझे अभी भी लगता है कि यह एक साक्षात्कार में करने के लिए एक बड़ा सवाल है। झपकी एक अच्छा समाधान की तरह प्रतीत होता है, लेकिन मुझे नहीं लगता कि साक्षात्कारकर्ता का यही अर्थ है। यह बीएसटी समस्या का वास्तव में गैर-तुच्छ समाधान है, और यदि आप साक्षात्कार से पहले इस बारे में परिचित नहीं हैं (मेरे जैसे) वास्तव में एक यथार्थवादी विकल्प नहीं है। स्प्ले पेड़ के रूप में, फिर से, यह लाल-काले पेड़ का उल्लेख करने के समान है (हालांकि इसे कार्यान्वित करना आसान है)। लेकिन इसे लागू करने के लिए अभी भी मामूली नहीं है, और एक छोटे से साक्षात्कार के लिए यह एक बड़े सवाल की तरह लगता है। – Dave

+0

मैं दूसरा स्प्ले पेड़ दूंगा, हालांकि वे तकनीकी रूप से "संतुलित" नहीं हैं, वे जो भी साक्षात्कार पूछ रहे थे, उनके लिए पर्याप्त हो सकता है (उदाहरण के लिए, केथ तत्व या उस तरह कुछ देखें)। – Mikola

+0

मुझे नहीं लगता कि 15 मिनट में एक ट्रेप या एक स्प्ले पेड़ लिखना संभव है। bitwise trie एक अच्छा है लेकिन यह नहीं पता कि साक्षात्कारकर्ता सहमत है: पी। –

1

सबसे सरल संतुलित बाइनरी खोज पेड़ में से एक बीबी (α) -tree है। आप स्थिर α चुनते हैं, जो कहता है कि पेड़ कितना असंतुलित हो सकता है। हर समय, #descendants(child) <= (1-α) × #descendants(node) पकड़ना चाहिए। आप इसे सामान्य बाइनरी खोज पेड़ के रूप में देखते हैं, लेकिन जब सूत्र कुछ नोड पर लागू नहीं होता है, तो आप पेड़ के उस हिस्से को खरोंच से पुनर्निर्माण करते हैं, ताकि यह पूरी तरह संतुलित हो।

सम्मिलन या हटाने के लिए मिश्रित समय जटिलता अभी भी अन्य संतुलित बाइनरी पेड़ों के साथ ओ (लॉग एन) है।

संबंधित मुद्दे