মেমরি, সুবিধা এবং অসুবিধাগুলিতে গ্রাফ সংরক্ষণের তিনটি উপায়


90

মেমরিতে গ্রাফ সংরক্ষণের তিনটি উপায় রয়েছে:

  1. পয়েন্টার হিসাবে বস্তু এবং প্রান্ত হিসাবে নোড
  2. সংখ্যাযুক্ত নোড x এবং নোড y এর মধ্যে সমস্ত প্রান্তের ওজনযুক্ত একটি ম্যাট্রিক্স
  3. সংখ্যাযুক্ত নোডের মধ্যে প্রান্তগুলির একটি তালিকা

আমি কীভাবে তিনটি লিখতে জানি, তবে আমি নিশ্চিত নই যে আমি প্রতিটিটির সুবিধাগুলি এবং অসুবিধাগুলি সম্পর্কে ভেবেছি।

স্মৃতিতে গ্রাফ সংরক্ষণের এই প্রতিটি পদ্ধতির সুবিধা এবং অসুবিধাগুলি কী?


4
আমি কেবল ম্যাট্রিক্স বিবেচনা করব যদি গ্রাফ খুব সংযুক্ত বা খুব ছোট হয়। খুব কম সংযুক্ত গ্রাফগুলির জন্য, অবজেক্ট / পয়েন্টার বা প্রান্তগুলির পদ্ধতির তালিকা উভয়ই মেমরির আরও ভাল ব্যবহার করতে পারে। আমি কৌতূহল করছি স্টোরেজ ছাড়াও আমি যা উপেক্ষা করেছি। ;)
sarnold

4
এগুলি সময়ের জটিলতায়ও পৃথক, ম্যাট্রিক্স হ'ল (1), এবং অন্যান্য উপস্থাপনাগুলি আপনি যা অনুসন্ধান করছেন তার উপর নির্ভর করে ব্যাপকভাবে পরিবর্তিত হতে পারে।
এমএসডাব্লু

4
পয়েন্টারগুলির তালিকার উপরে একটি ম্যাট্রিক্স হিসাবে গ্রাফ বাস্তবায়নের হার্ডওয়্যার সুবিধাগুলি বর্ণনা করার কিছুক্ষণ আগে আমি একটি নিবন্ধ পড়ে মনে করি। এটি ব্যতীত আমি খুব বেশি কিছু মনে করতে পারি না, কারণ আপনি স্মৃতির একটি নিরবচ্ছিন্ন ব্লকের সাথে কাজ করছেন যে কোনও সময় আপনার কাজের সেটটি খুব ভালভাবে এল 2 ক্যাশে থাকতে পারে। অন্যদিকে নোড / পয়েন্টারগুলির একটি তালিকা মেমরির মাধ্যমে শটগান করা হতে পারে এবং সম্ভবত ক্যাশেটি আঘাত না করে এমন একটি আনার প্রয়োজন হতে পারে। আমি নিশ্চিত যে আমি রাজি নই তবে এটি একটি আকর্ষণীয় চিন্তাভাবনা।
নেড়রাগ

4
@ ডিয়ান জে: "অবজেক্টস হিসাবে নোড এবং পয়েন্টার উপস্থাপনা হিসাবে প্রান্ত" সম্পর্কে কেবল একটি প্রশ্ন। আপনি অবজেক্টে পয়েন্টারগুলি সঞ্চয় করতে কোন ডেটা স্ট্রাকচার ব্যবহার করেন? এটি কি একটি তালিকা?
টিমোফি

4
সাধারণ নামগুলি: (1) সংলগ্ন তালিকার সমতুল্য , (2) সংলগ্ন ম্যাট্রিক্স , (3) প্রান্ত তালিকা
এভেজেনি সার্জিভ

উত্তর:


51

এগুলি বিশ্লেষণ করার একটি উপায় মেমরি এবং সময়ের জটিলতার ক্ষেত্রে (যা আপনি গ্রাফটিতে কীভাবে অ্যাক্সেস করতে চান তার উপর নির্ভর করে)।

একে অপরের পয়েন্টার সহ নোডগুলি অবজেক্ট হিসাবে সংরক্ষণ করা

  • এই পদ্ধতির জন্য মেমরির জটিলতা হ'ল (এন) কারণ আপনার নোডের মতো যতগুলি অবজেক্ট রয়েছে। পয়েন্টারগুলির (নোডগুলিতে) প্রয়োজনীয় সংখ্যা হে (এন ^ 2) পর্যন্ত হয় কারণ প্রতিটি নোড অবজেক্টে এন নোড পর্যন্ত পয়েন্টার থাকতে পারে।
  • এই ডেটা স্ট্রাকচারের সময় জটিলতা হ'ল যে কোনও নোড অ্যাক্সেস করার জন্য ও (এন)।

