मुझे चल रहे माध्य की गणना करने की आवश्यकता है:
इनपुट: , k , वेक्टर ( x 1 , x 2 , … , x n ) ।
आउटपुट: वेक्टर , जहां y i का माध्य है ( x i , x i + 1 , … , x i + k - 1 ) ।
(सन्निकटन के साथ कोई धोखा नहीं; मैं सटीक समाधान करना चाहूंगा। तत्व बड़े पूर्णांक हैं।)
एक तुच्छ एल्गोरिथ्म है जो आकार का खोज ट्री बनाए रखता है ; कुल चलने का समय O ( n log k ) है । (यहां "खोज ट्री" कुछ कुशल डेटा संरचना को संदर्भित करता है जो लॉगरिंथ समय में सम्मिलन, विलोपन, और मध्ययुगीन प्रश्नों का समर्थन करता है।)
हालांकि, यह मुझे थोड़ा बेवकूफ लगता है। हम प्रभावी रूप से सीखना होगा सभी आकार के सभी खिड़कियों के भीतर आदेश आँकड़े ही नहीं, माध्यिकाओं। इसके अलावा, यह व्यवहार में बहुत आकर्षक नहीं है, खासकर यदि k बड़ा है (बड़े खोज पेड़ धीमी गति से होते हैं, स्मृति खपत में ओवरहेड गैर-तुच्छ है, कैश-दक्षता अक्सर खराब होती है, आदि)।
क्या हम कुछ बेहतर कर सकते हैं?
क्या कोई निचली सीमा है (उदाहरण के लिए, तुलनात्मक मॉडल के लिए तिर्यक एल्गोरिथ्म asymptotically इष्टतम है)?
संपादित करें: डेविड एप्पस्टीन ने तुलनात्मक मॉडल के लिए एक अच्छा निचला भाग दिया! मुझे आश्चर्य है कि अगर तुच्छ एल्गोरिथ्म की तुलना में कुछ अधिक चतुर करना संभव है?
उदाहरण के लिए, क्या हम इन पंक्तियों के साथ कुछ कर सकते हैं: इनपुट वेक्टर को आकार भागों में विभाजित करें ; प्रत्येक भाग को क्रमबद्ध करें (प्रत्येक तत्व के मूल पदों का ध्यान रखें); और फिर किसी भी सहायक डेटा संरचनाओं के बिना कुशलता से चल रहे मध्यस्थों को खोजने के लिए टुकड़ावार छांटे वेक्टर का उपयोग करें? बेशक यह अभी भी ओ ( एन लॉग के ) होगा , लेकिन व्यवहार में सरणियों में खोज पेड़ों को बनाए रखने की तुलना में बहुत तेजी से होता है।
संपादित करें 2: सईद कुछ कारणों को देखना चाहता था कि मुझे क्यों लगता है कि खोज के पेड़ के संचालन की तुलना में छंटनी तेज है। यहाँ बहुत ही तेज़ बेंचमार्क हैं, , n = 10 8 के लिए :
- ≈ 8s: k के साथ वैक्टर को छांटना प्रत्येक तत्वों के
- । 10 एस: तत्वों के साथ एक सदिश छँटाई
- ≈ 80: सम्मिलन और आकार का एक हैश तालिका में हटाए गए कश्मीर
- ≈ 390s: सम्मिलन और आकार का एक संतुलित खोज पेड़ काट-छांट कश्मीर
हैश तालिका तुलना के लिए वहाँ है; यह इस आवेदन में कोई सीधा उपयोग नहीं है।
सारांश में, हमारे पास सॉर्टिंग बनाम संतुलित खोज ट्री ऑपरेशन के प्रदर्शन में लगभग 50 का अंतर है। और चीजें बहुत खराब हो जाती हैं अगर हम बढ़ाते हैं ।
(तकनीकी विवरण: डेटा = यादृच्छिक 32-बिट पूर्णांक। कंप्यूटर = एक सामान्य आधुनिक लैपटॉप। मानक पुस्तकालय दिनचर्या (std :: सॉर्ट) और डेटा संरचनाओं (std :: multiset, std ::) का उपयोग करके परीक्षण कोड C ++ में लिखा गया था। unsorted_multiset)। मैंने दो अलग-अलग C ++ कंपाइलर (GCC और Clang) का उपयोग किया, और मानक पुस्तकालय के दो अलग-अलग कार्यान्वयन (libstdc ++ और libc ++)। परंपरागत रूप से, std :: multiset को अत्यधिक अनुकूलित लाल-काले वृक्ष के रूप में लागू किया गया है।)