প্রথমত, কেন এটি কোনও কঠিন সমস্যা নয় তা নির্দেশ করার জন্য একটি সামান্য ব্যাকগ্রাউন্ড । একটি নদীর মধ্য দিয়ে প্রবাহ গ্যারান্টি দেয় যে এর বিভাগগুলি, যদি সঠিকভাবে ডিজিটাইজড হয় তবে সর্বদা একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ (ডিএজি) গঠনের দিকে লক্ষ্য করা যায় । ঘুরেফিরে, কোনও গ্রাফিককে টপোলজিকাল বাছাই হিসাবে পরিচিত একটি প্রযুক্তি ব্যবহার করে এবং কেবল এটি একটি ডিএজি হলেই রৈখিকভাবে অর্ডার করা যায় । টপোলজিকাল বাছাই দ্রুত: এর সময় এবং স্থানের প্রয়োজনীয়তা উভয় হ'ল (| ই | এই জাতীয় লিনিয়ার ক্রম তৈরি করা প্রধান স্রোত বিছানাটি সহজেই সন্ধান করে।
এখানে, তবে, একটি অ্যালগরিদমের স্কেচ । স্রোতের মুখটি তার প্রধান বিছানা ধরে। মুখের সাথে সংযুক্ত প্রতিটি শাখা বরাবর উপরের দিকে সরান (একাধিকর বেশি হতে পারে, যদি মুখটি একটি সঙ্গম হয়) এবং পুনরাবৃত্তভাবে সেই শাখার দিকে যাওয়ার প্রধান বিছানাটি সন্ধান করুন। মোট শাখাটি নির্বাচন করুন যার জন্য মোট দৈর্ঘ্য সর্বাধিক: এটি প্রধান বিছানার পাশে আপনার "ব্যাকলিঙ্ক"।
এই পরিষ্কার করার জন্য, আমি কিছু (অপরিবর্তিত) সিউডোকোড সরবরাহ করি । ইনপুটটি লাইন বিভাগগুলির একটি সেট (বা আরাক্স) এস (ডিজিটাইজড স্ট্রিম সমন্বিত), যার প্রতিটি পৃথক দুটি নির্দিষ্ট স্বরূপ (এস) এবং শেষ (এস) এবং একটি ধনাত্মক দৈর্ঘ্য, দৈর্ঘ্য (এস) রয়েছে; এবং নদীর মুখ পি , যা একটি বিন্দু। আউটপুট হ'ল অংশগুলিকে সর্বাধিক দূরবর্তী প্রবাহের পয়েন্টের সাথে একত্রিত করার ক্রম।
আমাদের "চিহ্নিত অংশগুলি" (এস, পি) নিয়ে কাজ করতে হবে। এগুলি এর দুটি সমাপ্তি বিন্দুর একটির সাথে এস সেগমেন্টের একটি নিয়ে গঠিত , পি । আমরা সব অংশ খুঁজে বের করতে হবে S যে ভাগ তদন্ত বিন্দু দিয়ে এন্ডপয়েন্টের কুই , তাদের যাদের অংশ চিহ্নিত অন্যান্য সেট আসতে এন্ড পয়েন্ট, এবং:
Procedure Extract(q: point, A: set of segments): Set of marked segments.
যখন এই জাতীয় কোনও বিভাগ খুঁজে পাওয়া যায় না, এক্সট্র্যাক্ট করতে হবে খালি সেটটি return একটি পার্শ্ব প্রতিক্রিয়া হিসেবে এক্সট্র্যাক্ট সব অংশ এটা সেট থেকে ফিরে আসছে সরাতে হবে , একটি যার ফলে পরিবর্তন একটি নিজেই।
আমি এক্সট্রাক্টের বাস্তবায়ন দিচ্ছি না: আপনার জিআইএস সেগমেন্টগুলি এস এর কিউ দিয়ে একটি শেষ পয়েন্ট ভাগ করে নেওয়ার ক্ষমতা প্রদান করবে । তাদের চিহ্নিত কেবল সঙ্গে উভয় শুরু (এস) এবং শেষ (এস) তুলনা একটি ব্যাপার কুই এবং ফিরে দুই শেষ বিন্দুর যেটা সাথে মিলছে না।
এখন আমরা সমস্যা সমাধানের জন্য প্রস্তুত।
Procedure LongestUpstreamReach(p: point, A: set of segments): (Array of segments, length)
A0 = A // Optional: preserves A
C = Extract(p, A0) // Removes found segments from the set A0!
L = 0; B = empty array
For each (S,q) in C: // Loop over the segments meeting point p
(B0, M) = LongestUpstreamReach(q, A0)
If (length(S) + M > L) then
B = append(S, B0)
L = length(S) + M
End if
End for
Return (B, L)
End LongestUpstreamReach
পদ্ধতি "সংযোজন (এস, বি0)" অ্যারে বি 0 এর শেষে এস সেগমেন্টটি আটকে এবং নতুন অ্যারে প্রদান করে।
(স্ট্রিম সত্যিই একটি গাছ থাকলে: কোন দ্বীপ, হ্রদ, braids, ইত্যাদি - তারপর আপনি অনুলিপি পদক্ষেপ সঙ্গে প্রয়োগ করতে একটি মধ্যে A0 ।)
লোনজেস্টআপ স্ট্রিমের রিচার্চ দিয়ে বিভাগগুলির ইউনিয়ন গঠন করে মূল প্রশ্নের উত্তর দেওয়া হয়।
উদাহরণস্বরূপ , আসল মানচিত্রের স্ট্রিমটি বিবেচনা করি। ধরা যাক এটি সাতটি অর্ক সংগ্রহ হিসাবে ডিজিটাইজড। আর্ক একটি (নীচের চিত্র, যা আবর্তিত হয় সঠিক সময়ে, মানচিত্রের উপরের) বিন্দু 0 এ মুখ থেকে যায় বিন্দু 1. প্রথমে জনতা মূল প্রজেক্টের এটি একটি দীর্ঘ চাপ আছে, 8 ইউনিট দীর্ঘ বলে। আর্ক বি শাখাগুলি বাম দিকে (মানচিত্রে) এবং সংক্ষিপ্ত, প্রায় 2 ইউনিট দীর্ঘ। আর্ক সি ডানদিকে শাখা এবং প্রায় 4 ইউনিট লম্বা, ইত্যাদি ইত্যাদি "বি", "ডি" এবং "চ" বাম দিকের শাখাগুলিকে বোঝায় যেহেতু আমরা মানচিত্রের উপর থেকে নীচে যাব এবং "ক", "সি", "ই", এবং "জি" অন্যান্য শাখা, এবং 0 থেকে 7 পর্যন্ত শীর্ষটি সংখ্যা নির্ধারণ করে, আমরা আর্কটিকভাবে গ্রাফকে আর্কস সংগ্রহ হিসাবে উপস্থাপন করতে পারি
A = {a=(0,1), b=(1,2), c=(1,3), d=(3,4), e=(3,5), f=(5,6), g=(5,7)}
আমি মনে করি তারা লেন্থ 8, 2, 4, 1, 2, 2, 2 জন্য আছে অনুমান করা হবে একটি মাধ্যমে গ্রাম যথাক্রমে। মুখটি ভার্টেক্স 0।
প্রথম উদাহরণটি এক্সট্র্যাক্টের কল (5, {f, g})। এটি চিহ্নিত বিভাগগুলির সেট ফেরত দেয় f (চ,)), (ছ,))}} নোট করুন যে ভার্টেক্স 5 টি আরাক্স এফ এবং জি (মানচিত্রের নীচে দুটি আরকস) এর সংমিশ্রণে রয়েছে এবং এটি (চ, 6) এবং (জি, 7) এই আর্কগুলির প্রত্যেকটিকে তাদের প্রবাহের শেষ প্রান্তগুলি দিয়ে চিহ্নিত করে ।
পরবর্তী উদাহরণ হ'ল দীর্ঘতম আপ স্ট্রিম রিচ (0, এ) এর কল। এটির প্রথম ক্রিয়াটি এক্সট্র্যাক্ট (0, এ) এর কল। এটি চিহ্নিত সেগমেন্ট (a, 1) সমেত একটি সেট প্রদান করে এবং এটি সেট A0 থেকে একটি বিভাগকে সরিয়ে দেয় , যা এখন {বি, সি, ডি, ই, এফ, জি equ এর সমান} লুপের একটি পুনরাবৃত্তি রয়েছে, যেখানে (এস, কিউ) = (ক, ১)। এই পুনরাবৃত্তির সময় LongestUpstreamReach (1, A0) এ একটি কল করা হয়। পুনরাবৃত্তভাবে, এটি অবশ্যই ক্রম (জি, ই, সি) বা (চ, ই, সি) ফেরত পাঠাতে হবে: উভয়ই সমানভাবে বৈধ। এটি যে দৈর্ঘ্য (এম) প্রদান করে তা 4 + 2 + 2 = 8 হয় (দ্রষ্টব্য যে দীর্ঘতম প্রবাহপ্রাপ্তি A0 সংশোধন করে না )) লুপের শেষে, বিভাগটি aস্ট্রিম বিছানায় সংযোজন করা হয়েছে এবং দৈর্ঘ্য 8 + 8 = 16 এ বাড়ানো হয়েছে। সুতরাং প্রথম ফেরতের মানটি ক্রম (g, e, c, a) বা (f, e, c, a) নিয়ে গঠিত, দ্বিতীয় রিটার্ন মানের জন্য উভয় ক্ষেত্রে দৈর্ঘ্যের 16। এটি দেখায় যে কীভাবে দীর্ঘতম প্রবাহরেচ মুখ থেকে উপরের দিকে সরে যায়, প্রতিটি সঙ্গমে এখনও দীর্ঘতম দূরত্ব সহ শাখাটি নির্বাচন করে এবং তার পথ ধরে যে অংশগুলি অতিক্রম করে তা ট্র্যাক করে।
অনেকগুলি ব্রেইড এবং দ্বীপপুঞ্জ থাকাকালীন আরও কার্যকর বাস্তবায়ন সম্ভব, তবে বেশিরভাগ উদ্দেশ্যে লোনস্টেস্টপ্রেম রিচারটি ঠিক যেমন দেখানো হয়েছে তেমন প্রয়োগ করা হয়, কারণ প্রতিটি সঙ্গমে বিভিন্ন শাখায় অনুসন্ধানগুলির মধ্যে কোনও ওভারল্যাপ না থাকে: কম্পিউটিং সময় (এবং স্ট্যাকের গভীরতা) খণ্ডের মোট সংখ্যার সাথে সরাসরি আনুপাতিক হবে।