সি ++ তে গ্রাফ সমস্যার জন্য সংযুক্তি তালিকা বা সংলগ্ন ম্যাট্রিকগুলি আরও ভাল কী?


129

সি ++ তে গ্রাফ সমস্যার জন্য আরও ভাল, সংলগ্ন তালিকা বা সংলগ্ন ম্যাট্রিক্স কী? প্রতিটি সুযোগসুবিধা এবং অসুবিধেও কি কি?


21
আপনি যে কাঠামোটি ব্যবহার করেন সেটি ভাষার উপর নির্ভর করে না তবে আপনি যে সমস্যার সমাধান করতে চাইছেন তার উপর নির্ভর করে।
অবাকর

1
আমি জিক্স্ট্রা অ্যালগরিদমের মতো সাধারণ ব্যবহারের জন্য বলতে চেয়েছিলাম, আমি এই প্রশ্নটি জিজ্ঞাসা করলাম কারণ আমি জানি না যে লিড তালিকা প্রয়োগকরণের চেষ্টা করার কারণে এটি কোডটি সংলগ্ন ম্যাট্রিক্সের চেয়ে কঠিন।
Magiix

সি ++ এ তালিকাগুলি টাইপ করার মতোই সহজ std::list(বা আরও ভাল, std::vector)।
অবাকর

1
@ ওভাকার: বা std::dequeবা std::set। সময়ের সাথে সাথে গ্রাফটি কীভাবে পরিবর্তিত হবে এবং কোন অ্যালগরিদমগুলি আপনি এগুলি চালানোর পরিকল্পনা করছেন তার উপর নির্ভর করে।
আলেকজান্দ্রি সি

উত্তর:


125

এটি সমস্যার উপর নির্ভর করে।

অন্তিক ম্যাট্রিক্স

  • ও (এন ^ 2) মেমরি ব্যবহার করে
  • এটি দেখার পক্ষে দ্রুত এবং
    কোনও দুটি নোড ও (1) এর মধ্যে একটি নির্দিষ্ট প্রান্তের উপস্থিতি বা অনুপস্থিতির জন্য পরীক্ষা করা
  • সমস্ত প্রান্তে এটি পুনরাবৃত্তি করতে ধীর
  • এটি কোনও নোড যুক্ত / মুছে ফেলা ধীর; একটি জটিল অপারেশন হে (এন ^ 2)
  • এটি একটি নতুন প্রান্ত O (1) যুক্ত করা দ্রুত

সংলগ্ন তালিকা

  • মেমরির ব্যবহার প্রান্তের সংখ্যার উপর নির্ভর করে (নোডের সংখ্যা নয়),
    যদি সংলগ্ন ম্যাট্রিক্স বিস্মৃত হয় তবে প্রচুর স্মৃতি সঞ্চয় করতে পারে
  • যে কোনও দুটি নোডের মধ্যে নির্দিষ্ট প্রান্তের উপস্থিতি বা অনুপস্থিতি খুঁজে পাওয়া
    ম্যাট্রিক্স ও (কে) এর তুলনায় কিছুটা ধীর গতিতে; যেখানে কে প্রতিবেশী নোডের সংখ্যা
  • সমস্ত প্রান্তে পুনরাবৃত্তি করা দ্রুত কারণ আপনি যে কোনও নোড প্রতিবেশীকে সরাসরি অ্যাক্সেস করতে পারেন
  • কোনও নোড যুক্ত / মুছে ফেলা দ্রুত; ম্যাট্রিক্স উপস্থাপনার চেয়ে সহজ
  • এটি একটি নতুন প্রান্ত যুক্ত করতে দ্রুত ও (1)

লিঙ্কযুক্ত তালিকাগুলি কোড করা শক্ত, আপনি কি মনে করেন যে বাস্তবায়ন এটি শেখার জন্য কিছুটা ব্যয় করার উপযুক্ত?
Magiix