প্রান্ত ওজনের একটি ম্যাট্রিক্স সংরক্ষণ করা

  • এটি ম্যাট্রিক্সের জন্য O (n ^ 2) এর মেমরির জটিলতা হবে।
  • এই ডেটা কাঠামোর সুবিধাটি হ'ল যে কোনও নোড অ্যাক্সেস করার সময় জটিলতা হ'ল ও (1)।

গ্রাফটিতে আপনি কোন অ্যালগরিদম চালাচ্ছেন এবং কতগুলি নোড রয়েছে তার উপর নির্ভর করে আপনাকে উপযুক্ত উপস্থাপনা বেছে নিতে হবে।


4
আমি বিশ্বাস করি যে অবজেক্ট / পয়েন্টার মডেলের অনুসন্ধানগুলির জন্য সময় জটিলতা কেবল ও (এন) হয় যদি আপনি পৃথক অ্যারেতে নোডগুলিও সঞ্চয় করেন। অন্যথায় আপনার পছন্দসই নোডের জন্য গ্রাফটি অনুসন্ধান করতে হবে, না? একটি ন্যূনতম গ্রাফে প্রতিটি নোড (তবে প্রয়োজনীয় প্রতিটি প্রান্ত নয়) ও (N) এ করা যাবে না, এটি কি সম্ভব?
ব্যারি ফ্রুটম্যান

@ ব্যারিফ্রুটম্যান আমি নিশ্চিত আপনি ঠিক আছেন। বিএফএস হ'ল ও (ভি + ই)। এছাড়াও, আপনি যদি এমন কোনও নোডের সন্ধান করছেন যা অন্য নোডের সাথে সংযুক্ত না থাকে তবে আপনি এটি কখনও খুঁজে পাবেন না।
ওয়াইল্ডারফিল্ড

10

আরও কয়েকটি বিষয় বিবেচনা করতে হবে:

  1. ম্যাট্রিক্সের মডেলটি ম্যাট্রিক্সের মধ্যে ওজনগুলি সঞ্চয় করে, ভারী প্রান্তগুলি সহ গ্রাফগুলিতে আরও সহজে leণ দেয়। অবজেক্ট / পয়েন্টার মডেলটির জন্য সমান্তরাল অ্যারেতে প্রান্তের ওজন সংরক্ষণ করা দরকার, যার জন্য পয়েন্টার অ্যারের সাথে সিঙ্ক্রোনাইজেশন প্রয়োজন।

  2. অবজেক্ট / পয়েন্টার মডেলটি নির্দেশিত গ্রাফগুলির সাথে ডায়রেক্টার্ড গ্রাফগুলির চেয়ে আরও ভাল কাজ করে কারণ পয়েন্টারগুলিকে জোড়ায় বজায় রাখা দরকার, যা আনসক্রোনাইজড হয়ে যেতে পারে।


4
আপনার অর্থ পয়েন্টারগুলি পুনর্নির্দেশিত গ্রাফগুলির সাথে জোড়ায় বজায় রাখা দরকার, তাই না? যদি এটি নির্দেশিত হয় তবে আপনি কেবল একটি নির্দিষ্ট শীর্ষবিন্দুর সংলগ্ন তালিকায় একটি শীর্ষবিন্দু যুক্ত করুন, তবে এটি যদি পুনঃনির্দেশিত না হয় তবে আপনাকে উভয় স্তরের সংলগ্ন তালিকায় একটি যুক্ত করতে হবে?
ফ্রস্টিস্ট্রাও

@ ফ্রস্টিস্ট্রাও হ্যাঁ, ঠিক আছে।
ব্যারি ফ্রুটম্যান 21

8

বস্তু এবং নির্দেশক পদ্ধতি অনুসন্ধানের অসুবিধায় ভুগছে, যেমন কিছু উল্লেখ করেছেন, তবে বাইনারি অনুসন্ধান গাছ তৈরির মতো কাজগুলি করার জন্য বেশ প্রাকৃতিক, যেখানে প্রচুর অতিরিক্ত কাঠামো রয়েছে।

