2010-10-18 7 views
17

मेरी प्रोग्रामिंग शक्ति का विस्तार करने के लिए, मैंने The Standard PHP Library में कभी-कभी थोड़ा सा हल किया है। इससे SplDoublyLinkedList कक्षा की मेरी खोज हुई। वहां से मैंने विकिपीडिया पर Linked Lists और Doubly Linked Lists के विवरण पढ़े।PHP की SplDoublyLinkedList क्लास का बिंदु क्या है, और सबसे महत्वपूर्ण बात यह है कि सामान्य रूप से लिंक्ड सूचियां?

मैं समझता हूं कि वे कैसे काम करते हैं ... लेकिन मुझे किसी कारण की कल्पना नहीं करनी चाहिए, हमें इसकी आवश्यकता क्यों है — या बेहतर अभी तक SplDoublyLinkedList का एक व्यावहारिक उदाहरण है क्योंकि हमने PHP में अनुक्रमित और सहयोगी सरणीएं हैं।

लिंक्ड सूचियां आमतौर पर PHP के अंदर और बाहर कैसे उपयोग की जाती हैं?

उत्तर

6

एसपीएल डेटा संरचनाएं स्मृति खपत को कम करती हैं और प्रदर्शन में सुधार करती हैं। अच्छी व्याख्या:

डेटा संरचनाएं स्वाभाविक रूप से भाषा-स्वतंत्र हैं और गणित में आधारित तार्किक अवधारणाओं के एक सेट के रूप में मौजूद हैं। ये कंटेनर दक्षता को अधिकतम करने के लिए उपयुक्त विभिन्न एल्गोरिदम का उपयोग करते हैं।

उदाहरण के लिए, यदि आपको किसी सहयोगी सरणी की हैश मानचित्र क्षमताओं की आवश्यकता नहीं है - यानी, यदि आप किसी विशेष उद्देश्य के लिए सरणी कुंजी का उपयोग नहीं कर रहे हैं और केवल एक समेकित सरणी की आवश्यकता है - SplFixedArray (पूर्व में SplFastArray, वर्तमान में अनियंत्रित) एक उपयुक्त प्रतिस्थापन हो सकता है। एकमात्र चेतावनी यह है कि सरणी का आकार तय किया गया है, जिसका अर्थ है कि जब आप कक्षा को तुरंत चालू करते हैं तो आपको आकार निर्दिष्ट करना होगा और यदि आप उस संख्या के तत्वों से अधिक स्टोर करने का प्रयास करते हैं तो एक त्रुटि उत्पन्न होगी। यही कारण है कि, औसतन, यह मानक PHP सरणी से बेहतर प्रदर्शन करता है।

http://web.archive.org/web/20130805120049/http://blueparabola.com/blog/spl-deserves-some-reiteration

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

यह हैश नक्शा कार्यान्वयन एरे को तत्वों की मनमानी संख्या को स्टोर करने और संख्यात्मक या स्ट्रिंग कुंजियों का उपयोग करके उन सभी तत्वों तक पहुंच प्रदान करने में सक्षम बनाता है। Arrays उनके द्वारा प्रदान की जाने वाली क्षमताओं के लिए बेहद तेज़ हैं और एक उत्कृष्ट सामान्य उद्देश्य डेटा संरचना हैं।

कंप्यूटर विज्ञान में, एक सूची को मूल्यों के आदेशित संग्रह के रूप में परिभाषित किया जाता है। एक लिंक्ड सूची एक डेटा संरचना है जिसमें सूची में प्रत्येक तत्व सूची के भीतर किसी भी तरफ एक या दोनों तत्वों का संदर्भ शामिल करता है। "दोगुनी-लिंक्ड सूची" शब्द का उपयोग बाद के मामले को संदर्भित करने के लिए किया जाता है। एसपीएल में, यह वर्ग SplDoublyLinkedList वर्ग का रूप लेता है .... सूचियों का उपयोग करना समझ में आता है जब तत्वों को संग्रहीत करने की संख्या अग्रिम में ज्ञात नहीं होती है और तत्वों को अनुक्रमिक स्थिति द्वारा केवल एक्सेस करने की आवश्यकता होती है।

http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

+0