11
@ ম্যাগিক্স: হ্যাঁ আমার মনে হয় আপনার যদি প্রয়োজন হয় তবে লিঙ্কযুক্ত তালিকাগুলি কীভাবে কোড করা যায় তা আপনার বোঝা উচিত, তবে চাকাটি পুনরায় উদ্ভাবন
মার্ক বাইয়ার্স

যে কোনও লিঙ্কযুক্ত তালিকার বিন্যাসে ব্রেথথ প্রথম অনুসন্ধানের জন্য একটি পরিষ্কার কোডের সাথে একটি লিঙ্ক সরবরাহ করতে পারে ??
Magiix


78

এই উত্তরটি কেবল সি ++ এর জন্য নয় কারণ বর্ণিত ভাষা নির্বিশেষে সমস্ত কিছু ডেটা কাঠামো সম্পর্কে about এবং, আমার উত্তর ধরে নেওয়া হচ্ছে যে আপনি সংলগ্ন তালিকা এবং ম্যাট্রিকগুলির প্রাথমিক কাঠামোটি জানেন।

স্মৃতি

স্মৃতি যদি আপনার প্রাথমিক উদ্বেগ হয় তবে আপনি একটি সহজ গ্রাফের জন্য এই সূত্রটি অনুসরণ করতে পারেন যা লুপগুলিকে অনুমতি দেয়:

একটি সন্নিহিত অবস্থা ম্যাট্রিক্স এন দখল করে 2 /8 বাইট স্থান (এন্ট্রি প্রতি এক বিট)।

একটি সংলগ্ন তালিকা 8e স্থান দখল করে, যেখানে ই প্রান্তগুলির সংখ্যা (32 বিট কম্পিউটার)।

যদি আমরা গ্রাফের ঘনত্বকে ডি = ই / এন 2 (প্রান্তের সর্বাধিক সংখ্যা দ্বারা বিভক্ত প্রান্তের সংখ্যা ) হিসাবে সংজ্ঞায়িত করি তবে আমরা "ব্রেকপয়েন্ট" খুঁজে পেতে পারি যেখানে একটি তালিকা ম্যাট্রিক্সের চেয়ে আরও বেশি স্মৃতি গ্রহণ করে:

8E> এন 2 /8 যখন ঘ> 1/64

সুতরাং এই সংখ্যাগুলির সাথে (এখনও 32-বিট নির্দিষ্ট) ব্রেকপয়েন্টটি 1/64অবতরণ করে । ঘনত্ব (ই / এন 2 ) যদি 1/64 এর চেয়ে বড় হয় তবে মেমরি সংরক্ষণ করতে চাইলে একটি ম্যাট্রিক্সই পছন্দনীয়।

আপনি উইকিপিডিয়া (সংলগ্ন ম্যাট্রিক্সের নিবন্ধ) এবং অন্যান্য অনেকগুলি সাইট এ এটি পড়তে পারেন ।

পার্শ্ব দ্রষ্টব্য : একটি হ্যাশ টেবিল ব্যবহার করে সংলগ্ন ম্যাট্রিক্সের স্পেস-দক্ষতা উন্নত করতে পারে যেখানে কীগুলি ভার্টিক্সের জোড়া (কেবল পুনর্নির্দেশিত) হয়।

Iteration এবং সন্ধান

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

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

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


9
অন্তর্দৃষ্টি জন্য +1, তবে এটি সংলগ্ন তালিকা সঞ্চয় করতে ব্যবহৃত প্রকৃত ডেটা কাঠামো দ্বারা সংশোধন করতে হবে। আপনি প্রতিটি শিরোনামের জন্য এটির সংলগ্ন তালিকার মানচিত্র বা ভেক্টর হিসাবে সঞ্চয় করতে চাইতে পারেন, সেক্ষেত্রে আপনার সূত্রগুলিতে প্রকৃত সংখ্যাগুলি আপডেট করতে হবে। এছাড়াও, নির্দিষ্ট অ্যালগরিদমের সময় জটিলতার জন্য ব্রেক-ইওন পয়েন্টগুলি মূল্যায়নের জন্য অনুরূপ গণনাগুলি ব্যবহার করা যেতে পারে।
আলেকজান্দ্রি সি

