অ্যালগরিদম যে থেকে সহজ পাথ সংখ্যা খুঁজে বের করে


34

যে কেউ আমাকে একটি রৈখিক সময়ের অ্যালগরিদম প্রস্তাব করতে পারে যা ইনপুট হিসাবে নির্দেশিত অ্যাসাইক্লিক গ্রাফ এবং দুটি অনুভূমিক এবং এবং তে থেকে তে সরল পাথের সংখ্যা ফেরত দেয় । আমি একজন অ্যালগরিদম যা আমি DFS (গভীরতা প্রথম সার্চ) চালানো হবে আছে কিন্তু যদি DFS খুঁজে বের করে তাহলে (ধূসর সাদা থেকে) রঙ নোড যা পাথ আসে কোন পরিবর্তন করবে না যাতে যদি এটি অন্য কোনও পথের উপপথ হয় তবে ডিএফএস আবারও এই সাবপথটি অতিক্রম করে For উদাহরণস্বরূপ সংলগ্ন তালিকাটি বিবেচনা করুন যেখানে আমাদের থেকে ভি পর্যন্ত পাথের সংখ্যাটি সন্ধান করতে হবে ।গুলি টি গুলি টি জি টি গুলি টি পি ভি পি গুলি z- র গুলি বনাম গুলি Y Y বনাম বনাম W z- রG=(V,E)ststG
tstpv

poszorsvsrryyvvwzwz
এখানে DFS দিয়ে শুরু করবো p এবং তারপর বলে যায় দেয় pz doesnot এনকাউন্টার এরপর থেকে এটি v DFS normally.Now দ্বিতীয় চালানো হবে পাথ psryv যেহেতু এটি ভি এর মুখোমুখি হয়েছে vআমরা লম্বা s,r,y,v গ্রেটি রঙে পরিবর্তন করব না hen তারপরে পথের pov যেহেতু v এর রঙ vএখনও সাদা hen তাই পথটি পিগুলিRYবনাম যেহেতু s এর রঙ গুলিসাদা এবং একই রকম হয় পথ পিRYবনাম.এছাড়াও একটি কাউন্টার রক্ষণাবেক্ষণ করা হয় যা বনাম এর সম্মুখীন হওয়ার সাথে সাথে বাড়ানো হয়।

আমার অ্যালগরিদম সঠিক? যদি তা না হয়, এটিকে সঠিক করার জন্য কোন পরিবর্তনগুলি প্রয়োজন বা অন্য কোনও পদ্ধতির প্রশংসা করা হবে।

দ্রষ্টব্য : আমি এখানে ডিএফএস অ্যালগরিদম বিবেচনা করেছি যা "কর্মেন ​​দ্বারা অ্যালগরিদমের ভূমিকা" বইয়ে দেওয়া হয়েছে যেখানে এটি তার অবস্থান অনুসারে নোডগুলিকে রঙ করে S সুতরাং নোডটি যদি অপ্রকাশিত, অনাবিষ্কৃত এবং অন্বেষণ করা হয় তবে রঙটি সাদা হবে, যথাক্রমে ধূসর এবং কালো A সমস্ত অন্যান্য জিনিস স্ট্যান্ডার্ড।



4
নোট করুন যে নির্দেশিত অ্যাসাইক্লিক গ্রাফের সমস্ত পাথ অগত্যা সহজ (অ্যাসাইক্লিকটির কারণে)।
নলডোরিন

উত্তর:


37

আপনার বর্তমান প্রয়োগটি একটি ডাগের সঠিক সংখ্যার গণনা করবে। তবে, পাথগুলি চিহ্নিত না করে এটি ক্ষতিকারক সময় নেবে। উদাহরণস্বরূপ, নীচের চিত্রটিতে, ডাগের প্রতিটি পর্যায়ে পাথের মোট সংখ্যা একাধিক 3 দ্বারা বৃদ্ধি করে This

পশম

- সংখ্যা গণনা করা হচ্ছেটিst একটি DAG মধ্যে পাথ পুনরাবৃত্তি দেওয়া হয়,

