मुझे एक रैंडम क्यू लिखने की ज़रूरत है जो निरंतरता (ओ (1)) में अपेंडिक्स और यादृच्छिक निष्कासन की अनुमति देता है।
मेरा पहला विचार इसे कुछ प्रकार के एरे के साथ वापस करना था (मैंने एक ArrayList चुना), क्योंकि सरणियों का सूचकांक के माध्यम से निरंतर उपयोग होता है।
हालाँकि, दस्तावेज़ीकरण को देखते हुए, मैंने महसूस किया कि ArrayLists के परिवर्धन को Amortized Constant Time माना जाता है, क्योंकि इसके अतिरिक्त अंतर्निहित सरणी, जो कि O (n) है, के पुनः आरंभ की आवश्यकता हो सकती है।
क्या लगातार स्थिर समय और निरंतर समय प्रभावी रूप से समान हैं, या क्या मुझे कुछ संरचना को देखने की आवश्यकता है जो हर अतिरिक्त पर पूर्ण प्राप्ति की आवश्यकता नहीं है?
मैं यह इसलिए पूछ रहा हूं क्योंकि सरणी आधारित संरचनाएं एक तरफ (जो कि जहां तक मुझे पता है उसके पास हमेशा संकरा समय जोड़ होगा), मैं कुछ भी नहीं सोच सकता जो आवश्यकताओं को पूरा करेगा:
- कुछ भी पेड़ आधारित सबसे अच्छा हे (लॉग एन) पहुंच पर होगा
- एक लिंक की गई सूची में संभवतः O (1) जोड़ हो सकते हैं (यदि पूंछ का संदर्भ दिया जाता है), लेकिन एक यादृच्छिक निष्कासन सबसे अच्छा O (n) पर होना चाहिए।
यहाँ पूर्ण प्रश्न है; यदि मैं कुछ महत्वपूर्ण विवरणों से अवगत हुआ:
एक रैंडम क्यू डिजाइन और डिजाइन करें। यह कतार इंटरफ़ेस का एक कार्यान्वयन है जिसमें निष्कासन () ऑपरेशन एक ऐसे तत्व को हटाता है जो कतार में वर्तमान में सभी तत्वों के बीच समान रूप से यादृच्छिक रूप से चुना जाता है। (एक रैंडम क्यू के बारे में सोचें जिसमें हम तत्वों को जोड़ सकते हैं या अंदर तक पहुँच सकते हैं या कुछ यादृच्छिक तत्वों को निकाल सकते हैं।) एक रेंडमक्यू में ऐड (x) और निष्कासन () का संचालन निरंतर समय के अनुसार होना चाहिए।
1/a
एक हे (एन) आपरेशन के लिए मौका), लेकिन एक निरंतर पहलू से बढ़ रही a > 1
हे (1) इसके अलावा के लिए परिशोधित है: हम एक है (1/a)^n
एक हे की संभावना (एन) ऑपरेशन, लेकिन यह संभावना बड़े के लिए शून्य तक पहुंचती है n
।