3
হ্যাঁ, এই সূত্রটি একটি নির্দিষ্ট দৃশ্যের জন্য। আপনি যদি কোনও মোটামুটি উত্তর চান, তবে এগিয়ে যান এবং এই সূত্রটি ব্যবহার করুন, বা আপনার প্রয়োজনীয়তা অনুসারে এটি পরিবর্তন করুন (উদাহরণস্বরূপ, বেশিরভাগ লোকের আজকাল একটি 64 বিট কম্পিউটার রয়েছে :))
কীজার

1
আগ্রহীদের জন্য, ব্রেকিং পয়েন্টের জন্য সূত্রটি (এন নোডের একটি গ্রাফের সর্বাধিক সংখ্যার গড় সংখ্যা) e = n / sযেখানে sপয়েন্টারের আকার।
deceleratedcaviar

33

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

কোন ভুল আছে কিনা আমাকে বলুন।

এখানে চিত্র বর্ণনা লিখুন


যদি গ্রাফিকটি ঘন এক বা একটি বিচ্ছিন্ন হয় তবে এটি জানা না থাকে তবে সংলগ্ন তালিকার জন্য স্থান জটিলতা ও (ভি + ই) হবে কি বলা ঠিক হবে?

বেশিরভাগ ব্যবহারিক অ্যালগরিদমগুলির জন্য, একটি সর্বাধিক গুরুত্বপূর্ণ ক্রিয়াকলাপ একটি প্রদত্ত প্রান্তের বাইরে গিয়ে সমস্ত প্রান্ত দিয়ে পুনরাবৃত্তি করছে। আপনি এটি আপনার তালিকায় যুক্ত করতে চাইতে পারেন - এটি AL এর জন্য ও (ডিগ্রি) এবং এএম এর জন্য ও (ভি)।
সর্বোচ্চ

@ জোহনারেড বলা ভাল নয় যে AL এর জন্য একটি ভার্টেক্স (সময়) যুক্ত করা হ'ল ও (1) কারণ ও (এন) এর পরিবর্তে আমরা সত্যিই একটি শীর্ষবিন্দু যুক্ত করার প্রান্ত যুক্ত করি না। একটি প্রান্ত যোগ করা একটি পৃথক অপারেশন হিসাবে মোকাবেলা করা যেতে পারে। এএম এর জন্য এটি অ্যাকাউন্টে অর্থবোধ করে তবে আমাদের সেখানে কেবল প্রাসঙ্গিক সারি এবং নতুন ভার্টেক্সের কলামটি শূন্যে শুরু করতে হবে। এমনকি এএম এর জন্য প্রান্ত যোগ করার জন্য পৃথকভাবে হিসাব করা যেতে পারে।
উসমান

কীভাবে AL O (V) তে একটি ভার্টেক্স যুক্ত করা হচ্ছে? আমাদের একটি নতুন ম্যাট্রিক্স তৈরি করতে হবে, এর মধ্যে পূর্ববর্তী মানগুলি অনুলিপি করতে হবে। এটি ও (ভি ^ 2) হওয়া উচিত।
অ্যালেক্স_বান

19

এটি আপনি যা খুঁজছেন তার উপর নির্ভর করে।

সঙ্গে সন্নিহিত অবস্থা ম্যাট্রিক্স আপনি দুই ছেদচিহ্ন মধ্যে একটি নির্দিষ্ট প্রান্ত গ্রাফ জন্যে যদি সংক্রান্ত প্রশ্নের দ্রুত উত্তর দিতে পারেন, এবং আপনি দ্রুত সন্নিবেশ এবং প্রান্ত মুছে থাকতে পারে। খারাপ দিকটি হ'ল আপনাকে অতিরিক্ত স্থান ব্যবহার করতে হবে, বিশেষত অনেকগুলি উল্লম্ব বিশিষ্ট গ্রাফগুলির জন্য, যা খুব অকার্যকর, বিশেষত যদি আপনার গ্রাফটি খুব কম থাকে।