यह यहां पर सबसे अच्छा जवाब है, और इन डेटा संरचनाओं के उद्देश्य को समझने के लिए एक अच्छा है। हालांकि, चीजें उतनी सरल नहीं हैं जितनी इस जवाब का तात्पर्य है। बस एक डबल लिंक्ड सूची क्या है और क्या हैश टेबल है (PHP में एरे कैसे कार्यान्वित किए जाते हैं) की अवधारणा के आधार पर, एक उम्मीद करेगा कि एक डबल लिंक्ड सूची एक सरणी पर बहुत सारी स्मृति को बचा सकती है। हालांकि मेरे परीक्षण में, मैं या तो स्पॉट के बारे में स्मृति से बाहर चला जाता हूं। जो मुझे विश्वास दिलाता है कि दोगुनी लिंक्ड सूचियों को PHP में बहुत बेवकूफ तरीके से कार्यान्वित किया जाता है। –

+1

मैंने स्मृति की रक्षा के लिए एक गहरी आंख के साथ अपनी खुद की एकमात्र लिंक्ड सूची कक्षा बनाने की भी कोशिश की। किसी भी तरह से मैं उसी स्थान पर स्मृति से बाहर निकल रहा हूं जैसे कि मैं एक सामान्य PHP सरणी का उपयोग करता हूं, जो बहुत विचित्र है। इससे मुझे अप्रत्याशित स्थानों में PHP का उपयोग PHP arrays के आंतरिक संकेतों पर संदेह होता है। यह सिर्फ एक अनुमान है, लेकिन यह सुनिश्चित नहीं है कि और क्या सोचना है। बीटीडब्ल्यू मैं PHP 5.3.2 का उपयोग कर रहा हूं, इसलिए उम्मीद है कि इसके बारे में नए संस्करण बेहतर हैं, लेकिन मुझे नहीं पता। मुद्दा यह है कि, यदि आप प्रदर्शन कारणों से PHP सरणी के अलावा किसी अन्य डेटा संरचना का उपयोग करने जा रहे हैं, तो सुनिश्चित करें कि यह सुनिश्चित करने के लिए आप प्रदर्शन को मापते हैं कि यह मदद करता है। –

3

Wikipedia के अनुसार, एक पारंपरिक सरणी पर एक लिंक्ड सूची की

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

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

तो आपके प्रश्न का उत्तर देने के लिए, मुझे कोई जानकारी नहीं है। :)

+0

हाहा! हाँ मैंने इसे भी पढ़ा। "मुझे कोई जानकारी नहीं है। :)" – Stephen

+0

+1: कोई विचार नहीं है एक अच्छा विचार – tacone

+1

यह कह रहा है कि जुड़े हुए लोगों में तेजी से सम्मिलन और निष्कासन होता है, जबकि पारंपरिक सरणी में, तत्वों को चारों ओर घूमना पड़ता है या सरणी की प्रतिलिपि बनाई जानी चाहिए और विस्तार किया जाना चाहिए।हालांकि PHP की "सरणी" * पारंपरिक * सरणी नहीं है। – mpen

0

वे वहां हैं क्योंकि कई भाषाओं से आने वाले कई प्रोग्रामर उन पर उपयोग किए जाते हैं जहां सरणी के आकार निर्धारित होते हैं और आपको स्मृति प्रबंधन का ख्याल रखना पड़ता है।
तो PHP के लिए वे सिर्फ एक और उपकरण हैं। उन्हें लागू किया गया है क्योंकि कई एल्गोरिदम & सूचियों पर पैटर्न रिले और इसलिए उन्हें php-arrays में बदलने की आवश्यकता नहीं है।

+1

क्या यह धारणा पर आधारित है? ऐसा लगता है कि एक अनियंत्रित डेटा संरचना - एक जो केवल प्रोग्रामर को किसी अन्य भाषा से PHP में परिवर्तित करने के लिए मौजूद है - एसपीएल में लागू किया जाएगा ... – Stephen

+0

वे एसपीएल में लागू किए गए हैं क्योंकि कस्टम PHP-लिखित कार्यान्वयन हैं बहुत कम कुशल। PHP समुदाय वर्षों के बिना उनके बिना रह सकता है। और सूचियां निश्चित रूप से उपयोग की जाने वाली सबसे महत्वपूर्ण डेटा संरचनाओं में से एक हैं। उदाहरण के लिए कक्षाओं के लिए भी लागू होता है - आपको प्रोग्राम लिखने की आवश्यकता नहीं होती है लेकिन वे निश्चित रूप से सहायता करते हैं लेकिन वे भी एक उपकरण हैं। – Fge

+1

