গতিশীল গ্রাফে সংযুক্ত উপাদান সম্পর্কিত তথ্য বজায় রাখার জন্য সবচেয়ে দক্ষ অ্যালগরিদম এবং ডেটা কাঠামো কী?


9

বলুন আমার কাছে একটি অপ্রচলিত সীমাবদ্ধ স্পার্স গ্রাফ রয়েছে এবং নিম্নলিখিত প্রশ্নগুলি দক্ষতার সাথে চালাতে সক্ষম হওয়া প্রয়োজন:

  • আমিগুলিসিএনএনটি(এন1,এন2) - রিটার্ন টি এর মধ্যে যদি কোনও পথ থাকে এন1 এবং এন2অন্যথায় এফ
  • সিএনএনটিএনগুলি(এন) - নোডগুলির সেটটি পৌঁছায় যা থেকে পৌঁছানো যায় এন

এটি সহজেই গ্রাফের সাথে সংযুক্ত উপাদানগুলির প্রাক-কম্পিউটিংয়ের মাধ্যমে সম্পন্ন হয়। উভয় প্রশ্নের মধ্যে চলতে পারেহে(1) সময়।

যদি আমাকেও নির্বিচারে প্রান্তগুলি যুক্ত করতে সক্ষম হতে হয় - একজন(এন1,এন2)- তারপরে আমি উপাদানগুলিকে একটি ডিসজেয়েন্ট-সেট ডেটা স্ট্রাকচারে সঞ্চয় করতে পারি । যখনই একটি প্রান্ত যুক্ত করা হবে, যদি এটি বিভিন্ন উপাদানগুলিতে দুটি নোডকে সংযুক্ত করে, আমি সেই উপাদানগুলিকে একীভূত করব। এটি যুক্ত করেহে(1) খরচ একজন এবং হে(আমিএনবনামRগুলিএকজনRমিএকটিএনএন(|এনগুলি|)) খরচ আমিগুলিসিএনএনটি এবং সিএনএনটিএনগুলি (যা পাশাপাশি হতে পারে) হে(1))।

যদি আমাকেও নির্বিচারে প্রান্তগুলি সরাতে সক্ষম হতে হয় তবে এই পরিস্থিতিটি পরিচালনা করার জন্য সেরা ডেটা স্ট্রাকচার কী? একটি পরিচিত হয়? সংক্ষিপ্তসার হিসাবে, এটি নিম্নলিখিত ক্রিয়াকলাপগুলি দক্ষতার সাথে সমর্থন করা উচিত:

  • আমিগুলিসিএনএনটি(এন1,এন2) - রিটার্ন টি এর মধ্যে যদি কোনও পথ থাকে এন1 এবং এন2অন্যথায় এফ
  • সিএনএনটিএনগুলি(এন) - নোডগুলির সেটটি পৌঁছায় যা থেকে পৌঁছানো যায় এন
  • একজন(এন1,এন2)- দুটি নোডের মধ্যে একটি প্রান্ত যুক্ত করে। মনে রাখবেন যেএন1, এন2 অথবা উভয়ই এর আগে থাকতে পারে না।
  • আরমিবনাম(এন1,এন2) - দুটি নোডের মধ্যে বিদ্যমান প্রান্তটি সরিয়ে দেয়।

(আমি গেম বিকাশের দৃষ্টিকোণ থেকে এটি আগ্রহী - এই সমস্যাটি বেশ কয়েকটি পরিস্থিতিতে ঘটেছিল বলে মনে হচ্ছে Maybe প্লেয়ারটি বিদ্যুতের লাইন তৈরি করতে পারে এবং জেনারেটর কোনও ভবনের সাথে সংযুক্ত কিনা তা আমাদের জানতে হবে Maybe প্লেয়ারটি লক করতে পারে এবং দরজা আনলক করুন এবং আমাদের জানতে হবে যে কোনও শত্রু খেলোয়াড়ের কাছে পৌঁছতে পারে কিনা But তবে এটি একটি খুব সাধারণ সমস্যা, তাই আমি এটিকে এরকম করে দিয়েছি)


সিএনএনটিএনগুলি সম্ভবত চালানো যায়নি হে(1), কারণ এটি যদি একটি তালিকা ফেরত দেয় এন নোড, এটি প্রয়োজন হবে Ω(এন)সময়। বাস্তবায়নকারীসিএনএনটিএনগুলিএকটি বিএফএস সহ সর্বোত্তম, সুতরাং একটি সম্ভাব্য ডেটা স্ট্রাকচারের কেবল ইসকনেক্টেড, অ্যাডেজ এবং রিমুজেড সমর্থন করা প্রয়োজন। এটি আপনার প্রশ্ন প্রাসঙ্গিক বলে মনে হয়: stackoverflow.com/questions/7241151/...
টম ভ্যান ডার Zanden

@ টমভান্ডারজান্দেন ইতিমধ্যে নির্মিত একটি সেট ফেরত যাচ্ছেন (প্রোগ্রামিংয়ে, একটি পয়েন্টার বা রেফারেন্সে) হে(1)... যদিও এর ব্যবহারকারী খুব বেশি নেই সিএনএনটিএনগুলি এটা করতে পারে হে(1) এবং দ্বারা আবৃত না আমিগুলিসিএনএনটি
ব্যবহারকারী 253751

উত্তর:


11

এই সমস্যাটি গতিশীল সংযোগ হিসাবে পরিচিত এবং এটি তাত্ত্বিক কম্পিউটার বিজ্ঞান সম্প্রদায়ের গবেষণার একটি সক্রিয় ক্ষেত্র। এখনও কিছু গুরুত্বপূর্ণ সমস্যা এখনও এখানে খোলা আছে।

পরিভাষাটি পরিষ্কার হওয়ার জন্য, আপনি প্রান্তগুলি যুক্ত করতে এবং মুছতে চান তাই আপনি সম্পূর্ণ গতিশীল সংযোগের জন্য বলেন। হলম, ডি লিচেনবার্গ এবং থারআপ (জে.এসিএম 2001) এর ফলাফল রয়েছেহে(লগ2এন) আপডেট সময় এবং হে(লগএন/লগলগএন)প্রশ্নের সময়। আমার বোঝাপড়া থেকে এটি প্রয়োগযোগ্য বলে মনে হচ্ছে। সরলভাবে ডেটা কাঠামো বলার ফলে গাছগুলি ছড়িয়ে যাওয়ার একটি শ্রেণিবিন্যাস বজায় থাকে - এবং গাছগুলিতে গতিশীল সংযোগটি আচ্ছাদন করা সহজ। আমি ভাল ভিডিওর জন্য এখানে দেখুন এরিক ডি ডেমাইন এর নোটগুলিকে সুপারিশ করতে পারি । এরিকের নোটে অন্যান্য প্রাসঙ্গিক ফলাফলের পয়েন্টারও রয়েছে। একটি নোট হিসাবে: এই সমস্ত ফলাফল তাত্ত্বিক ফলাফল।

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

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