অন্যদিকে, সংলগ্ন তালিকার সাথে একটি প্রদত্ত প্রান্তটি গ্রাফের মধ্যে রয়েছে কিনা তা পরীক্ষা করা শক্ত, কারণ আপনি প্রান্তটি সন্ধান করতে উপযুক্ত তালিকার মাধ্যমে অনুসন্ধান করতে হবে, তবে তারা আরও স্থান দক্ষ।

সাধারণত যদিও, সংলগ্ন তালিকাগুলি গ্রাফের বেশিরভাগ অ্যাপ্লিকেশনের জন্য সঠিক ডেটা কাঠামো।


আপনি যদি সংলগ্ন তালিকা সঞ্চয় করতে অভিধান ব্যবহার করেন তবে এটি আপনাকে ও (1) মোড়ের সময়কালে একটি প্রান্তের উপস্থিতি দেবে।
রোহিত ইরাভোথুলা

10

যাক অনুমান আমরা গ্রাফ যা হয়েছে আছে এন নোড এবং সংখ্যা মি প্রান্ত সংখ্যা,

উদাহরণ গ্রাফ
এখানে চিত্র বর্ণনা লিখুন

অ্যাডজেসেন্সি ম্যাট্রিক্স: আমরা এমন একটি ম্যাট্রিক্স তৈরি করছি যার মধ্যে n সংখ্যা এবং সারিগুলির কলাম রয়েছে সুতরাং মেমরির ক্ষেত্রে এটি স্থান নেবে যা আনুপাতিক সমান 2ইউ এবং ভি হিসাবে চিহ্নিত দুটি নোডের মধ্যে একটি প্রান্ত রয়েছে কিনা তা পরীক্ষা করে নিতে Θ (1) সময় লাগবে। উদাহরণস্বরূপ (1, 2) এর জন্য পরীক্ষা করা কোডের নীচের মত দেখতে একটি প্রান্ত হবে:

if(matrix[1][2] == 1)

আপনি যদি সমস্ত প্রান্ত সনাক্ত করতে চান তবে আপনাকে ম্যাট্রিক্সের মাধ্যমে পুনরাবৃত্তি করতে হবে এতে দুটি নেস্টেড লুপ লাগবে এবং এটি Θ (n 2 ) নেবে । (আপনি সমস্ত প্রান্ত নির্ধারণ করতে ম্যাট্রিক্সের উপরের ত্রিভুজাকার অংশটি ব্যবহার করতে পারেন তবে এটি আবার হবে Θ (এন 2 ))

সংলগ্ন তালিকা: আমরা একটি তালিকা তৈরি করছি যা প্রতিটি নোড অন্য তালিকার দিকেও নির্দেশ করে। আপনার তালিকায় এন উপাদান থাকবে এবং প্রতিটি উপাদান একটি তালিকাতে নির্দেশ করবে যাতে এই নোডের প্রতিবেশীর সংখ্যার সমান আইটেমের সংখ্যা রয়েছে (আরও ভাল চিত্রের জন্য চিত্রটি দেখুন)। সুতরাং এটি মেমরির ক্ষেত্রে স্থান নেবে যা আনুপাতিক n + মি । (ইউ, ভি) প্রান্ত কিনা তা পরীক্ষা করাতে ও (ডিগ্রি (ইউ)) সময় লাগবে যেখানে ডিগ্রি (ইউ) আপনার প্রতিবেশীর সংখ্যার সমান হবে। কারণ সর্বাধিক, আপনাকে তালিকা দ্বারা পুনরাবৃত্তি করতে হবে যা ইউ দ্বারা নির্দেশিত। সমস্ত প্রান্ত সনাক্ত করতে Θ (n + মি) লাগবে।

