প্রাইম এবং ডিজকস্ট্রার অ্যালগরিদমের মধ্যে পার্থক্য?


102

ডিজকস্ট্রার এবং প্রাইমের আলগোরিদিমগুলির মধ্যে ঠিক পার্থক্য কী? আমি জানি প্রাইমস একটি এমএসটি দেবে তবে ডিজকস্ট্রার দ্বারা উত্পন্ন গাছটিও এমএসটি হবে। তাহলে ঠিক পার্থক্যটা কী?


5
এটি ডিজকস্ট্রা। "আইজ" হ'ল ডাচ ভাষায় ডিপথং (গ্লাইডিং স্বর) এবং এটি এমন এক জায়গা যেখানে "জে" ব্যঞ্জনবর্ণ নয়।

23
কোনওভাবেই আপনি প্রশ্ন পেয়েছেন।
অনুজ প্রধান

5
তাদের পার্থক্যটি আলাদা করার সর্বোত্তম উপায় হ'ল কয়েকটি উত্স কোড , ডিজকস্ট্রা এবং প্রাইম পড়ুন । মূল পার্থক্যটি এখানে: প্রাইম graph[u][v] < key[v]এবং ডিজকস্ট্রার জন্য dist[u]+graph[u][v] < dist[v]। সুতরাং আপনি যে দুটি পৃষ্ঠায় গ্রাফ থেকে দেখতে পাচ্ছেন , মূলত কোডের এই দুটি লাইনের কারণে এগুলি আলাদা।
JW.ZG

উত্তর:


155

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

ডিজকস্ট্রার অ্যালগরিদম কিছু উত্স নোড থেকে শুরু করে একটি সংক্ষিপ্ত পথ গাছ তৈরি করে । সংক্ষিপ্ততম পাথ গাছ একটি গাছ যা গ্রাফের সমস্ত নোডকে উত্স নোডের সাথে আবার সংযুক্ত করে এবং বৈশিষ্ট্যটি রয়েছে যে উত্স নোড থেকে গ্রাফের অন্য কোনও নোডের যে কোনও পাথের দৈর্ঘ্য হ্রাস করা হয়। উদাহরণস্বরূপ, এটি কার্যকর, যদি আপনি এমন একটি রোড নেটওয়ার্ক তৈরি করতে চান যা প্রত্যেককে কিছু গুরুত্বপূর্ণ গুরুত্বপূর্ণ ল্যান্ডমার্কে পৌঁছানোর পক্ষে যথাসম্ভব দক্ষ করে তোলে। তবে, সংক্ষিপ্ততম পাথ গাছটি ন্যূনতম বিস্তৃত গাছ হওয়ার গ্যারান্টিযুক্ত নয়, এবং একটি স্বল্পতম পাথ গাছের কিনারায় ব্যয়ের যোগফল এমএসটির ব্যয়ের চেয়ে অনেক বড় হতে পারে।

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

আশাকরি এটা সাহায্য করবে!


প্রথম অনুচ্ছেদে কোনও অর্থ নেই, মানুষ। প্রশ্নটি হ'ল ডিজকস্ট্রা এবং প্রাইমের মধ্যে পার্থক্য কী , যেখানে ডিজকস্ট্রা আপনি যা বলেছিলেন তা নয় , প্রিমের এসসিআরthe length of a path between **any** two nodes নোড এবং অন্য কোনও নোডের মধ্যবর্তী দূরত্বটি যদি সংক্ষিপ্ত না হয় তবে কেন আপনার মনোযোগ কেন্দ্রীভূত করা উচিত? আমি মনে করি তিনি অবশ্যই প্রাইমে থাকা অন্য কোনও নোডের কাছে src নোডটি জিজ্ঞাসা করবেন । আপনি প্রাইমে দুটি নোড সম্পর্কে কেন কথা বলেছেন ? এটি অবশ্যই সবচেয়ে কম নয়।
JW.ZG

4
আমি স্পষ্টরূপে Djkstra এর অ্যালগরিদম সম্পর্কে অনুচ্ছেদে শব্দটি পরিষ্কার করেছি যে সংক্ষিপ্ত পথ গাছটি উত্স নোড থেকে উত্পন্ন সংক্ষিপ্ততম পথগুলির জন্য কেবল একটি মিনিমাইজার। আমি আমার উত্তরটি যেভাবে গঠন করেছি তা হ'ল এটি বোঝানোর উপায় যে তারা উচ্চতর স্তরে কীভাবে তারা বিভিন্ন ফলাফল উত্পন্ন করে এবং কেন আপনি সেগুলি একই হওয়ার আশা করবেন না তার চেয়ে কীভাবে তারা কাজ করে তার চেয়ে অ্যালগরিদমগুলি কী সন্ধান করে
টেম্পলেটটিফাইফ