Paths(u)={1if u=t(u,v)EPaths(v)অন্যথায়।

ডিএফএসের একটি সাধারণ পরিবর্তন এই হিসাবে গণনা করবে

def dfs(u, t):
    if u == t:
        return 1
    else:
        if not u.npaths:
            # assume sum returns 0 if u has no children
            u.npaths = sum(dfs(c, t) for c in u.children)
        return u.npaths

প্রতিটি প্রান্তটি একবারে একবারে দেখা গেছে এটি দেখা কঠিন নয়, সুতরাং এর একটি রানটাইম ।হে(ভী+ +)


আমি আপনার অ্যালগরিদম বুঝতে পেরেছি এবং ডায়নামিক প্রোগ্রামিং ব্যবহার করে এটিকে কিছুটা দক্ষ করে তোলা যেতে পারে কারণ একই পুনরাবৃত্ত কলগুলি বহুবার বলা হয় তাই সংরক্ষণের জন্য এটি আরও ভাল? ??
সৌরভ

1
@ সৌরভ হোটা, এটি গতিশীল প্রোগ্রামিং ব্যবহার করছে। প্রথমবার প্রান্তবিন্দু সম্মুখীন হয়, এটি পাথ সংখ্যা নির্ণয় এটা হয়েছে t । এটি u.npaths এ সংরক্ষণ করা হয়। পরবর্তী প্রতিটি কল U পাথ সংখ্যার recompute করবে না, কিন্তু কেবল u.npaths ফিরে যান। তোমার দর্শন লগ করাটিতোমার দর্শন লগ করা
নিকোলাস মানকুসো

1
এই ধরনের গ্রাফগুলির জন্য, উত্তরটি ঠিক এম isn't n নয় যেখানে m একটি কলামের নোডের সংখ্যা (এখানে 3) এবং n গুলি s, t (এখানে 4) বাদ দিয়ে কলামগুলির সংখ্যা। উদাহরণ গ্রাফের জন্য আউটপুট 3 ^ 4 = 81।
সাদাতাম

@ এসএডটাইমে, নিশ্চিত; তবে, আমার অভিপ্রায় ছিল গ্রাফের "দৈর্ঘ্য" বাড়ার সাথে সাথে কেবল তাত্পর্যপূর্ণ বৃদ্ধি প্রদর্শন করা। অবশ্যই সেই উচ্চ কাঠামোগত গ্রাফের জন্য আপনি বদ্ধ আকারে গণনা করতে পারেন যখন তালিকাভুক্ত অ্যালগোরিদম সমস্ত গ্রাফের জন্য কাজ করে।
নিকোলাস মানকুসো

3
হে(ভী+ +)Θ(ভী)হে(ভী)

15

আপনাকে কেবল লক্ষ্য করতে হবে যে একটি নোড থেকে লক্ষ্য নোড পর্যন্ত পাথের সংখ্যাটি তার বাচ্চাদের কাছ থেকে লক্ষ্য পর্যন্ত পাথের সংখ্যার যোগফল। আপনি জানেন যে এই অ্যালগরিদম সর্বদা থামবে কারণ আপনার গ্রাফের কোনও চক্র নেই।

এখন, আপনি নোডগুলি দেখার সময় আপনি যদি একটি নোড থেকে লক্ষ্য পর্যন্ত পাথের সংখ্যাটি সংরক্ষণ করেন, সময় জটিলতাটি নোডের সংখ্যাতে উল্লম্ব সংখ্যা এবং মেমরি লিনিয়ার সংখ্যায় রৈখিক হয়ে যায়।


0

সংলগ্ন ম্যাট্রিক্স উপস্থাপনা ব্যবহার করে একটি ড্যাগের যে কোনও দুটি উল্লম্বের মধ্যে পাথের সংখ্যা পাওয়া যাবে।

ধরুন A হ'ল G এর সংলগ্ন ম্যাট্রিক্স A এটির সাথে পরিচয় ম্যাট্রিক্স যুক্ত করার পরে A এর Kth শক্তি গ্রহণ করা, দৈর্ঘ্যের পাথের সংখ্যা দেয় = = কে।

যেহেতু কোনও ডিএজে কোনও সাধারণ পাথের সর্বাধিক দৈর্ঘ্য | ভি | -1, গণনা করা | ভি |

গণনা | ভি | -1 ম পাওয়ারটি প্রতিটি টিসির লগ (| ভি | -1) মাল্টিপ্লিকেশন করে করা যায়: | ভি | ^ 2


প্রশ্নটি একটি রৈখিক সময় অ্যালগরিদমের জন্য জিজ্ঞাসা করে। আপনার অ্যালগরিদম এর চেয়ে ধীর।
ডিডাব্লিউ

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