উদাহরণ গ্রাফের সংলগ্নতার তালিকা

এখানে চিত্র বর্ণনা লিখুন
আপনার প্রয়োজন অনুযায়ী আপনার পছন্দ করা উচিত। আমার খ্যাতির কারণে আমি ম্যাট্রিক্সের চিত্র রাখতে পারিনি, এর জন্য দুঃখিত


7

আপনি যদি সি ++ তে গ্রাফ বিশ্লেষণের দিকে লক্ষ্য করছেন তবে সম্ভবত প্রথম স্থানটি হ'ল বুস্ট গ্রাফ লাইব্রেরি , যা বিএফএস সহ বেশ কয়েকটি অ্যালগোরিদম প্রয়োগ করে।

সম্পাদনা

এসও সম্পর্কিত এই পূর্ববর্তী প্রশ্নটি সম্ভবত সহায়তা করবে:

কীভাবে-তৈরি-এসি-বুস্ট-অন-ডায়রেক্টেড-গ্রাফ-এবং-ট্র্যাভার্স-এটি-গভীরতায়-প্রথম-স্যারাক এইচ


আপনাকে ধন্যবাদ আমি এই লাইব্রেরিটি চেক করব
Magiix

বুফ গ্রাফের জন্য +1। এটি যাওয়ার উপায় (এটি যদি শিক্ষামূলক উদ্দেশ্যে হয় তবে অবশ্যই বাদে)
ট্রিস্ট্রাম গ্রাবেনার

5

এটি সর্বোত্তম উদাহরণ সহ উত্তর দেওয়া হয়।

উদাহরণস্বরূপ ফ্লয়েড-ওয়ারশাল সম্পর্কে চিন্তা করুন । আমাদের একটি সংলগ্ন ম্যাট্রিক্স ব্যবহার করতে হবে, বা অ্যালগরিদম asyptotically ধীর হবে।

অথবা যদি এটি 30,000 শীর্ষে একটি ঘন গ্রাফ হয়? তারপরে একটি সংলগ্ন ম্যাট্রিক্সটি বোধগম্য হতে পারে, যেহেতু আপনি প্রান্তের প্রতি 16 বিট (সর্বনিম্ন যা আপনার সংলগ্ন তালিকার জন্য প্রয়োজন হবে) এর চেয়ে 1 টি বিট বিভাজক স্টোর করে যাবেন: এটি 107 মেগাবাইট নয়, বরং 1.7 জিবি।

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


2
ডিএফএস এবং বিএফএসের মতো অ্যালগরিদমগুলির জন্য, আপনি যদি ম্যাট্রিক্স ব্যবহার করেন তবে প্রতিবার সংলগ্ন নোডগুলি খুঁজতে চাইলে আপনাকে পুরো সারিটি পরীক্ষা করতে হবে, যেখানে আপনার কাছে ইতিমধ্যে একটি সংলগ্ন তালিকায় সংলগ্ন নোড রয়েছে। কেন আপনি an adjacency list is as good as a matrixএই ক্ষেত্রে মনে করেন?
realUser404

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

3

মেমরি ব্যবহার সম্পর্কে keyser5053 এর উত্তর যুক্ত করতে।

যে কোনও নির্দেশিত গ্রাফের জন্য, একটি সংলগ্ন ম্যাট্রিক্স (প্রতিটি প্রান্তে 1 বিট) n^2 * (1)মেমরির বিট গ্রহণ করে।

একটি জন্য সম্পূর্ণ গ্রাফ , একটি সন্নিহিত অবস্থা তালিকা (64 বিট পয়েন্টার সঙ্গে) হ্রাস n * (n * 64)মেমরি বিট, তালিকা ওভারহেড ব্যতীত।

