মূলত ডিএফএস বিএফএস নয়, গ্রাফগুলিতে একটি চক্র অনুসন্ধান করতে ব্যবহৃত হয়। কোন কারণ? গাছ / গ্রাফ অতিক্রমের সময় কোনও নোড ইতিমধ্যে পরিদর্শন করা হয়েছে কিনা তা উভয়ই দেখতে পাবেন can
মূলত ডিএফএস বিএফএস নয়, গ্রাফগুলিতে একটি চক্র অনুসন্ধান করতে ব্যবহৃত হয়। কোন কারণ? গাছ / গ্রাফ অতিক্রমের সময় কোনও নোড ইতিমধ্যে পরিদর্শন করা হয়েছে কিনা তা উভয়ই দেখতে পাবেন can
উত্তর:
আপনি যত তাড়াতাড়ি ব্যাকট্র্যাক করতে পারেন গভীরতার প্রথম অনুসন্ধান প্রস্থের প্রথম অনুসন্ধানের চেয়ে বেশি মেমরির দক্ষ। আপনি যদি কল স্ট্যাক ব্যবহার করেন তবে এটি কার্যকর করাও সহজ তবে এটি স্ট্যাককে উপচে না ফেলে দীর্ঘতম পথে নির্ভর করে।
এছাড়াও যদি আপনার গ্রাফটি নির্দেশিত হয় তবে আপনি কেবল কোনও নোডে গিয়েছেন কিনা তা আপনাকে কেবল মনে রাখতে হবে না, তবে আপনি কীভাবে সেখানে গিয়েছিলেন তাও আপনাকে মনে করতে হবে না। অন্যথায় আপনি ভাবতে পারেন যে আপনি একটি চক্র পেয়েছেন কিন্তু বাস্তবে আপনার সমস্ত দুটি পৃথক পাথ A-> B তবে এর অর্থ এই নয় যে সেখানে একটি পথ রয়েছে B-> A। উদাহরণ স্বরূপ,
আপনি যদি শুরু থেকে বিএফএস করেন তবে 0
এটি চক্রটি উপস্থিত হিসাবে সনাক্ত করবে তবে বাস্তবে কোনও চক্র নেই।
গভীরতার সাথে প্রথম অনুসন্ধানের মাধ্যমে আপনি নীচে নেমে যাবার সময় নোডগুলি চিহ্নিত করতে পারেন এবং ব্যাকট্র্যাক হিসাবে সেগুলি চিহ্নমুক্ত করতে পারেন। এই অ্যালগরিদমের উপর পারফরম্যান্স উন্নতির জন্য মন্তব্যগুলি দেখুন।
জন্য একটি নির্দেশ গ্রাফে চক্র সনাক্ত জন্য শ্রেষ্ঠ অ্যালগরিদম আপনি তাকান পারে Tarjan এর এলগরিদম ।
গ্রাফটি যদি পুনঃনির্দেশিত হয় তবে একটি বিএফএস যুক্তিসঙ্গত হতে পারে (বিএফএস ব্যবহার করে দক্ষ অ্যালগরিদম দেখানোর ক্ষেত্রে আমার অতিথি হোন যা নির্দেশিত গ্রাফের চক্রের প্রতিবেদন করবে!) যেখানে প্রতিটি "ক্রস এজ" একটি চক্রকে সংজ্ঞায়িত করে। যদি ক্রস প্রান্তটি হয় {v1, v2}
এবং মূল (বিএফএস গাছের মধ্যে) যে নোডগুলি থাকে r
তবে চক্রটি r ~ v1 - v2 ~ r
( ~
একটি পথ, -
একটি একক প্রান্ত), যা ডিএফএসের মতো প্রায় সহজেই রিপোর্ট করা যায়।
বিএফএস ব্যবহারের একমাত্র কারণ হ'ল যদি আপনি জানেন (আপনার নির্দেশিত) গ্রাফটি দীর্ঘ পথ এবং ছোট পাথ কভার করতে চলেছে (অন্য কথায় গভীর এবং সংকীর্ণ)। সেক্ষেত্রে, বিএফএসের ডিএফএসের স্ট্যাকের তুলনায় তার সারির জন্য আনুপাতিকভাবে কম স্মৃতি দরকার (উভয়টি এখনও অবশ্যই লিনিয়ার)।
অন্যান্য সমস্ত ক্ষেত্রে, ডিএফএস স্পষ্টভাবে বিজয়ী। এটি উভয় নির্দেশিত এবং পুনর্নির্দেশিত গ্রাফগুলিতে কাজ করে এবং চক্রগুলি প্রতিবেদন করা তুচ্ছ - কেবল পূর্বপুরুষ থেকে বংশধর পর্যন্ত পথে কোনও পিছনের প্রান্তটি সংকুচিত করে আপনি চক্রটি পান। সব মিলিয়ে এই সমস্যার জন্য বিএফএসের চেয়ে অনেক ভাল এবং ব্যবহারিক।
বিএফএস চক্র সন্ধানে নির্দেশিত গ্রাফের জন্য কাজ করবে না। A-> B এবং A-> C-> B কে গ্রাফের A থেকে B যাওয়ার পথ হিসাবে বিবেচনা করুন। বিএফএস বলবে যে বি পরিদর্শন করা হয়েছে তার একটি পথ ধরে যাওয়ার পরে। পরবর্তী পথে ভ্রমণ চালিয়ে যাওয়ার সময় এটি বলবে যে চিহ্নিত নোড বি আবার পাওয়া গেছে, সুতরাং, একটি চক্র রয়েছে। স্পষ্টতই এখানে কোনও চক্র নেই।
আমি জানি না কেন এমন পুরাতন প্রশ্নটি আমার ফিডে উঠল, তবে পূর্ববর্তী সমস্ত উত্তর খারাপ, তাই ...
নির্দেশিত গ্রাফগুলিতে চক্র খুঁজতে ডিএফএস ব্যবহার করা হয়, কারণ এটি কাজ করে ।
একটি ডিএফএসে, প্রতিটি শীর্ষবিন্দুটি "পরিদর্শন করা হয়", যেখানে একটি শীর্ষবিন্দু দেখার অর্থ:
সেই শীর্ষবিন্দু থেকে পৌঁছনীয় সাবগ্রাফারটি পরিদর্শন করা হয়েছে। এর মধ্যে এমন সমস্ত চিহ্নহীন প্রান্তগুলি চিহ্নিত করা রয়েছে যা সেই শীর্ষবিন্দু থেকে পৌঁছতে পারে এবং সমস্ত অ্যাক্সেসযোগ্য অপ্রকাশিত শীর্ষদিকগুলি ঘুরে দেখা যায়।
শীর্ষবিন্দু সমাপ্ত।
সমালোচনামূলক বৈশিষ্ট্যটি হ'ল শীর্ষবিন্দু থেকে সমস্তটি প্রান্তটি ভার্টেক্স শেষ হওয়ার আগে চিহ্নিত করা যায়। এটি ডিএফএসের একটি বৈশিষ্ট্য, তবে বিএফএসের নয়। আসলে এটি ডিএফএসের সংজ্ঞা।
এই বৈশিষ্ট্যের কারণে, আমরা জানি যে যখন একটি চক্রের প্রথম শীর্ষটি শুরু হয়:
সুতরাং, যদি কোনও চক্র থাকে, তবে আমরা একটি সূচিত-তবে-অসম্পূর্ণ ভার্টেক্স (2) এর একটি কিনারা পাওয়ার গ্যারান্টিযুক্ত এবং যদি আমরা এইরকম প্রান্ত পাই তবে আমাদের গ্যারান্টি দেওয়া আছে যে একটি চক্র রয়েছে (3)।
এজন্য ডিএফএস নির্দেশিত গ্রাফগুলিতে চক্র সন্ধান করতে ব্যবহৃত হয়।
বিএফএস এরকম কোনও গ্যারান্টি দেয় না, সুতরাং এটি কার্যকর হয় না। (পুরোপুরি ভাল চক্র-সন্ধানের আলগোরিদিমগুলিতে বিএফএস অন্তর্ভুক্ত বা উপ-প্রক্রিয়া হিসাবে অনুরূপ)
অন্যদিকে, একটি অপরিবর্তিত গ্রাফের একটি চক্র থাকে যখনই যেকোন জোড়ের ভার্টেক্সগুলির মধ্যে দুটি পথ থাকে, যেমন, যখন এটি গাছ না হয়। বিএফএস বা ডিএফএস উভয়ের মধ্যে এটি সনাক্ত করা সহজ - নতুন ভারটিক্সে চিহ্নিত প্রান্তগুলি একটি গাছ গঠন করে এবং অন্য কোনও প্রান্তটি একটি চক্রকে নির্দেশ করে।
আপনি যদি একটি গাছের এলোমেলো জায়গায় একটি চক্র স্থাপন করেন, ডিএফএস যখন প্রায় অর্ধেক গাছ আচ্ছাদিত হয় তখন চক্রটিকে আঘাত করতে পারে এবং চক্রটি যেখানে যায় সেখানে অর্ধেক সময় ইতিমধ্যে এটি পেরিয়ে যায়, এবং অর্ধেক সময় এটি হবে না ( এবং এটি গাছের অর্ধেকের মধ্যে গড়ে খুঁজে পাবেন), সুতরাং এটি গাছের গড় প্রায় 0.5 * 0.5 + 0.5 * 0.75 = 0.625 মূল্যায়ন করবে।
আপনি যদি একটি গাছের এলোমেলো স্থানে একটি চক্র স্থাপন করেন, বিএফএস কেবল তখনই চক্রটিকে আঘাত করবে যখন এটি গভীরতার সাথে গাছের স্তরটি মূল্যায়ন করবে। সুতরাং, আপনি সাধারণত একটি ভারসাম্য বাইনারি গাছের পাতাগুলি মূল্যায়ন করে শেষ করেন, যার ফলস্বরূপ গাছের আরও মূল্যায়ন হয়। বিশেষত, সময়ের 3/4 সময় অন্তত দুটি লিঙ্কের মধ্যে গাছের পাতাগুলি উপস্থিত হয় এবং সেই ক্ষেত্রে আপনার গাছের গড় 3/4 মূল্যায়ন করতে হয় (যদি একটি লিঙ্ক থাকে) বা 7 / গাছের 8 টি (যদি সেখানে দুটি থাকে), সুতরাং আপনি ইতিমধ্যে 1/2 * 3/4 + 1/4 * 7/8 = (7 + 12) / 32 = 21/32 = অনুসন্ধানের প্রত্যাশায় রয়েছেন 0.656 ... গাছের পাতার নোডগুলি থেকে দূরে যোগ করে একটি চক্রের সাথে একটি গাছ অনুসন্ধানের ব্যয়ও যোগ না করেই গাছটি।
এছাড়াও, বিএফএসের চেয়ে ডিএফএস কার্যকর করা সহজ। সুতরাং আপনি যদি আপনার চক্র সম্পর্কে কিছু না জেনে থাকেন তবে এটি ব্যবহার করার জন্য একটি (উদাহরণস্বরূপ চক্রগুলি আপনি যে গোড়া থেকে অনুসন্ধান করেছেন তার কাছাকাছি হতে পারে, যেখানে বিএফএস আপনাকে একটি সুবিধা দেয়)।
কোনও গ্রাফটি চক্রযুক্ত তা প্রমাণ করার জন্য আপনাকে কেবল এটির একটি চক্র রয়েছে প্রমাণ করতে হবে (প্রত্যক্ষ বা অপ্রত্যক্ষভাবে নিজের দিকে প্রান্ত নির্দেশ করছে)।
ডিএফএসে আমরা একবারে একটি ভার্টেক্স নিই এবং এটির চক্র রয়েছে কিনা তা পরীক্ষা করে দেখি। চক্রের সন্ধান পাওয়ার সাথে সাথে আমরা অন্যান্য শীর্ষকোষগুলি পরীক্ষা করতে বাদ দিতে পারি।
বিএফএসে আমাদের অনেকগুলি শীর্ষ প্রান্ত একযোগে ট্র্যাক করা প্রয়োজন এবং প্রায়শই শেষ না হয়ে আপনি এটি চক্র রয়েছে কিনা তা খুঁজে বার করতে পারেন। গ্রাফের আকার বাড়ার সাথে সাথে ডিএফএসের তুলনায় বিএফএসের আরও স্থান, গণনা এবং সময় প্রয়োজন।
যদি আপনি পুনরাবৃত্ত বা পুনরুক্তি প্রয়োগের কথা বলছেন তবে এটি ধরণের নির্ভর করে।
রিকার্সিভ-ডিএফএস প্রতি নোডে দু'বার দর্শন করে। আইট্রেটিভ-বিএফএস একবারে প্রতিটি নোডে যান।
আপনি যদি একটি চক্র সনাক্ত করতে চান তবে আপনাকে নোডগুলি "সংযুক্ত" করার আগে এবং নোড দিয়ে "সমাপ্ত" করার সময় উভয়ই আপনার নোডগুলি সংযুক্ত করার আগে এবং পরে উভয়ই আপনাকে তদন্ত করতে হবে।
এর জন্য আইট্রেটিভ-বিএফএসে আরও কাজ করা প্রয়োজন তাই বেশিরভাগ লোক रिकর্সিভ-ডিএফএস চয়ন করে।
উল্লেখ্য, স্টেট :: স্ট্যাক সহ আইট্রেটিভ-ডিএফএসের একটি সাধারণ বাস্তবায়ন আইট্রেটিভ-বিএফএসের মতো একই সমস্যা রয়েছে। সেক্ষেত্রে নোডে কাজ শেষ করার পরে আপনাকে ডামি উপাদানগুলি স্ট্যাকের মধ্যে রাখতে হবে place
আপনি যখন নোড (টোপোসোর্টের প্রসঙ্গে উত্তর দিয়েছিলেন) দিয়ে "সমাপ্ত" করবেন তখন নির্ধারণ করতে কীভাবে আইট্রেটিভ-ডিএফএসের অতিরিক্ত কাজের প্রয়োজন তার আরও তথ্যের জন্য এই উত্তরটি দেখুন:
পুনরাবৃত্তি ছাড়াই ডিএফএস ব্যবহার করে টপোলজিকাল সাজান
আশা করা যায় যে এটি লোকেদের যখন নোড প্রক্রিয়াজাতকরণ "সমাপ্ত" করার সময় আপনাকে নির্ধারণ করতে হবে এমন সমস্যার জন্য লোকেরা কেন रिकর্সিভ-ডিএফএসকে সমর্থন করে তা ব্যাখ্যা করে।
আপনি BFS
যখন নির্দেশিত গ্রাফে প্রদত্ত নোডযুক্ত সংক্ষিপ্ততম চক্রটি খুঁজতে চান তখন আপনাকে ব্যবহার করতে হবে।
প্রদত্ত নোডটি যদি 2 হয় তবে তিনটি চক্র যেখানে এটির অংশ - [2,3,4]
, [2,3,4,5,6,7,8,9]
& [2,5,6,7,8,9]
। সবচেয়ে ছোট হয়[2,3,4]
বিএফএস ব্যবহার করে এটি বাস্তবায়নের জন্য, আপনাকে যথাযথ ডেটা স্ট্রাকচার ব্যবহার করে পরিদর্শন করা নোডের ইতিহাস স্পষ্টভাবে বজায় রাখতে হবে।
তবে অন্যান্য সমস্ত উদ্দেশ্যে (যেমন: কোনও চক্রীয় পথ খুঁজে পাওয়া বা একটি চক্র বিদ্যমান কিনা তা পরীক্ষা করা), DFS
অন্যরা উল্লিখিত কারণগুলির জন্য পরিষ্কার পছন্দ।