লাইনের বৈশিষ্ট্যগুলি সংযুক্ত করা এবং দীর্ঘতম লাইনের দৈর্ঘ্য নির্ধারণ করা


12

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

আমি কীভাবে এই রেখাগুলি একীভূত করতে পারি এবং তারপরে আরকোবজেক্টস বা ম্যানুয়াল পদ্ধতিগুলি যা আমি আর্কওবজেক্টসে রূপান্তর করতে পারি তা ব্যবহার করে দীর্ঘতম লাইনের দৈর্ঘ্য নির্ধারণ করতে পারি? এর চেয়েও ভাল সমাধানের মধ্যে দিয়ে সমস্ত উপনদীকে মুক্তি দেওয়া এবং আমাকে কেবল একটি নদী নালা দিয়ে রেখা হিসাবে রেখে দেওয়া উচিত।

লাইন বৈশিষ্ট্য - নদী


1
এরা কি আদৌ সংযোগ করে? আপনি বলেছিলেন যে তারা অতিক্রম করে না, তবে এর অর্থ কি তারা একটি শীর্ষবিন্দু ভাগ করে না?
নাথানাস

1
দুঃখিত - আমি আরও পরিষ্কার হওয়া উচিত ছিল। তারা শিখুন ভাগ করে, তবে একে অপরের মাধ্যমে সম্পূর্ণরূপে অতিক্রম করে না।
রাডার

নদীর মুখ কোথায় আছে জানেন? নদী কি সর্বদা একটি গাছ (প্রতিটি মাথার পানির মুখ থেকে এক অনন্য পথ)?
কर्क কুইকেনডাল

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

@ হুশিয়ার - আপনার মূল্যায়ন সঠিক - আমি কীভাবে রুটগুলি ব্যবহার করে এটি সম্পাদন করতে পারি তার কোনও ধারণা?
রাডার

উত্তর:


18

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

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

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

আমাদের "চিহ্নিত অংশগুলি" (এস, পি) নিয়ে কাজ করতে হবে। এগুলি এর দুটি সমাপ্তি বিন্দুর একটির সাথে এস সেগমেন্টের একটি নিয়ে গঠিত , পি । আমরা সব অংশ খুঁজে বের করতে হবে 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। এটি দেখায় যে কীভাবে দীর্ঘতম প্রবাহরেচ মুখ থেকে উপরের দিকে সরে যায়, প্রতিটি সঙ্গমে এখনও দীর্ঘতম দূরত্ব সহ শাখাটি নির্বাচন করে এবং তার পথ ধরে যে অংশগুলি অতিক্রম করে তা ট্র্যাক করে।

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


+1 এখন যদি তারা মিসৌরি নদীর নামকরণ করার আগে এটি জানত।
কर्क কুইকেনডাল

1
1800 এর দশকের গোড়ার দিকে আমেরিকান ওয়েস্টের ক্রিক পুনরাবৃত্তি অনুসন্ধান সহজ ছিল না :-)।
whuber

এটি আশ্চর্যজনকভাবে সহায়ক! আমি আমার জিআইএস-এর অভ্যন্তরে এই সেটআপটি পেতে পারি এবং এটি কার্যকর হয়ে যাওয়ার পরে আমি কিছু দরকারী কোড ভাগ করতে পারি কিনা তা আমি দেখতে পাব। চিয়ার্স!
রাডার

চমৎকার উত্তর হ'ল রাগী
ইয়াসের বুড়হুম

2

Unsplit লাইন টুল, আপনাকে যা করতে হবে চেষ্টা করছেন কি জন্য সহায়ক হতে পারে, যদিও আপনি কিছু পদ্ধতি (দ্রবীভূত ক্ষেত্রের জন্য) অন্য থেকে আলাদা এক প্রবাহ শাখায় ঐশ্বরিক প্রয়োজন হবে। যদিও ধরে নেওয়া যায় এটি আপনার কাছে একটি আর্কইনফো লাইসেন্স রয়েছে।

আপনার যদি এই জাতীয় লাইসেন্স না থেকে থাকে তবে আপনি প্রতিটি ভার্টেক্সের এক্সওয়াই গ্রহণ করা, IPointCollectionসেগুলি পূরণ করে এবং তারপরে একটি IGeometryহিসাবে তৈরি করার জন্য আর্কওবজেক্টগুলি বিবেচনা করতে পারেন PolyLineClass


1

আপনি রিভেক্স ব্যবহার করতে পারেন এটি একটি 9.1 আর্কজিআইএস সরঞ্জাম (এটি 9.3 এবং 10 তে কাজ করবে)। এতে নদীর নেটওয়ার্ক এবং অনেকগুলি প্রক্রিয়াজাতকরণের সরঞ্জামগুলির সাথে টপোলজিকাল সমস্যাগুলি সনাক্ত করার সরঞ্জাম রয়েছে has এই জাতীয় একটি সরঞ্জাম মূল কান্ডটি আবিষ্কার করে ।

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