संपादित करें: संशोधन 3 में प्रमुख संशोधन।
चूंकि मैंने कभी क्लास नहीं पढ़ाया है, इसलिए मुझे नहीं लगता कि मैं जो कुछ भी सिखाना चाहिए, उसके बारे में आश्वस्त होकर कुछ भी कह सकता हूं। फिर भी, यहाँ मैं इसके बारे में क्या सोचते हैं।
ऐसे प्राकृतिक उदाहरण हैं जहाँ "सीमा छल" जैसा कि लिखा गया है लागू नहीं किया जा सकता है। उदाहरण के लिए, मान लीजिए कि आप एक "वैरिएबल-लेंथ वेक्टर" (जैसे वेक्टर <T> C C में) लागू करते हैं, एक निश्चित-लंबाई सरणी का उपयोग करके आकार दोगुना करते हैं (अर्थात, हर बार जब आप सरणी के आकार को पार करने वाले होते हैं, तो आप सरणी को अब से दो बार बड़ा करें और सभी तत्वों को कॉपी करें)। आकार एस ( n सरणी के) जब हम की दुकान n वेक्टर में तत्वों की तुलना में 2 से अधिक की सबसे छोटी शक्ति है या इसके बराबर एन । हम यह कहना चाहते हैं कि S ( n ) = O ( n ), लेकिन परिभाषा के अनुसार "लिमिट ट्रिक" का उपयोग करने से हमें ऐसा करने की अनुमति नहीं मिलेगी क्योंकि S ( n)) / n रेंज में घनीभूत [1,2) है। वही same () और Θ () पर लागू होता है।
कुछ अलग बात के रूप में, जब हम एल्गोरिथम की जटिलता का वर्णन करने के लिए इन सूचनाओं का उपयोग करते हैं, तो मुझे लगता है कि आपकी sometimes () की परिभाषा कभी-कभी असुविधाजनक होती है (हालांकि मुझे लगता है कि यह परिभाषा आम है)। यह परिभाषित करना अधिक सुविधाजनक है कि f ( n ) = g ( g ( n )) यदि और केवल यदि limsup f ( n ) / g ( n )> 0. यह है क्योंकि कुछ समस्याएं असीम रूप से n के कई मानों के लिए तुच्छ हैं ( इस तरह के एक विषम संख्या n के साथ एक ग्राफ पर सही मशीन समस्या के रूप में )। वही same () और ω () पर लागू होता है।
इसलिए, मुझे व्यक्तिगत रूप से लगता है कि एक एल्गोरिथ्म की जटिलता का वर्णन करने के लिए उपयोग करने के लिए सबसे सुविधाजनक निम्नलिखित परिभाषाएं हैं: फ़ंक्शन के लिए एफ , जी : g → ℕ > 0 ,
- f ( n ) = o ( g ( n )) यदि और केवल अगर limsup f ( n ) / g ( n ) = 0. (यह lim f ( n ) / g ( n ) = 0. के बराबर है )
- f ( n ) = O ( g ( n )) यदि और केवल यदि limsup f ( n ) / g ( n ) < O ।
- f ( n ) = Θ ( g ( n )) यदि और केवल अगर 0 <limsup f ( n ) / g ( n ) < Θ ।
- f ( n ) = Ω ( g ( n )) यदि और केवल अगर limsup f ( n ) / g ( n )> 0. (यह उस f ( n के बराबर है ) o ( g ( n )) नहीं है।)
- f ( n ) = ω ( g ( n )) यदि और केवल अगर लिमअप f ( n ) / g ( n ) = ω । (यह उस एफ के बराबर है ( एन ) ओ ( जी ( एन )) नहीं है।)
या समकक्ष,
- च ( एन ) = ओ ( जी ( एन )) तभी हर के लिए करता है, तो ग > 0, पर्याप्त रूप से बड़े के लिए n , च ( एन ) ≤ सी ⋅ जी ( एन )।
- च ( एन ) = हे ( जी ( एन )) यदि और केवल कुछ के लिए अगर ग > 0, पर्याप्त रूप से बड़े के लिए n , च ( एन ) ≤ सी ⋅ जी ( एन )।
- f ( n ) = Θ ( g ( n )) यदि और केवल अगर f ( n ) = O ( g ( n )) और f ( n ) = Ω ( g ( n ))।
- f ( n ) = Ω ( g ( n )) यदि और केवल अगर कुछ d > 0 के लिए, असीम रूप से कई n , f ( n ) ⋅ d ( g ( n ) के लिए।
- f ( n ) = ω ( g ( n )) यदि और केवल यदि प्रत्येक d > 0 के लिए, असीम रूप से कई n , f ( n ) ⋅ d ( g ( n ) के लिए।
लेकिन मुझे नहीं पता कि यह एक आम बात है या नहीं। इसके अलावा मुझे नहीं पता कि यह शिक्षण के लिए उपयुक्त है या नहीं। समस्या यह है कि हम कभी-कभी इसके बजाय लिमिनफ द्वारा instead () को परिभाषित करना चाहते हैं (जैसा कि आपने पहली परिभाषा में किया था)। उदाहरण के लिए, जब हम कहते हैं कि "इस रैंडमाइज्ड एल्गोरिथ्म की त्रुटि की संभावना 2 do ( n ) है ," हमारा मतलब यह नहीं है कि त्रुटि संभावना केवल छोटे रूप से कई n के लिए घातीय रूप से छोटी है !