4
সবচেয়ে সহজ ব্যাখ্যাটি প্রাইমগুলিতে রয়েছে আপনি প্রারম্ভিক নোডটি নির্দিষ্ট করেন না , তবে ডিজস্ক্রাতে আপনাকে (একটি শুরুর নোড থাকা দরকার) প্রদত্ত নোড থেকে অন্য সমস্ত নোডের সবচেয়ে ছোটতম পথ খুঁজে পেতে হবে। স্ট্যাকওভারফ্লো.com
দীপক যাদব

4
@templatetypedef - আপনি যখন বলছেন: "এবং [ ডিজকের সাথে] এমন একটি গাছ তৈরির ব্যয় এমএসটির ব্যয়ের চেয়ে অনেক বেশি হতে পারে ।" আপনি দয়া করে বিস্তারিত বলতে পারেন?
অ্যামিলিও ওয়াজকেজ-রেইনা

4
@ আমেলিওভাজেকেজ-রেইনা দুঃখিত, এটি কিছুটা অস্পষ্ট। আমি যা বোঝাতে চেয়েছি তা হ'ল একটি ছোট পাথ গাছের প্রান্তে ওজনের যোগফল একটি এমএসটিতে প্রান্তের ওজনের যোগফলের চেয়ে অনেক বড় হতে পারে।
টেম্পলেটটিফাইফ 21

88

ডিজকস্ট্রার অ্যালগরিদম এমএসটি তৈরি করে না, এটি সবচেয়ে সংক্ষিপ্ততম পথ খুঁজে পায়।

এই গ্রাফটি বিবেচনা করুন

       5     5
  s *-----*-----* t
     \         /
       -------
         9

সংক্ষিপ্ততম পাথটি 9, আর এমএসটি 10 ​​এ আলাদা 'পথ'।


4
ঠিক আছে ধন্যবাদ ... আপনি লক্ষ্য করার জন্য একটি ভাল পয়েন্ট সাফ করেছেন। এখনও অবধি আমি বিবেচনা করছিলাম যে ডিজজস্ট্রার দ্বারা উত্পাদিত আউটপুটটি এমএসটি হবে তবে আপনি একটি ভাল উদাহরণ দিয়ে সন্দেহটি সাফ করেছেন I । অনেক অনেক ধন্যবাদ
অনুজ প্রধান

8
আরও সঠিকভাবে - The shortest path is 9... টি থেকে টি। ডিজকস্ট্রার অ্যালগরিদম দ্বারা উত্পন্ন গ্রাফের ওজন 14 থেকে 5 হয় (5 + 9)।
বার্নহার্ড বার্কার

4
@ ডুকলিং - হাহ?
ডিজকস্ট্রের

4
খুব সংক্ষিপ্ত চিত্রিত!
রাম নরসিমহান

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

69

প্রাইম এবং ডিজকস্ট্রা অ্যালগরিদমগুলি "রিলাক্স ফাংশন" ব্যতীত প্রায় একই।

প্রাইম:

MST-PRIM (G, w, r) {
    for each key ∈ G.V
        u.key = ∞
        u.parent = NIL
    r.key = 0
    Q = G.V

    while (Q ≠ ø)
        u = Extract-Min(Q)
        for each v ∈ G.Adj[u]
            if (v ∈ Q)
                alt = w(u,v)    <== relax function, Pay attention here
                if alt < v.key
                    v.parent = u
                    v.key = alt
}

ডিজকস্ট্র:

Dijkstra (G, w, r) {
    for each key ∈ G.V
        u.key = ∞
        u.parent = NIL
    r.key = 0
    Q = G.V

    while (Q ≠ ø)
        u = Extract-Min(Q)
        for each v ∈ G.Adj[u]
            if (v ∈ Q)
                alt = w(u,v) + u.key  <== relax function, Pay attention here
                if alt < v.key
                    v.parent = u
                    v.key = alt
}