আমি ব্যক্তিগতভাবে সংলগ্ন ম্যাট্রিকগুলি পছন্দ করি কারণ তারা বীজগণিত গ্রাফিক তত্ত্বের সরঞ্জামগুলি ব্যবহার করে সমস্ত ধরণের সমস্যা অনেক সহজ করে তোলে। (সংলগ্ন ম্যাট্রিক্সের kth শক্তি দৈর্ঘ্য k এর দৈর্ঘ্যের k এর সংখ্যা সংখ্যাটি শীর্ষবিন্দু i থেকে শীর্ষস্থান জে দেয়, উদাহরণস্বরূপ। দৈর্ঘ্যের পাথের সংখ্যা পাওয়ার জন্য kth শক্তি গ্রহণের আগে একটি পরিচয় ম্যাট্রিক্স যুক্ত করুন <= কে। প্রসারিত গাছগুলির সংখ্যা পাওয়ার জন্য ল্যাপ্লেসিয়ার নাবালক 1 ... এবং আরও

তবে প্রত্যেকেই বলেছেন সংলগ্ন ম্যাট্রিকগুলি মেমরির ব্যয়বহুল! এগুলি কেবলমাত্র অর্ধ-ডান: আপনার গ্রাফের কয়েকটি প্রান্ত থাকলে আপনি বিছিন্ন ম্যাট্রিক্স ব্যবহার করে এটি পেতে পারেন around বিচ্ছুরিত ম্যাট্রিক্স ডেটা স্ট্রাকচারগুলি ঠিক একটি সংলগ্ন তালিকা রাখার কাজ করে তবে এখনও স্ট্যান্ডার্ড ম্যাট্রিক্স অপারেশনগুলি সম্পূর্ণ উপলব্ধ রয়েছে, যা আপনাকে উভয় পৃথিবীর সেরা প্রদান করে।


7

আমি মনে করি আপনার প্রথম উদাহরণটি কিছুটা অস্পষ্ট - পয়েন্টার হিসাবে বস্তু এবং প্রান্ত হিসাবে নোড। আপনি কিছু মূল নোডের কেবলমাত্র একটি পয়েন্টার সংরক্ষণ করে এগুলি ট্র্যাক করে রাখতে পারেন, এই ক্ষেত্রে কোনও প্রদত্ত নোড অ্যাক্সেস অকার্যকর হতে পারে (বলুন আপনি নোড 4 চান - নোড অবজেক্টটি সরবরাহ না করা থাকলে আপনাকে এটি অনুসন্ধান করতে হতে পারে) । এই ক্ষেত্রে, আপনি গ্রাফের কিছু অংশও হারাবেন যা মূল নোড থেকে পৌঁছনীয় নয়। আমি মনে করি এটি f64 রংধনুটি ধরে নিয়েছে যখন তিনি বলেন যে প্রদত্ত নোড অ্যাক্সেসের জন্য সময় জটিলতা হ'ল হে (এন)।

অন্যথায়, আপনি প্রতিটি নোডের পয়েন্টারে পূর্ণ একটি অ্যারে (বা হ্যাশম্যাপ) রাখতেও পারেন। এটি ও (1) প্রদত্ত নোডে অ্যাক্সেসের অনুমতি দেয় তবে মেমরির ব্যবহারটি কিছুটা বাড়িয়ে তোলে। N যদি নোডের সংখ্যা হয় এবং e প্রান্তগুলির সংখ্যা হয় তবে এই পদ্ধতির স্পেস জটিলতা হবে ও (এন + ই)।

ম্যাট্রিক্স পদ্ধতির জন্য স্পেস জটিলতা ও (এন ^ 2) এর লাইনের সাথে হবে (ধরে নিচ্ছেন প্রান্তগুলি একমুখী হয়)। যদি আপনার গ্রাফ অপ্রয়োজনীয় হয় তবে আপনার ম্যাট্রিক্সে প্রচুর খালি ঘর থাকবে। তবে যদি আপনার গ্রাফটি সম্পূর্ণ সংযুক্ত থাকে (e = n ^ 2), এটি প্রথম পদ্ধতির সাথে অনুকূলভাবে তুলনা করে। আরজি যেমন বলেছে, আপনি যদি ম্যাট্রিক্সকে এক অংশের মেমোরির জন্য বরাদ্দ করেন তবে এই পদ্ধতির সাথে আপনার ক্যাশেও কম মিস হতে পারে যা গ্রাফের চারপাশে প্রচুর প্রান্তগুলি দ্রুত তৈরি করতে পারে।

তৃতীয় পদ্ধতি সম্ভবত বেশিরভাগ ক্ষেত্রে - ও (ই) - এর ক্ষেত্রে সবচেয়ে স্পেস দক্ষ, তবে প্রদত্ত নোডের সমস্ত প্রান্ত একটি হে (ই) কোরিয়ার সন্ধান করতে পারে। আমি এমন কোনও ক্ষেত্রে ভাবতে পারি না যেখানে এটি খুব কার্যকর হবে।


প্রান্ত তালিকাটি কৃসকলের অ্যালগরিদমের পক্ষে স্বাভাবিক ("প্রতিটি প্রান্তের জন্য, ইউনিয়ন- সন্ধানে সন্ধান করুন")। এছাড়াও, স্কিয়েনা (দ্বিতীয় সংস্করণ, পৃষ্ঠা 157) তার গ্রন্থাগার Combinatorica (যা অনেক অ্যালগরিদমের একটি সাধারণ উদ্দেশ্য গ্রন্থাগার) গ্রাফের জন্য প্রাথমিক তথ্য কাঠামো হিসাবে প্রান্ত তালিকা সম্পর্কে কথা বলে । তিনি উল্লেখ করেন যে এর অন্যতম কারণ হ'ল গণিতের গণনা মডেল দ্বারা আরোপিত প্রতিবন্ধকতা, যা কম্বিনেটরিকা যে পরিবেশে বাস করে।
এভেজেনি সার্জিভ


4

আরেকটি বিকল্প রয়েছে: অবজেক্ট হিসাবে নোডস, অবজেক্টস হিসাবে প্রান্তও, প্রতিটি প্রান্ত একই সাথে দুটি দ্বিগুণ-লিঙ্কযুক্ত তালিকার মধ্যে রয়েছে: একই নোড থেকে সমস্ত প্রান্তের তালিকা এবং একই নোডে যাওয়া সমস্ত প্রান্তের তালিকা ।

struct Node {
    ... node payload ...
    Edge *first_in;    // All incoming edges
    Edge *first_out;   // All outgoing edges
};

struct Edge {
    ... edge payload ...
    Node *from, *to;
    Edge *prev_in_from, *next_in_from; // dlist of same "from"
    Edge *prev_in_to, *next_in_to;     // dlist of same "to"
};

মেমরির ওভারহেডটি বড় (নোডের জন্য 2 পয়েন্টার এবং প্রান্তে 6 পয়েন্টার) তবে আপনি পান

  • ও (1) নোড সন্নিবেশ
  • O (1) প্রান্ত সন্নিবেশ ("থেকে" এবং "থেকে" নোডগুলিতে পয়েন্টার দেওয়া হয়েছে)
  • ও (1) প্রান্ত মোছা (পয়েন্টারটি দেওয়া)
  • ও (ডিগ্রি (এন)) নোড মোছা (পয়েন্টারটি দেওয়া)
  • ও (ডিগ্রি (এন)) নোডের প্রতিবেশী সন্ধান করছে

কাঠামোটি বরং একটি সাধারণ গ্রাফকে উপস্থাপন করতে পারে: লুপগুলি সহ ওরিয়েন্টেড মাল্টিগ্রাফ (যেমন আপনার একাধিক স্বতন্ত্র লুপগুলি - এক্স থেকে এক্সে প্রান্তে প্রান্তগুলি সহ একই দুটি নোডের মধ্যে একাধিক স্বতন্ত্র প্রান্ত থাকতে পারে)।

এই পদ্ধতির আরও বিশদ বিবরণ এখানে পাওয়া যায়


3

ঠিক আছে, সুতরাং প্রান্তগুলি যদি ওজন না করে তবে ম্যাট্রিক্স বাইনারি অ্যারে হতে পারে এবং বাইনারি অপারেটরগুলি ব্যবহার করে জিনিসগুলি সত্যই সত্যিই যেতে পারে, সেই ক্ষেত্রে খুব দ্রুত।

যদি গ্রাফটি খুব কম হয় তবে অবজেক্ট / পয়েন্টার পদ্ধতিটি অনেক বেশি দক্ষ বলে মনে হচ্ছে। বিশেষভাবে কোনও একক মেমোরির মধ্যে এঁকে দেওয়ার জন্য নির্দিষ্ট করে ডেটা স্ট্রাকচারে অবজেক্ট / পয়েন্টারগুলি ধরে রাখা ভাল পরিকল্পনা বা তাদের একসাথে থাকার অন্য কোনও পদ্ধতি হতে পারে।

সংলগ্ন তালিকা - কেবল সংযুক্ত নোডগুলির একটি তালিকা - এটিকে এখন পর্যন্ত সবচেয়ে স্মৃতিশক্তি দক্ষ বলে মনে হচ্ছে, তবে সম্ভবত এটি সবচেয়ে ধীরতমও।

একটি নির্দেশ গ্রাফ Reversing হয় সহজ এবং ম্যাট্রিক্স উপস্থাপনা সঙ্গে, সহজ অন্তিক তালিকা সঙ্গে, কিন্তু বস্তুর / পয়েন্টার উপস্থাপনা সঙ্গে এত বড় নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.