অসম্পূর্ণ গ্রাফের জন্য, একটি সংলগ্ন তালিকা 0মেমরির বিট গ্রহণ করে, তালিকার ওভারহেড ব্যতীত।


সংলগ্ন তালিকার জন্য, আপনি eকোনও সন্নিবেশ ম্যাট্রিক্স মেমরির জন্য অনুকূল হওয়ার আগে সর্বাধিক প্রান্ত ( ) নির্ধারণ করতে অনুসরণ সূত্রটি ব্যবহার করতে পারেন ।

edges = n^2 / sসর্বোচ্চ সীমা নির্ধারণ করতে, sপ্ল্যাটফর্মের পয়েন্টার আকারটি কোথায় ।

যদি আপনার গ্রাফটি গতিশীলভাবে আপডেট হয় তবে আপনি গড় দক্ষতা গণনা (প্রতি নোড) দিয়ে এই দক্ষতা বজায় রাখতে পারেন n / s


Bit৪ বিট পয়েন্টার এবং ডায়নামিক গ্রাফ সহ কয়েকটি উদাহরণ (একটি ডায়নামিক গ্রাফ পরিবর্তনের পরে সমস্যার সমাধান দক্ষতার সাথে আপডেট করে, পরিবর্তনের পরে প্রতিবার এটি স্ক্র্যাচ থেকে পুনরবৃত্ত করার চেয়ে।)

নির্দেশিত গ্রাফের জন্য, যেখানে n300 হয়, সংলগ্ন তালিকা ব্যবহার করে নোডের প্রতি প্রান্তের সর্বোত্তম সংখ্যাটি হ'ল:

= 300 / 64
= 4

যদি আমরা এটি keyser5053 সূত্রে প্লাগ করি, d = e / n^2( eমোট প্রান্ত গণনাটি কোথায় ), আমরা দেখতে পারি যে আমরা ব্রেক পয়েন্টের নীচে ( 1 / s):

d = (4 * 300) / (300 * 300)
d < 1/64
aka 0.0133 < 0.0156

তবে, পয়েন্টারের জন্য 64 বিট ওভারকিল হতে পারে। আপনি যদি পরিবর্তে পয়েন্টার অফসেট হিসাবে 16 বিট ইন্টিজার ব্যবহার করেন তবে ব্রেকিং পয়েন্টের আগে আমরা 18 টি প্রান্তের মধ্যে ফিট করতে পারি।

= 300 / 16
= 18

d = ((18 * 300) / (300^2))
d < 1/16
aka 0.06 < 0.0625

এই উদাহরণগুলির প্রত্যেকটি সংলগ্নতার ওভারহেড উপেক্ষা করে তাদের তালিকা করে ( 64*2একটি ভেক্টর এবং 64 বিট পয়েন্টারগুলির জন্য)।


আমি অংশটি বুঝতে d = (4 * 300) / (300 * 300)পারি না, এটি হওয়া উচিত নয় d = 4 / (300 * 300)? সূত্রটি যেহেতু d = e / n^2
সৌরভ

2

অ্যাডজেসেন্সি ম্যাট্রিক্স বাস্তবায়নের উপর নির্ভর করে দক্ষ প্রয়োগের জন্য গ্রাফের 'n' আগে জানা উচিত। যদি গ্রাফটি খুব গতিশীল হয় এবং ম্যাট্রিক্সের বিস্তৃতি প্রয়োজন এখন এবং তারপরেও এটি একটি নেতিবাচক হিসাবে গণ্য করা যেতে পারে?


1

আপনি যদি সংলগ্ন ম্যাট্রিক্স বা তালিকার পরিবর্তে হ্যাশ টেবিল ব্যবহার করেন তবে আপনি সমস্ত ক্রিয়াকলাপের জন্য আরও ভাল বা একই বিগ-ও রান-টাইম এবং স্পেস পাবেন (একটি প্রান্তের জন্য পরীক্ষা করা হচ্ছে O(1), সমস্ত সংলগ্ন প্রান্তগুলি পাওয়া O(degree)ইত্যাদি)।