পার্থক্যটি কেবল তীর দ্বারা চিহ্নিত করা হয়েছে, যা শিথিল কাজ।

  • প্রাইম, যা সর্বনিম্ন বিস্তৃত গাছের সন্ধান করে, সর্বমোট প্রান্তগুলিকে সর্বমোট প্রান্তিকের সর্বনিম্ন যত্ন করে। শিথিল কাজalt = w(u,v)
  • ডিজকস্ট্রা, যা সর্বনিম্ন পাথ দৈর্ঘ্যের সন্ধান করে, তাই এটি প্রান্তের সঞ্চার সম্পর্কে যত্নশীল। শিথিল কাজalt = w(u,v) + u.key

কোড স্তরে, অন্যান্য পার্থক্য হ'ল এপিআই। প্রাইমের কাছে edges()এমএসটি প্রান্তগুলি ফিরিয়ে আনার পদ্ধতি রয়েছে , যখন ডিজকস্ট্রার রয়েছে distanceTo(v), pathTo(v)যা যথাক্রমে উত্স থেকে ভার্টেক্স ভি থেকে দূরত্ব এবং উত্স থেকে ভার্টেক্স ভি পর্যন্ত পাথ ফিরে আসে, যেখানে ডিজকસ્ત્રটি আপনার সূচনাপ্রান্তটি যে সূচকটি দিয়ে এস।
নেটহসিক্স

4
সম্পুরক, আরম্ভের পরিপাটি সঙ্গে কোনো কোনো উৎস প্রান্তবিন্দু, আয় জন্য একই আউটপুট গুলি edges()কিন্তু Dijkstra আরম্ভের বিভিন্ন s এর সাথে বিভিন্ন আউটপুট ফিরে আসবে distanceTo(v), pathTo(v)
নেটহাসিক্স

প্রাইমগুলি কি নেতিবাচক ওজনের অনুমতি দেয়? যদি হ্যাঁ এটির চেয়ে অন্য পার্থক্য। আমি পড়েছি যে আপনি প্রিমের নেতিবাচক ওজনকে বড় ধরণের ইতিবাচক সংখ্যা যোগ করে মঞ্জুরি দিতে পারবেন। প্রতিটি মান, এটি সব ধনাত্মক করে তোলে।
আখিল বাবা

4
আমার বিভ্রান্তির সমাধান! নিখুঁত উত্তর!!
ধনঞ্জয় সরসোনিয়া

এখানে প্রক্রিয়াজাত ভার্টেক্সকে অনির্দেশিত গ্রাফের জন্য উপেক্ষা করতে হবে
মিঃ এজে

53

ডিজস্ক্রার অ্যালগরিদম নোড i থেকে সমস্ত নোডের নূন্যতম দূরত্ব খুঁজে পায় (আপনি i নির্দিষ্ট করে)। সুতরাং বিনিময়ে আপনি নোড থেকে সর্বনিম্ন দূরত্বের গাছ পাবেন i।

প্রাইমস অ্যালগরিদম আপনাকে প্রদত্ত গ্রাফের জন্য সর্বনিম্ন স্প্যানিং ট্রি দেয় । একটি গাছ যা সমস্ত নোডকে সংযুক্ত করে যখন সমস্ত ব্যয়ের যোগফল সর্বনিম্ন সম্ভব।

তাই ডিজকস্ট্রার সাহায্যে আপনি নির্বাচিত নোড থেকে ন্যূনতম ব্যয়ের সাথে অন্য যে কোনও জায়গায় যেতে পারেন , আপনি এটি প্রাইমের সাথে পাবেন না


সবচেয়ে সহজ ব্যাখ্যাটি প্রাইমগুলিতে রয়েছে আপনি প্রারম্ভিক নোডটি নির্দিষ্ট করেন না , তবে ডিজস্ক্রাতে আপনাকে (একটি শুরুর নোড থাকা দরকার) প্রদত্ত নোড থেকে অন্য সমস্ত নোডের সবচেয়ে ছোটতম পথ খুঁজে পেতে হবে। স্ট্যাকওভারফ্লো.com
দীপক যাদব

32

কেবলমাত্র তফাতটি আমি দেখতে পাচ্ছি যে প্রাইমের আলগোরিদম সর্বনিম্ন ব্যয়ের কিনারায় সঞ্চয় করে তবে ডিজকস্ট্রার অ্যালগরিদমটি উত্স শীর্ষবিন্দু থেকে বর্তমান শীর্ষবিন্দুতে মোট ব্যয় সঞ্চয় করে।

