आसन्न सूची और मैट्रिक्स अभ्यावेदन के लिए वस्तु ग्राफ प्रतिनिधित्व की तुलना करना


82

मैं वर्तमान में तकनीकी प्रोग्रामिंग साक्षात्कार की तैयारी के लिए स्टीव येजेग की सलाह का पालन कर रहा हूं: http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html

रेखांकन पर अपने अनुभाग में, उन्होंने कहा:

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

मैट्रिक्स और आसन्न सूची अभ्यावेदन के पेशेवरों और विपक्षों का वर्णन CLRS में किया गया है, लेकिन मुझे ऐसा संसाधन नहीं मिला है जो इनकी तुलना वस्तु प्रतिनिधित्व से कर सके।

बस इसके बारे में सोचकर, मैं इसमें से कुछ को खुद को अनुमान लगा सकता हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैंने कुछ महत्वपूर्ण याद नहीं किया है। अगर कोई इसका विस्तृत वर्णन कर सकता है, या मुझे ऐसे संसाधन की ओर संकेत कर सकता है जो ऐसा करता है, तो मैं इसकी बहुत सराहना करूंगा।


आगमनात्मक रेखांकन के बारे में - ये 3 श्रेणियों में से किसके अंतर्गत आते हैं?
एरिक कपलुन

जवाबों:


94

ऑब्जेक्ट्स और पॉइंटर्स

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

Vertex a = new Vertex(1);
Vertex b = new Vertex(2);
Edge edge = new Edge(a,b, 30); // init an edge between ab and be with weight 30  

यह दृष्टिकोण आमतौर पर वस्तु उन्मुख कार्यान्वयन के लिए उपयोग किया जाता है, क्योंकि यह ऑब्जेक्ट उन्मुख उपयोगकर्ताओं के लिए अधिक पठनीय और सुविधाजनक है;)।

आव्यूह

एक मैट्रिक्स सिर्फ एक सरल 2 आयामी सरणी है। मान लें कि आपके पास वर्टेक्स आईडी है जिसे इस तरह से एक इंट सरणी के रूप में दर्शाया जा सकता है:

int[][] adjacencyMatrix = new int[SIZE][SIZE]; // SIZE is the number of vertices in our graph
adjacencyMatrix[0][1] = 30; // sets the weight of a vertex 0 that is adjacent to vertex 1

यह आमतौर पर घने रेखांकन के लिए उपयोग किया जाता है जहां सूचकांक पहुंच आवश्यक है। आप इसके साथ संयुक्त राष्ट्र / निर्देशित और भारित संरचना का प्रतिनिधित्व कर सकते हैं।

आसन्न सूची

यह सिर्फ एक सरल डेटास्ट्रक्चर मिश्रण है, मैं आमतौर पर इसे का उपयोग करके लागू करता हूं HashMap<Vertex, List<Vertex>>HashMultimapअमरूद में भी ऐसा ही प्रयोग किया जा सकता है ।

यह दृष्टिकोण अच्छा है, क्योंकि आपके पास ओ (1) (amortized) वर्टेक्स लुक है और यह मुझे इस विशेष वर्टेक्स के लिए सभी आसन्न कोने की एक सूची देता है जिसकी मैंने मांग की थी।

ArrayList<Vertex> list = new ArrayList<>();
list.add(new Vertex(2));
list.add(new Vertex(3));
map.put(new Vertex(1), list); // vertex 1 is adjacent to 2 and 3

इसका उपयोग विरल रेखांकन को दर्शाने के लिए किया जाता है, यदि आप Google पर आवेदन कर रहे हैं, तो आपको पता होना चाहिए कि वेबग्राफ विरल है। आप एक BigTable का उपयोग करके उनके साथ अधिक स्केलेबल तरीके से व्यवहार कर सकते हैं ।

ओह और BTW, यहाँ फैंसी तस्वीरों के साथ इस पोस्ट का बहुत अच्छा सारांश है;)


यह दृष्टिकोण शांत है, क्योंकि आपके पास O (1) शीर्ष लुक है यह जटिलता थोड़ी गलत है, विशेष रूप से यह O (1 + अल्फा) है जहां अल्फा = हैश मैप में स्लॉट्स की संख्या / कोने की संख्या। इसलिए मैं हैश मानचित्र के बजाय सरणी का उपयोग करने का प्रस्ताव करता हूं
टिमोफे

@ यह O (1) amortized है। आपकी जटिलता गणना दृढ़ता से कार्यान्वयन पर निर्भर है। HashMap( Docs.oracle.com/javase/7/docs/api/java/util/HashMap.html ) का javadoc देखें यह कहता है: This implementation provides constant-time performance for the basic operations= O (1) amortized।
थॉमस जुंगब्लूट

6
@ मुझे लगता है कि यहां हर कोई जानता है कि किसी भी HashTableउपयोग की तुलना में सरणी पहुंच तेज़ है । तो एक छोटे से निरंतर अल्फा ओवरहेड के साथ घेरने की आवश्यकता नहीं है जिसे उपेक्षित किया जा सकता है।
थॉमस जुंगब्लेट

2
कृपया मुझे गलत मत समझो, मैं आपको अच्छा जवाब नहीं देता, लेकिन मुझे लग रहा है कि आपके उत्तर में सुधार हो सकता है, इसलिए यहां इसका उल्लेख नहीं किया जा सकता है :)
टिमोफेई

2
@ समय पर मैंने जवाब में परिशोधन नोट जोड़ दिया। धन्यवाद।
थॉमस जुंगब्लेट

7

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

तुलना

struct Node {
    Node *neighbours[];
};

साथ में

struct Node {
    Node *left;
    Node *right;
};

आप बाद के मामले में पड़ोसियों की सूची का निर्माण आसानी से कर सकते हैं, अगर नामांकित बिंदुओं की तुलना में काम करना आसान है।


4

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


5
क्यों "घटना सूची" के रूप में नामित आसन्न सूची प्रतिनिधित्व के लिए एक कड़ी है? शायद यह इस एक का उपयोग करने के लिए बेहतर है algorithmist.com/index.php/Graph_data_structures#Incidence_List
Timofey

1

एक और अच्छा संसाधन: खान अकादमी - "ग्राफ का प्रतिनिधित्व"

आसन्न सूची और आसन्न मैट्रिक्स के अलावा, वे "बढ़त सूचियों" को 3 प्रकार के ग्राफ प्रतिनिधित्व के रूप में सूचीबद्ध करते हैं। एक धार सूची को "धार वस्तुओं" की सूची के रूप में व्याख्या किया जा सकता है जैसे थॉमस के "वस्तुओं और संकेत" के उत्तर।

लाभ: हम किनारे के बारे में अधिक जानकारी स्टोर कर सकते हैं (मिशल द्वारा उल्लिखित)

नुकसान: इसके साथ काम करने के लिए बहुत धीमी डेटा संरचना है:

  • लुक अप एज: O (लॉग ई)
  • एक किनारे निकालें: O (e)
  • दिए गए नोड से सटे सभी नोड्स खोजें: O (e)
  • निर्धारित करें कि क्या दो नोड्स के बीच एक मार्ग मौजूद है: O (e ^ 2)

ई = किनारों की संख्या

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