सूची इंटरफ़ेस एक टपका हुआ अमूर्त है?


9

अगर मेरे पास एक वैरिएबल है, तो Listउसमें बहुत सारे प्रकार की वस्तुएं हो सकती हैं, जैसे ArrayListया LinkedList। एक LinkedListऔर एक के बीच का अंतर ArrayListबहुत बड़ा है। विधियों का बड़ा ओ व्यवहार बहुत भिन्न होता है। उदाहरण के लिए छँटाई Listऔर फिर इसका उपयोग द्विआधारी खोजों को करने के लिए ठीक है ArrayListलेकिन एक के साथ कोई मतलब नहीं होगा LinkedList


"द बिग ओ" का क्या अर्थ है?
ट्यूलेंस कोर्डोवा

जवाबों:


25

मैं ऐसा नहीं कहूंगा।

एक टपका हुआ अमूर्त वह है जो आपको कार्यान्वयन विवरणों से निपटने के लिए मजबूर करता है जो इसे दूर करना चाहिए। लेकिन प्रदर्शन हमेशा कार्यान्वयन के बीच भिन्न होता है, इसलिए यदि आप इसे लीक के रूप में गिनते हैं, तो कोई गैर-लीकिंग सार नहीं हैं।

यदि कुछ को Listआगे के दस्तावेज के बिना घोषित किया जाता है , तो यह समझा जाना चाहिए कि प्रदर्शन के बारे में बस कोई गारंटी नहीं है, और यदि आप इसके साथ कुछ भी प्रदर्शन-संवेदनशील करने जा रहे हैं, तो आपको एक प्रतिलिपि बनाना चाहिए और उसके साथ काम करना चाहिए।

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


9
एक और भी सामान्य इंटरफ़ेस है जो अक्सर कार्यक्षमता में पर्याप्त है Iterable:।
एमरी

विभिन्न कार्यान्वयनों के बीच प्रदर्शन अंतर अपेक्षित हैं। जैसे कि वेक्टर और एरेलेलिस्ट के बीच अंतर हैं, लेकिन लिंक्डलिस्ट पर एक ऑपरेशन प्राप्त करना अजीब लगता है।
Paling

17

सभी गैर-तुच्छ सार, कुछ हद तक टपका हुआ है। उस ने कहा, मुझे यकीन नहीं है कि यह यहां लागू होता है। :-)

सार का व्यवहार से संबंध है। जब तक व्यवहार विशेष प्रदर्शन को निर्दिष्ट Listनहीं करता (जो जावा का नहीं है) यह एक कार्यान्वयन विवरण है - अर्थात अप्रासंगिक।

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

  1. दस्तावेज़ में इसे कक्षा / इंटरफ़ेस में सूची उदाहरण से संबंधित होगा।
  2. एक नया इंटरफ़ेस बनाएँ - जैसे BinarySearchPerformantList(yuck!) - जो विभिन्न तरीकों की प्रदर्शन आवश्यकताओं को निर्दिष्ट करता है।

विकल्प 2 शायद बेहतर अमूर्त है, लेकिन अतिरिक्त उपरि के साथ आता है।


1
+1। तकनीकी रूप से हाँ, एक सूची एक टपका हुआ अमूर्त है , लेकिन फिर equalsवस्तुओं की तुलना करने के लिए उपयोग से संबंधित जटिलता को छिपाने के लिए वस्तु है।
नील

2
@ मुझे लगता है कि यह बहस का मुद्दा है ... चूंकि अमूर्त ने प्रदर्शन का उल्लेख नहीं किया है, मुझे नहीं लगता कि यह इस मामले में विफल हो रहा है (जैसा कि मैंने तर्क दिया है)। मैं कहूंगा कि यदि आप प्रदर्शन के बारे में सोच रहे हैं तो आपको एक अलग / संकरा गर्भपात की आवश्यकता है। उल्लेख करने के लिए संपादित करेंगे।
विन्गंड्रोइड

यह इस बात पर निर्भर करता है कि आप मुझे क्या छुपा रहे हैं। क्या उपयोग में जटिलता है या यह इसके स्मृति उपयोग और कार्यान्वयन में है? क्योंकि अगर यह एक अमूर्त वर्ग है, तो इनमें से एक या अधिक जटिलताएं एक या दूसरे तरीके से छिपी हुई हैं।
नील

मैं खेला कई के आसपास वर्षों विकल्प 2 का एक परिवर्तन को लागू करने के लिए वापस की तरह मार्कर इंटरफेस का उपयोग कर LinearSpaceऔर LogarithmicTimeऔर उसके बाद की तरह वर्गों की घोषणा public class BinarySearch : ISearchStrategy<T>, LogarithmicTime। अन्य वर्ग public T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }प्रदर्शन की बाधाओं को लागू करने के लिए जैसे पैरामीटर ले सकते हैं ।
लुकास

2
अगर हम जोएल स्पॉल्स्की लेख द्वारा जा रहे हैं, तो मुझे लगता है कि यह "कुछ हद तक, टपका हुआ" है। लेख से निम्नलिखित उद्धरण देखें: "यदि आप अपनी कंपनी में सिस्टम प्रशासक के साथ रूखा थे और उन्होंने आपको एक ओवरलोड हब में प्लग करके आपको दंडित किया है, तो आपके कुछ आईपी पैकेट्स के माध्यम से ही मिलेगा, और टीसीपी काम करेगा, लेकिन सब कुछ होगा वास्तव में धीमा हो "मुझे लगता है कि यह लागू होता है
अमीश प्रोग्रामर

4

जावा में, एक रैंडम असफल इंटरफ़ेस है जिसे एक सूची के रूप में परिभाषित किया जाता है जिसमें आमतौर पर निरंतर यादृच्छिक अभिगम समय (ओ (1) मिलता है, डाल आदि)। यदि आपको लगता है कि आपके मॉड्यूल को उन प्रदर्शन विशेषताओं के साथ एक सूची की आवश्यकता है, तो RandomAccessइसके बजाय का उपयोग करने पर विचार करें List। यदि आपको वह परिवर्तन (और कुछ करने) की आवश्यकता महसूस नहीं होती है, तो शायद सूची इतनी लीक नहीं है।


1

आप सही हैं, एक सूची एक टपका हुआ अमूर्त है। STL इस विशिष्ट समस्या को मॉडल करने के लिए अवधारणाओं के विचार का उपयोग करता है। अपने उदाहरण का उपयोग करने के लिए, एक ArrayListमॉडल रैंडम एक्सेस Iterator जबकि एक लिंक्डलिस्ट एक फॉरवर्ड Iterator मॉडल करता है । विभिन्न अवधारणाओं की अलग-अलग प्रदर्शन आवश्यकताएं होती हैं, जो उन्हें अलग-अलग एल्गोरिदम के लिए उपयुक्त बनाती हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.