ডিজকস্ট্র আপনাকে উত্স নোড থেকে গন্তব্য নোডের এমন একটি পথ দেয় যাতে ব্যয় সর্বনিম্ন হয়। তবে প্রাইমের অ্যালগরিদম আপনাকে ন্যূনতম বিস্তৃত গাছ দেয় যা সমস্ত নোড সংযুক্ত থাকে এবং মোট ব্যয় সর্বনিম্ন হয়।

সহজ কথায়:

সুতরাং, আপনি যদি বেশ কয়েকটি শহরকে সংযুক্ত করতে ট্রেন মোতায়েন করতে চান তবে আপনি প্রাইমের আলগো ব্যবহার করবেন use তবে আপনি যদি যথাসময়ে সময় বাঁচাতে এক শহর থেকে অন্য শহরে যেতে চান তবে আপনি ডিজকস্ট্রার আলগো ব্যবহার করবেন।


24

উভয়ই ঠিক একই জেনেরিক অ্যালগরিদম ব্যবহার করে প্রয়োগ করা যেতে পারে:

Inputs:
  G: Graph
  s: Starting vertex (any for Prim, source for Dijkstra)
  f: a function that takes vertices u and v, returns a number

Generic(G, s, f)
    Q = Enqueue all V with key = infinity, parent = null
    s.key = 0
    While Q is not empty
        u = dequeue Q
        For each v in adj(u)
            if v is in Q and v.key > f(u,v)
                v.key = f(u,v)
                v.parent = u

প্রাইম, পাস f = w(u, v)এবং ডিজকস্ট্র পাসের জন্য f = u.key + w(u, v)

আর একটি মজার বিষয় হ'ল উপরের জেনেরিকও ব্রেথথ ফার্স্ট সার্চ (বিএফএস) বাস্তবায়ন করতে পারে যদিও এটি অতিরিক্ত পরিমাণে হবে কারণ ব্যয়বহুল অগ্রাধিকারের সারির সত্যিকার প্রয়োজন নেই। বিএফএসে জেনেরিক অ্যালগরিদমের উপরে ওঠার জন্য, f = u.key + 1যা সমস্ত ওজন 1-এ প্রয়োগ করার সমান হয় (যেমন বিএফএস পয়েন্ট এ থেকে বিতে যাওয়ার জন্য ন্যূনতম সংখ্যার প্রান্ত দেয়)।

অন্তর্দৃষ্টি

জেনেরিক অ্যালগরিদমের উপরের দিকে চিন্তা করার জন্য এখানে একটি ভাল উপায়: আমরা দুটি বালতি 'এ' এবং 'বি' দিয়ে শুরু করি, আপনার সমস্ত সূচি বিতে রেখে দিন যাতে বালতি এ খালি থাকে। তারপরে আমরা বি থেকে একটি শীর্ষকে এক এ স্থানান্তরিত করলাম। এখন এ-এর শীর্ষে অবস্থিত সমস্ত প্রান্তগুলি দেখুন যা বি এর শীর্ষ প্রান্তগুলিকে অতিক্রম করে থাকে আমরা এই ক্রস-ওভার প্রান্তগুলি থেকে কিছু মানদণ্ড ব্যবহার করে একটি প্রান্তটি বেছে নিয়েছি এবং বি থেকে প্রান্তটি অনুসারে প্রান্তকে স্থানান্তরিত করেছি উ: খ খালি না হওয়া পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করুন।

এই ধারণাটি বাস্তবায়নের জন্য একটি শক্তিশালী উপায় হ'ল এটি A এর শীর্ষ প্রান্তের জন্য প্রান্তের একটি অগ্রাধিকারের সারি বজায় রাখা যা বি পর্যন্ত ছাড়িয়ে যায় অবশ্যই স্পষ্টত গ্রাফটি বিচ্ছিন্ন না হলে সমস্যা হবে troubles তাহলে প্রশ্নটি হ'ল আমরা কি পরিবর্তে শীর্ষে সারির অগ্রাধিকার সারি বজায় রাখতে পারি? এটি বাস্তবে আমরা আমাদের সিদ্ধান্ত হিসাবে শেষ পর্যন্ত বি থেকে কোন শীর্ষটি বেছে নিতে পারি is

ঐতিহাসিক প্রেক্ষাপট

