কেন ডিজকস্ট্রার অ্যালগরিদম হ্রাস-কী ব্যবহার করে?


95

ডিজকস্ট্রার অ্যালগরিদমটি আমাকে শিখানো হয়েছিল নীচে

while pqueue is not empty:
    distance, node = pqueue.delete_min()
    if node has been visited:
        continue
    else:
        mark node as visited
    if node == target:
        break
    for each neighbor of node:
         pqueue.insert(distance + distance_to_neighbor, neighbor)

তবে আমি অ্যালগরিদম সম্পর্কিত কিছু পাঠ করছি, এবং অনেকগুলি সংস্করণ আমি হ্রাস-কীটি সন্নিবেশ করার বিপরীতে দেখছি।

এটি কেন এবং দুটি পদ্ধতির মধ্যে পার্থক্য কী?


14
ডাউনভোটার- আপনি কি এই প্রশ্নটির সাথে ভুল বলতে পারেন? আমি মনে করি এটি পুরোপুরি ন্যায্য, এবং হ্রাস-কী সংস্করণের পরিবর্তে অনেক লোককে (আমাকে সহ) প্রথমে ডিজকস্ট্রার ওপির সংস্করণে পরিচয় করা হয়েছিল।
টেম্পলেটটিফাইফ

উত্তর:


71

নোডগুলি পুনরায় প্রবেশের পরিবর্তে হ্রাস-কী ব্যবহার করার কারণটি হল অগ্রাধিকারের সারিতে নোডের সংখ্যা ছোট রাখা, এভাবে অগ্রাধিকারের সারির মোট সংখ্যাটি ছোট এবং প্রতিটি অগ্রাধিকারের সারির ব্যালেন্সের দাম কম রাখা।

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

ডিজকস্ট্রার অ্যালগরিদম যা হ্রাস-কী সমর্থন করে তার বাস্তবায়নে নোডগুলি ধারণ করে এমন অগ্রাধিকারের সারিটি এর নোড দিয়ে শুরু হয় এবং অ্যালগরিদমের প্রতিটি ধাপে একটি নোড সরিয়ে দেয়। এর অর্থ হিপ ডিকুইজের মোট সংখ্যা এন। প্রতিটি নোডের হ্রাস-কী থাকবে এটির প্রতিটি প্রান্তের জন্য একবার এটির দিকে ঝুঁকির সাথে যোগাযোগ করা, সুতরাং হ্রাস-কীগুলির মোট সংখ্যাটি বেশিরভাগ মি। এটি (এন টি + এন টি ডি + এম টি কে ) এর একটি রানটাইম দেয় , যেখানে টি কে হ্রাস-কী বলার জন্য প্রয়োজনীয় সময়।

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

Queue          |  T_e   |  T_d   |  T_k   | w/o Dec-Key |   w/Dec-Key
---------------+--------+--------+--------+-------------+---------------
Binary Heap    |O(log N)|O(log N)|O(log N)| O(M log N)  |   O(M log N)
Binomial Heap  |O(log N)|O(log N)|O(log N)| O(M log N)  |   O(M log N)
Fibonacci Heap |  O(1)  |O(log N)|  O(1)  | O(M log N)  | O(M + N log N)

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

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

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

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


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

4
@ রায়পুন- আপনার একটি বক্তব্য রয়েছে, তবে যেহেতু আমার ধারণা সাধারণত এটি ধরে নেওয়া হয়েছে যে অ্যালগোরিদম চালানোর আগে সমান্তরাল প্রান্তগুলি কমিয়ে দেওয়া হয়েছিল আমি মনে করি না যে হে (লগ এন) বনাম হে (লগ এম) এর চেয়ে বেশি গুরুত্ব পাবে। সাধারণত এমকে ও (এন ^ 2) বলে ধরে নেওয়া হয়।
টেম্পলেটটিফাইফ

28

2007-এ, এমন একটি কাগজ ছিল যা হ্রাস-কী সংস্করণ এবং সন্নিবেশকরণ সংস্করণ ব্যবহারের মধ্যে মৃত্যুদন্ড কার্যকর করার সময়ের পার্থক্যগুলি অধ্যয়ন করে। Http://www.cs.utexas.edu/users/ Shaikat / papers / TR- 07-54.pdf দেখুন

তাদের প্রাথমিক উপসংহারটি বেশিরভাগ গ্রাফের জন্য হ্রাস-কী ব্যবহার করা হয়নি। বিশেষত বিরল গ্রাফগুলির জন্য, অ-হ্রাস কীটি হ্রাস-কী সংস্করণের তুলনায় উল্লেখযোগ্যভাবে দ্রুত। আরও বিশদ জন্য কাগজ দেখুন।


7
cs.sunysb.edu/~rezaul/papers/TR-07-54.pdf সেই কাগজের জন্য একটি কার্যকারী লিঙ্ক।
ইলিয়ানোরা

সতর্কতা: লিঙ্কযুক্ত কাগজে একটি বাগ রয়েছে। পৃষ্ঠা 16, ফাংশন বি 2: if k < d[u]হওয়া উচিত if k <= d[u]
জেভেরুস

2

ডিজকস্ট্রা বাস্তবায়নের দুটি উপায় রয়েছে: একটি হ'ল ব্যবহার করে যা হ্রাস-কী সমর্থন করে এবং অন্যটি এমন একটি গাদা যা সমর্থন করে না।

এগুলি উভয়ই সাধারণভাবে বৈধ, তবে পরবর্তীকালে সাধারণত পছন্দ হয়। নিম্নলিখিতগুলিতে আমি প্রান্তের সংখ্যাটি চিহ্নিত করতে 'এম' এবং আমাদের গ্রাফের শীর্ষাংশের সংখ্যা বোঝাতে 'এন' ব্যবহার করব:

আপনি যদি সর্বোত্তম সম্ভাব্যতম জটিলতাটি চান তবে আপনি একটি ফিবোনাচি হিপ নিয়ে যাবেন যা হ্রাস-কীকে সমর্থন করে: আপনি একটি দুর্দান্ত ও (এম + এনলোজান) পাবেন।

যদি আপনি গড় কেসটি সম্পর্কে যত্নশীল হন তবে আপনি বাইনারি হিপও ব্যবহার করতে পারেন: আপনি ও (এম + এনলগ (এম / এন) লগইন পাবেন)। প্রুফ এখানে আছে , পৃষ্ঠা 99/100। যদি গ্রাফটি ঘন (মিঃ এন) হয় তবে এটি দুটি এবং পূর্বের উভয়ই ও (এম) থাকে।

আপনি যদি তাদের যদি সত্যিকারের গ্রাফগুলিতে চালিত করেন তবে কী ঘটে তা জানতে চান, আপনি এই কাগজটি পরীক্ষা করতে পারেন , যেমন মার্ক মকেটন তার উত্তরে পরামর্শ করেছিলেন suggested

পরীক্ষাগুলির ফলাফল কী প্রদর্শিত হবে তা হ'ল "সরল" গাদা বেশিরভাগ ক্ষেত্রে সেরা ফলাফল দেয়।

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

অনুরূপ কারণে, একটি গাদা যে হ্রাস-কী অপারেশন সমর্থন করতে হবে না, এমনকি কম ধ্রুবক কারণ আছে এবং আসলে সেরা সঞ্চালন। বিশেষত গ্রাফটি যদি খুব কম থাকে।

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