বুস্ট সি ++ লাইব্রেরি মধ্যে ফিবানচি গাদা এর একটি বাস্তবায়ন অন্তর্ভুক্ত boost/pending/fibonacci_heap.hpp
। এই ফাইলটি দৃশ্যত pending/
কয়েক বছর ধরে রয়েছে এবং আমার অনুমানগুলি কখনও গ্রহণযোগ্য হবে না। এছাড়াও, সেই বাস্তবায়নে কিছু বাগ রয়েছে, যা আমার পরিচিত এবং চারিদিক শীতল লোক অ্যারন উইন্ডসর দ্বারা স্থির করেছিলেন। দুর্ভাগ্যক্রমে, সেই ফাইলটির বেশিরভাগ সংস্করণ যা আমি অনলাইনে খুঁজে পেলাম (এবং উবুন্টুর লাইববুস্ট-ডেভ প্যাকেজের মধ্যে একটি) এখনও বাগ রয়েছে; সাবভার্সন সংগ্রহশালা থেকে আমাকে একটি পরিষ্কার সংস্করণ টানতে হয়েছিল ।
সংস্করণ 1.49 বুস্ট সি ++ গ্রন্থাগারগুলিতে ফিবোনাচি হিপ সহ প্রচুর নতুন হ্যাপ স্ট্রাক্ট যুক্ত হয়েছে।
ফিজোনাচি হিপস এবং বাইনারি হিপগুলির তুলনা করার জন্য আমি dijkstra_shortest_paths.hpp এর পরিবর্তিত সংস্করণের বিরুদ্ধে dijkstra_heap_performance.cpp সংকলন করতে সক্ষম হয়েছি । (লাইনে typedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue
, পরিবর্তন relaxed
করুন fibonacci
)) আমি প্রথমে অপ্টিমাইজেশানগুলি সংকলন করতে ভুলে গিয়েছিলাম, যে ক্ষেত্রে ফিবোনাচি এবং বাইনারি হিপগুলি প্রায় একটি নগণ্য পরিমাণে ছাড়িয়ে যায় with আমি খুব শক্তিশালী অপ্টিমাইজেশানগুলি সংকলনের পরে, বাইনারি হিপগুলি একটি প্রচুর উত্সাহ পেয়েছে। আমার পরীক্ষাগুলিতে, গ্রাফিকটি অবিশ্বাস্যভাবে বড় এবং ঘন হলে ফাইবোনাচি কেবল বাইনারি হ্যাপগুলিই ছাড়িয়ে যায়, যেমন:
Generating graph...10000 vertices, 20000000 edges.
Running Dijkstra's with binary heap...1.46 seconds.
Running Dijkstra's with Fibonacci heap...1.31 seconds.
Speedup = 1.1145.
যতদূর আমি বুঝতে পেরেছি, এটি ফিবোনাকির হ্যাপস এবং বাইনারি হ্যাপগুলির মধ্যে মৌলিক পার্থক্যগুলিকে স্পর্শ করে। দুটি ডেটা স্ট্রাকচারের মধ্যে একমাত্র আসল তাত্ত্বিক পার্থক্য হ'ল ফিবোনাচি হ'ল ধ্রুবক সময় (অমিতকরণে) হ্রাস-কীকে সমর্থন করে। অন্যদিকে, বাইনারি হ্যাপগুলি অ্যারে হিসাবে তাদের প্রয়োগ থেকে দুর্দান্ত কর্মক্ষমতা পায়; একটি সুস্পষ্ট পয়েন্টার কাঠামো ব্যবহার করা মানে ফিবোনাচি গাদা একটি বিশাল পারফরম্যান্স হিট suffer
সুতরাং, অনুশীলনে ফিবোনাকির স্তূপগুলি থেকে উপকার পাওয়ার জন্য আপনাকে এগুলি এমন একটি অ্যাপ্লিকেশনটিতে ব্যবহার করতে হবে যেখানে হ্রাস_কিগুলি অবিশ্বাস্যভাবে ঘন ঘন হয়। ডিজকস্ট্রার ক্ষেত্রে, এর অর্থ হ'ল অন্তর্নিহিত গ্রাফটি ঘন। কিছু অ্যাপ্লিকেশন অভ্যন্তরীণভাবে হ্রাস_কী-তীব্র হতে পারে; আমি নাগমোচি-ইবারাকি ন্যূনতম-কাটা অ্যালগরিদম চেষ্টা করে দেখতে চেয়েছিলাম কারণ স্পষ্টতই এটি প্রচুর হ্রাস -পর্ব তৈরি করে, তবে সময় নির্ধারণের তুলনায় এটির জন্য অনেক বেশি প্রচেষ্টা ছিল।
সতর্কতা : আমি হয়ত কিছু ভুল করেছি। আপনি নিজেরাই এই ফলাফলগুলি পুনরায় উত্পাদনের চেষ্টা করতে পারেন।
তাত্ত্বিক নোট : ডিজনস্ট্রার রানটাইমের মতো তাত্ত্বিক অ্যাপ্লিকেশনগুলির জন্য হ্রাস_কির উপর ফিবোনাচি হিপগুলির উন্নত কর্মক্ষমতা গুরুত্বপূর্ণ। ফিবোনাচি হিপগুলি সন্নিবেশ এবং মার্জিংয়ের ক্ষেত্রে বাইনারি হ্যাপগুলি ছাড়িয়ে যায় (উভয়ই ফিবোনাকির স্তূপগুলির জন্য অবিচ্ছিন্ন ধ্রুবক সময়)। সন্নিবেশ মূলত অপ্রাসঙ্গিক, কারণ এটি ডিজকস্ট্রার রানটাইমকে প্রভাবিত করে না, এবং বাইনারি হিপগুলিকে সংশোধন করা নিয়মিত সময়ে সন্নিবেশ করানো মোটামুটি সহজ। ধ্রুব সময়ে মার্জ করা দুর্দান্ত, তবে এই অ্যাপ্লিকেশনটির সাথে প্রাসঙ্গিক নয়।
ব্যক্তিগত দ্রষ্টব্য : আমার এবং আমার এক বন্ধু একবার নতুন অগ্রাধিকারের সারি ব্যাখ্যা করার জন্য একটি কাগজ লিখেছিলেন, যা তাদের জটিলতা ছাড়াই ফিবোনাকির স্তূপগুলির (তাত্ত্বিক) চলমান সময়ের প্রতিরূপ করার চেষ্টা করেছিল। কাগজটি কখনই প্রকাশিত হয় নি, তবে আমার সহকারী বাইনারি হিপস, ফিবোনাচি হ্যাপস এবং ডেটা স্ট্রাকচারের তুলনা করার জন্য আমাদের নিজস্ব অগ্রাধিকারের সারি কার্যকর করেছে। পরীক্ষামূলক ফলাফলের গ্রাফগুলি ইঙ্গিত দেয় যে ফিবোনাচি মোট তুলনার দিক থেকে কিছুটা বাহ্যিক সম্পাদিত বাইনারি হ্যাপসকে বোঝায় যে ফিবোনাচি হিপগুলি এমন পরিস্থিতিতে উন্নতি করতে পারে যেখানে তুলনামূলক ব্যয় ওভারহেড ছাড়িয়ে যায়। দুর্ভাগ্যক্রমে, আমার কাছে কোডটি উপলব্ধ নেই এবং সম্ভবত আপনার পরিস্থিতির তুলনাটি সস্তা, সুতরাং এই মন্তব্যগুলি প্রাসঙ্গিক তবে সরাসরি প্রযোজ্য নয়।
ঘটনাক্রমে, আমি আপনার নিজের ডেটা কাঠামোর সাথে ফিবোনাচি হিপসের রানটাইমটি মেলাতে চেষ্টা করার পরামর্শ দিচ্ছি। আমি দেখতে পেলাম যে আমি কেবল ফিবোনাচি নিজেকে নতুনভাবে আবিষ্কার করি। এর আগে আমি ভেবেছিলাম যে ফিবোনাকির স্তূপগুলির সমস্ত জটিলতা কিছু এলোমেলো ধারণা, তবে পরে আমি বুঝতে পেরেছিলাম যে তারা সমস্ত প্রাকৃতিক এবং মোটামুটি বাধ্য forced