এটি আকর্ষণীয় যে উভয় অ্যালগরিদমের পিছনে কৌশলটির জেনেরিক সংস্করণটি 1930 সালের মতো ধারণা হিসাবে পুরানো, এমনকি ইলেকট্রনিক কম্পিউটারগুলি আশেপাশে ছিল না।

গল্পটি শুরু হয়েছে ওতাকার বোরেভকার সাথে, যিনি ন্যূনতম ব্যয়ের বৈদ্যুতিক লাইনের সাথে মোরাভিয়া (এখন চেক প্রজাতন্ত্রের অংশ) শহরের শহরগুলি কীভাবে সংযুক্ত করতে পারেন তা বোঝার চেষ্টা করার জন্য একটি পরিবারের বন্ধুটির জন্য একটি অ্যালগরিদম প্রয়োজন। তিনি ১৯৩26 সালে গণিত সম্পর্কিত জার্নালে তাঁর অ্যালগরিদম প্রকাশ করেছিলেন, কারণ কম্পিউটার বিজ্ঞান তখন ছিল না। এটি ভোটাচ জার্নাকের নজরে এসেছিল যিনি বোরিভকার আলগোরিদমটির উন্নতির কথা চিন্তা করেছিলেন এবং এটি ১৯৩০ সালে প্রকাশ করেছিলেন। বাস্তবে তিনি একই অ্যালগরিদম আবিষ্কার করেছিলেন যা আমরা এখন ১৯ Prim সালে প্রিমের অ্যালগরিদম হিসাবে জানি যা এটি পুনরায় আবিষ্কার করেছিল।

এই সমস্ত থেকে স্বাধীন, ১৯66 সালে তাঁর ইনস্টিটিউট যে নতুন কম্পিউটারের বিকাশ করেছিল তার দক্ষতা প্রদর্শনের জন্য ডিজকস্ট্রার একটি প্রোগ্রাম লেখার প্রয়োজন ছিল। তিনি ভেবেছিলেন যে নেদারল্যান্ডসের দুটি শহরের মধ্যে ভ্রমণের জন্য কম্পিউটারের সংযোগ পাওয়া ভাল হবে। তিনি 20 মিনিটের মধ্যে অ্যালগরিদমটি ডিজাইন করেছিলেন। তিনি কিছু সরলকরণের সাথে 64 টি শহরের গ্রাফ তৈরি করেছিলেন (কারণ তার কম্পিউটারটি 6-বিট ছিল) এবং এই 1956 কম্পিউটারের জন্য কোড লিখেছিল। তবে তিনি তাঁর অ্যালগরিদম প্রকাশ করেননি কারণ প্রাথমিকভাবে কম্পিউটার বিজ্ঞান জার্নাল ছিল না এবং তিনি মনে করেছিলেন এটি সম্ভবত খুব গুরুত্বপূর্ণ নয়। পরের বছর তিনি নতুন কম্পিউটারগুলির সংযোগের টার্মিনালগুলির সমস্যা সম্পর্কে জানলেন যে তারের দৈর্ঘ্য হ্রাস করা হয়েছিল। তিনি এই সমস্যাটি নিয়ে ভাবেন এবং জার্নাক / প্রাইমকে পুনরায় আবিষ্কার করেন ' s অ্যালগরিদম যা আবার একই কৌশলটি ব্যবহার করে যা তিনি এক বছর আগে আবিষ্কার করেছিলেন সবচেয়ে স্বল্পতম পথ অ্যালগরিদম হিসাবে। তিনিউল্লেখ করেছেন যে তাঁর দুটি অ্যালগরিদমই কলম বা কাগজ ব্যবহার না করেই তৈরি করা হয়েছিল। ১৯৫৯ সালে তিনি দু'টি অ্যালগরিদম একটি কাগজে প্রকাশ করেছিলেন যা মাত্র আড়াই পৃষ্ঠার দীর্ঘ।


ধন্যবাদ! প্রস্থানটি নিউবুলাস, কেন কিছু না ঘটলে লুপটি প্রস্থান করবেন?
amirouche

15

ডিজকસ્ત્રা তার সূচনা নোড এবং অন্যান্য নোডের মধ্যে সংক্ষিপ্ততম পথ খুঁজে পায়। সুতরাং বিনিময়ে আপনি নোড থেকে ন্যূনতম দূরত্বের গাছ পাবেন অর্থাৎ আপনি যতটা সম্ভব দক্ষতার সাথে অন্য প্রতিটি নোডে পৌঁছাতে পারেন।