ठीक है मैं काट दूंगा। वे जरूरी नहीं हैं (जाहिर है क्योंकि मुझे उनके बिना इतने लंबे समय तक मिल गया है), लेकिन क्या आपके पास एक उदाहरण है कि वे मेरे जीवन को कैसे आसान बना सकते हैं? आपने उन्हें कक्षाओं से तुलना की है। कक्षाएं मेरी जिंदगी लगभग नौ अरब गुना आसान बनाती हैं। PHP में एक लिंक की गई सूची कैसे और कहाँ फिट होती है? – Stephen

0

दूसरों के रूप में उल्लेख किया है, सूचियाँ तय सरणियों जो अन्य भाषाओं में आम हैं के लिए एक विकल्प है। लेकिन एक महत्वपूर्ण पहलू जिसे अक्सर अनदेखा किया जाता है - आप सूची में किसी भी स्थान से किसी तत्व से बहुत कुशलता से तत्व डाल या निकाल सकते हैं।

यह क्यों महत्वपूर्ण होगा? आइए मान लें कि आपके पास कई आइटम हैं जिन्हें आप सरणी में सॉर्ट करना चाहते हैं, शायद आपको उन्हें बाद में सॉर्ट करने या खोज समय को कम करने की आवश्यकता नहीं है। इस उदाहरण में एक सूची एक बहुत शक्तिशाली उपकरण हो सकता है। विशेष रूप से बहुत बड़े डेटासेट के लिए।

3

सबसे पहले, SplDoublyLinkedList वे, विस्तारित किया जा सकता है, ताकि आप उनके तरीकों को ओवरराइड कर सकते हैं (आप उदाहरण के लिए सभी स्ट्रिंग्स uppercased वापस आ सकते हैं, आदि)

  • इंटरफेस के रूप में ऐसी

    • , वस्तुओं रहे हैं उन्हें कार्यान्वित किया जा सकता है जैसे कि myfunc(SplDoublyLinkedList $var) ...
    • उन्हें डिफ़ॉल्ट
    • आदि के संदर्भ में पारित किया जा सकता है।

    दूसरे, SplDoublyLinkedList, यात्रा मोड को स्वीकार करें ताकि आप अपने आइटम चलते-फिरते स्विच दिशा सरणी उनका क्रम बदलने या अपने कोड उलझी बिना नष्ट कर सकते हैं, और:

    SplDoublyLinkedList :: IT_MODE_LIFO (ढेर शैली)

    SplDoublyLinkedList :: IT_MODE_FIFO (कतार शैली) इटरेटर के व्यवहार (या तो एक या अन्य)

    SplDoublyLinkedList :: IT_MODE_DELETE (तत्वों इटरेटर से हट जाते हैं)

    SplDoublyLinkedList :: IT_MODE_KEEP (तत्वों द्वारा पार कर रहे हैं इटरेटर)

    ऊपर उद्धरण http://simpletechinfo.com/SplDoublyLinkedList से है जिसमें कुछ कोड नमूने शामिल हैं।

    वहाँ

  • 0

    आप शायद ठीक कह रहे हैं (foreach एक प्रति, आदि सभी डेटा की स्मृति में क्या करने वाले नहीं) की तरह अन्य सुविधाओं कर रहे हैं, और यह सिर्फ बहुत उपयोगी नहीं है।

    सिद्धांत में लिंक्ड सूचियों के कई उपयोग हैं (विशेष रूप से नृत्य लिंक)। लेकिन उनमें से अधिकतर या तो अपने इटरेटर को कहीं और संग्रहित करते हैं, सामग्री को दो से अधिक दिशाओं में एक्सेस करते हैं, या सूचियों को विभाजित करते हैं और विलय करते हैं। SplDoublyLinkedList उन लोगों को नहीं लग रहा था।

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

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

    लेकिन यदि आप अधिकतम आकार के बिना खुद को ढेर या डेक को लागू करना चाहते हैं, या सामान्य लिंक्ड सूचियों के नोड्स को आवंटित करना चाहते हैं (PHP में उन पुस्तकालयों के बिना किसी भाषा में), तो अच्छा तरीका कुछ निश्चित सरणीओं को चेन करना है साथ में, उन सुविधाओं के बिना दोगुनी लिंक्ड सूचियों का उपयोग करना। किसी भी तरह आपको अभी भी इसकी आवश्यकता होगी।

    PHP दस्तावेज़ स्वयं जावा की तरह ही, यह सुझाव देता है कि उन्हें कुछ अतिरिक्त अजीब सुविधाओं का समर्थन करने वाला एक डेक होना चाहिए, यहां तक ​​कि दो डेक (मुझे लगता है) भी नहीं। यदि आपको वास्तव में दोगुनी लिंक्ड सूचियों की आवश्यकता है तो उनका उपयोग न करें।