রান-টাইম এবং স্পেস উভয়ের জন্যই কিছু ধ্রুবক ফ্যাক্টর ওভারহেড রয়েছে (হ্যাশ টেবিলটি লিঙ্কযুক্ত তালিকা বা অ্যারে দেখার মতো তত দ্রুত নয় এবং সংঘর্ষগুলি হ্রাস করতে একটি শালীন পরিমাণের অতিরিক্ত জায়গা নেয়)।


1

আমি কেবল নিয়মিত সংলগ্ন তালিকার উপস্থাপনের বাণিজ্য বন্ধ করতে পেরেছি, যেহেতু অন্যান্য উত্তরগুলি অন্যান্য দিকগুলি কভার করেছে।

অভিধান এবং হ্যাশসেট ডেটা স্ট্রাকচারের সুবিধা গ্রহণ করে নিয়মিত ধ্রুবক সময়ে এডজেক্সিস্ট ক্যোয়ারীর সাথে সংলগ্ন তালিকার একটি গ্রাফ উপস্থাপন করা সম্ভব । ধারণাটি হ'ল একটি অভিধানে শীর্ষে রাখা এবং প্রতিটি শীর্ষবিন্দুর জন্য আমরা একটি হ্যাশ সেট রাখি যা এর সাথে অন্য প্রান্তে প্রান্তে থাকে to

এই প্রয়োগে একটি ছোটখাটো বাণিজ্য বন্ধ হ'ল নিয়মিত সংলগ্ন তালিকার মতো ও (ভি + ই) এর পরিবর্তে এর স্পেস জটিলতা ও (ভি + 2 ই) থাকবে, যেহেতু প্রান্তগুলি এখানে দু'বার উপস্থাপন করা হয়েছে (কারণ প্রতিটি ভার্টেক্সের নিজস্ব হ্যাশ সেট রয়েছে প্রান্তের)। কিন্তু যেমন অপারেশন AddVertex , AddEdge , RemoveEdge amortized সময় হে (1) এই বাস্তবায়ন করা যাবে, ছাড়া RemoveVertex যা হে (v) অন্তিক ম্যাট্রিক্স মত লাগে। এর অর্থ হ'ল বাস্তবায়নের সরলতা ছাড়াও, সংলগ্ন ম্যাট্রিক্সের কোনও নির্দিষ্ট সুবিধা নেই। এই সংলগ্ন তালিকা বাস্তবায়নে আমরা প্রায় একই পারফরম্যান্সের সাথে স্পারস গ্রাফে স্থান সংরক্ষণ করতে পারি।

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

উন্নত-আলগোরিদিম

দ্রষ্টব্য: আমি বিশ্বাস করি যে অলস মুছে ফেলা ব্যবহার করে আমরা অপসারণকারী ও (1) এর থেকে রিমোটারটেক্স অপারেশনটিকে আরও অনুকূল করতে পারি , যদিও আমি সেই ধারণাটি পরীক্ষা করে নিই। উদাহরণস্বরূপ, মুছে ফেলার পরে অভিধানে মুছে ফেলা হিসাবে শীর্ষস্থানটি চিহ্নিত করুন এবং তারপরে অন্যান্য ক্রিয়াকলাপের সময় অলসভাবে এতিম প্রান্তগুলি সাফ করুন।


সংলগ্ন ম্যাট্রিক্সের জন্য, ভার্টেক্স সরান O (V ^ 2) ও (ভি) নয়
সৌরভ

হ্যাঁ. তবে আপনি যদি অ্যারে সূচকগুলি ট্র্যাক করতে কোনও অভিধান ব্যবহার করেন তবে তা নেমে যাবে ও (ভি)। এই সরানভের্টেক্স বাস্তবায়নটি একবার দেখুন।
justcoding121
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.