প্রাইমস অ্যালগরিদম আপনাকে প্রদত্ত গ্রাফের জন্য এমএসটি দেয় অর্থাত্ একটি গাছ যা সমস্ত নোডকে সংযুক্ত করে যখন সমস্ত ব্যয়ের যোগফল সর্বনিম্ন সম্ভব।

বাস্তবের উদাহরণ সহ একটি গল্পকে ছোট করে তুলতে:

  1. ভ্রমণের সময় এবং জ্বালানী সাশ্রয় করে দ্বিজকસ્ત્રা প্রতিটি গন্তব্য পয়েন্টের সবচেয়ে সংক্ষিপ্ত পথ জানতে চান।
  2. প্রাইম কীভাবে দক্ষতার সাথে ট্রেন রেল ব্যবস্থা স্থাপন করতে চান অর্থাৎ সামগ্রীর ব্যয় সাশ্রয় করতে চান।

10

সরাসরি ডিজকস্ট্রার অ্যালগোরিদমের উইকিপিডিয়া নিবন্ধ থেকে:

যে প্রক্রিয়াটি ডিজকস্ট্রার অ্যালগোরিদমকে অন্তর্নিহিত করে তা প্রাইমের অ্যালগরিদমে ব্যবহৃত লোভী প্রক্রিয়ার অনুরূপ। প্রাইমের উদ্দেশ্য হ'ল গ্রাফের সমস্ত নোডকে সংযুক্ত করে এমন একটি ন্যূনতম বিস্তৃত গাছের সন্ধান; Dijkstra শুধুমাত্র দুটি নোড সঙ্গে সম্পর্কিত। প্রাইমগুলি শুরু নোড থেকে পথের মোট ওজনকে মূল্যায়ন করে না, কেবল পৃথক পাথ।


5
"ডিজকস্ট্র কেবল দুটি নোডের সাথে সম্পর্কিত" বাঁকানো।
tmyklebu

5

আমি ইদানীং একই প্রশ্নে বিরক্ত হয়েছিলাম এবং আমি মনে করি আমি নিজের বোঝাপড়াটি ভাগ করে নিতে পারি ...

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

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

                                  2       2  
                          (s) o ----- o ----- o (t)     
                              |               |
                              -----------------
                                      3

আসুন ধরা যাক উপরের প্রতিটি প্রান্তটির মূল্য 2 এবং তল প্রান্তটির 3 টির দাম রয়েছে, তখন ডিজকট্রা আমাদের নীচের দিকে নিয়ে যেতে বলবে, যেহেতু আমরা মাঝের নোডের যত্ন নেই। অন্যদিকে, নীচের প্রান্তটি ত্যাগ করে প্রাইম শীর্ষ 2 প্রান্ত সহ আমাদের একটি এমএসটি ফিরিয়ে দেবে।

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


3

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

def dijkstra(g, s):
    q <- make_priority_queue(VERTEX.distance)
    for each vertex v in g.vertex:
        v.distance <- infinite
        v.predecessor ~> nil
        q.add(v)
    s.distance <- 0
    while not q.is_empty:
        u <- q.extract_min()
        for each adjacent vertex v of u:
            ...

def prim(g, s):
    q <- make_priority_queue(VERTEX.distance)
    for each vertex v in g.vertex:
        v.distance <- infinite
        v.predecessor ~> nil
        q.add(v)
    s.distance <- 0
    while not q.is_empty:
        u <- q.extract_min()
        for each adjacent vertex v of u:
            if v in q and weight(u, v) < v.distance:// <-------selection--------
            ...

Vertex.distance এর গণনা দ্বিতীয় ভিন্ন বিন্দু।


3

ডিজকস্ট্রার অ্যালগোরিদম হ'ল নোড i এবং j এর মধ্যে একক উত্সের সংক্ষিপ্ততম পথ সমস্যা, তবে প্রাইমের অ্যালগোরিদম একটি ন্যূনতম প্রশস্ত গাছের সমস্যা। এই অ্যালগরিদম 'লোভী অ্যালগরিদম' নামে প্রোগ্রামিং ধারণাটি ব্যবহার করে

আপনি যদি এই ধারণাটি পরীক্ষা করেন তবে দয়া করে ভিজিট করুন

  1. লোভী অ্যালগরিদম বক্তৃতা নোট: http://jeffe.cs.illinois.edu/teaching/algorithms/notes/07-greedy.pdf
  2. সর্বনিম্ন বিস্তৃত গাছ: http://jeffe.cs.illinois.edu/teaching/algorithms/notes/20-mst.pdf
  3. একক উত্স সবচেয়ে সংক্ষিপ্ত পথ: http://jeffe.cs.illinois.edu/teaching/algorithms/notes/21-sssp.pdf

2

Djkstras অ্যালগরিদম শুধুমাত্র সবচেয়ে সংক্ষিপ্ত পথ সন্ধান করতে ব্যবহৃত হয়।

ইন নূন্যতম spanning গাছ (পরিপাটি বা Kruskal এর এলগরিদম) আপনাকে সর্বনিম্ন প্রান্ত মান ন্যূনতম egdes পেতে।

উদাহরণস্বরূপ: - এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে আপনি একটি বিশাল নেটওয়ার্ক তৈরি করতে চান না যার জন্য আপনাকে প্রচুর পরিমাণে তারের প্রয়োজন হবে যাতে ন্যূনতম স্প্যানিং ট্রি (প্রাইমস বা ক্রুসকলের অ্যালগোরিদম) ব্যবহার করে এটি করা যেতে পারে (যেমন এটি হবে ) ন্যূনতম ব্যয়ের সাথে বিশাল তারযুক্ত নেটওয়ার্ক সংযোগ তৈরি করতে আপনাকে ন্যূনতম তারের সংখ্যা দিন)।

অন্যদিকে যে কোনও নোডের সাথে সংযোগ স্থাপনের সময় দুটি নোডের মধ্যে সংক্ষিপ্ততম পথ পেতে "ডিজকস্ট্রাস অ্যালগরিদম" ব্যবহার করা হবে।


2

সবচেয়ে সহজ ব্যাখ্যাটি প্রাইমগুলিতে রয়েছে আপনি প্রারম্ভিক নোডটি নির্দিষ্ট করেন না , তবে ডিজস্ক্রাতে আপনাকে (একটি শুরুর নোড থাকা দরকার) প্রদত্ত নোড থেকে অন্য সমস্ত নোডের সবচেয়ে ছোট পথ খুঁজে পেতে হবে।


0

@templatetypedef এমএসটি এবং সবচেয়ে সংক্ষিপ্ত পথের মধ্যে পার্থক্য coveredেকে ফেলেছে। আমি অন্যটিতে আলগোরিদিম পার্থক্যটি আবৃত করেছি তাই উত্তর দিয়ে দেখিয়েছি যে উভয়ই একই জেনেরিক অ্যালগরিদম ব্যবহার করে প্রয়োগ করা যেতে পারে যা আরও একটি পরামিতি ইনপুট হিসাবে গ্রহণ করে: ফাংশন f(u,v)। প্রাইম এবং ডিজকস্ট্রার অ্যালগরিদমের মধ্যে পার্থক্যটি কেবল f(u,v)আপনি ব্যবহার করেন।


0

কোড স্তরে, অন্য পার্থক্য হ'ল এপিআই।

আপনার একটি উৎস প্রান্তবিন্দু ব্যবহার করে পরিপাটি আরম্ভ, গুলি , অর্থাত্, Prim.new(s); গুলি কোন প্রান্তবিন্দু হতে পারে, এবং নির্বিশেষে গুলি , শেষ ফলাফল, যা ন্যূনতম spanning বৃক্ষ (এমএসটি) কোণগুলি হয় একই। এমএসটি প্রান্তগুলি পেতে, আমরা পদ্ধতিটি কল করি edges()

আপনার একটি উৎস প্রান্তবিন্দু সঙ্গে Dijkstra আরম্ভ গুলি , অর্থাত্, Dijkstra.new(s)আপনি সব অন্যান্য ছেদচিহ্ন যাওয়ার সংক্ষিপ্ত পথ / দূরত্ব পেতে চান। শেষের ফলাফলগুলি, যা সংক্ষিপ্ততম পথ / গুলি থেকে অন্য সমস্ত শীর্ষে দূরত্ব ; এস উপর নির্ভর করে বিভিন্ন । থেকে সবচেয়ে কম পাথ / দূরত্বের পেতে গুলি কোন প্রান্তবিন্দু, এর V , আমরা পদ্ধতি কল distanceTo(v)এবং pathTo(v)যথাক্রমে।

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