আসলেই কেউ দক্ষতার সাথে কোনও ফিবোনাচি-হিপ প্রয়োগ করেছেন?


151

আপনারা কেউ কি কখনও ফিবোনাচি-হিপ প্রয়োগ করেছেন ? আমি কয়েক বছর আগে এটি করেছি তবে অ্যারে-ভিত্তিক বিনহ্যাপগুলি ব্যবহারের চেয়ে ধীরে ধীরে ধীরে ধীরে বিস্তারের বেশ কয়েকটি অর্ডার ছিল।

ততক্ষণে, আমি এটিকে গবেষণা হিসাবে যতটা দাবি করে ঠিক ততটা ভাল হয় না তার একটি মূল্যবান পাঠ হিসাবে ভেবেছিলাম। যাইহোক, অনেকগুলি গবেষণাপত্র একটি ফিবোনাচি-হিপ ব্যবহারের উপর ভিত্তি করে তাদের অ্যালগরিদমের চলমান সময়কে দাবী করে।

আপনি কি কখনও কার্যকর বাস্তবায়ন উত্পাদন করতে পরিচালিত করেছেন? অথবা আপনি এত বড় ডেটা-সেট নিয়ে কাজ করেছেন যে ফিবোনাচি-হিপ আরও কার্যকর ছিল? যদি তা হয় তবে কিছু বিশদ প্রশংসিত হবে।


25
আপনি কি জানেন না এই অ্যালগরিদম পরিবারগুলি সর্বদা তাদের বিশাল বড় ওহ এর পিছনে তাদের বিশাল ধাপগুলি আড়াল করে ?! :) এটি বাস্তবে মনে হয়, বেশিরভাগ সময়, "এন" জিনিসটি "এন 0" এর কাছাকাছিও যায় না!
মেহরদাদ আফশারী

আমি এখন জানি. আমি যখন আমার প্রথম "অ্যালগরিদমগুলির পরিচিতির" অনুলিপিটি পেয়েছিলাম তখন এটি প্রয়োগ করেছিলাম। এছাড়াও, আমি টারজানকে এমন কোনও ব্যক্তির জন্য বেছে নিই নি, যিনি একটি অকেজো ডাটা-স্ট্রাকচার আবিষ্কার করবেন, কারণ তার স্প্লে-ট্রিগুলি আসলে বেশ দুর্দান্ত।
এমডিএম

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

1
প্রকৃতপক্ষে, আমি যে প্রোগ্রামটির জন্য গাদা দরকার ছিল তা হ'ল ভিএলএসআই-চিপসে রাউটিংয়ের জন্য স্টেইনার-ট্রিগুলি খুঁজে পাওয়া, সুতরাং ডেটা সেটগুলি একেবারেই ছোট ছিল না। তবে আজকাল (সর্টিংয়ের মতো সাধারণ জিনিসগুলি বাদে) আমি সর্বদা সহজ অ্যালগরিদম ব্যবহার করব যতক্ষণ না এটি ডেটা সেটে "ব্রেক" হয়।
এমডিএম

1
আমার এই উত্তরটি আসলে "হ্যাঁ"। (ভাল, একটি কাগজে আমার সহকারী এটি করেছিলেন)) এখনই আমার কাছে কোড নেই, সুতরাং আমি আসলে প্রতিক্রিয়া জানানোর আগে আরও তথ্য পাব। আমাদের গ্রাফগুলি দেখুন, তবে আমি নোট করছি যে এফ হ্যাপগুলি বি-হ্যাপের চেয়ে কম তুলনা করে। আপনি কি এমন কিছু ব্যবহার করছেন যেখানে তুলনা কম ছিল?
এ। রেক্স

উত্তর:


136

বুস্ট সি ++ লাইব্রেরি মধ্যে ফিবানচি গাদা এর একটি বাস্তবায়ন অন্তর্ভুক্ত 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


ধন্যবাদ! এই প্রশ্নটি দীর্ঘদিন ধরে আমার মনে বসে ছিল। আমি স্টেইনার-ট্রিগুলি চেষ্টা করার আগে ডিজকস্ট্রার ফিবোনাচি-হিপস ব্যবহার করে বাস্তবে বাস্তবায়ন করেছি। তবে মনে হচ্ছে আমার গ্রাফগুলি যেখানে আপনার উদাহরণের চেয়ে অনেক কম ঘন। তাদের লক্ষ লক্ষ নোড ছিল, তবে গড় ডিগ্রি মাত্র 5-6।
এমডিএম

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

দ্বিতীয়টি প্রায় দ্বিগুণ দ্রুত হবে, কারণ ২ য় এক্সট্রাক্টমিন প্রায় মুক্ত। আমাদের অ্যালগরিদম ন্যূনতম উপাদানগুলির একটি ব্যাচ বের করে যার মধ্যে অনেকগুলি ফেলে দেওয়া হয়; বিন স্তূপে নষ্ট করা, তবে একটি ফাইব হিপ থেকে ভাল। দুঃখের বিষয় হিপ-ভিত্তিক অ্যালগরিদম সম্পর্কে কথা বলার সময় লোকেরা যে জটিলতা দেয় তা স্পষ্টভাবে প্রতিফলিত হয় না। এমোরিটাইজড সীমাগুলির সাথে, মোট জটিলতা কেবল # ক্রিয়াকলাপ নয় * অপারেশনের জটিলতা।
গামানিক

1
জোড় জোড় এবং / অথবা স্বচ্ছ heালু জোড় করার চেষ্টা করার কোনও সুযোগ?
থমাস আহলে

1
আমি নিশ্চিত না কেন আপনার ফলাফল এত কাছে হাজির, আমি বনাম স্ব-বাস্তবায়িত Fibonacci গাদা STL priority_queue ব্যবহার করা হয় এবং বাইনারি গাদা আমার একটি বড় মার্জিন দ্বারা পেছনে আছি পরীক্ষার
নিকোলাস পিপিটোন

33

1993 সালে তাঁর স্ট্যানফোর্ড গ্রাফবেস বইয়ের জন্য নুথ ন্যূনতম বিস্তৃত গাছগুলির জন্য ফিবোনাচি হিপ এবং বাইনারি হ্যাপগুলির মধ্যে একটি তুলনা করেছিলেন । তিনি যে ঘন গ্রাফের আকারগুলি পরীক্ষা করছেন তার গ্রাফ আকারে বাইনারি হ্যাপের তুলনায় 30 থেকে 60 প্রসেসেন্ট ধীর গতিতে পাওয়া গিয়েছিল, বিভিন্ন ঘনত্বের 128 টি লম্বা।

সোর্স কোড (বরং CWEB যা সি, গণিত আর টেক্স মধ্যে একটি ক্রস বা) ধারা MILES_SPAN মধ্যে C হয়।


1

দাবি পরিত্যাগী

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


সম্ভবত আমি কিছু ভুল করেছি, তবে আমি এ.রেক্স আনসার তুলনার ভিত্তিতে একটি পরীক্ষা লিখেছি :

  • ফিবানচি-গাদা
  • ডি-আরি-হিপ (4)
  • বাইনারি-গাদা
  • নিরুদ্বেগ-গাদা

সমস্ত স্তূপের জন্য মৃত্যুদন্ড কার্যকর করার সময় (কেবলমাত্র সম্পূর্ণ গ্রাফের জন্য) খুব কাছাকাছি ছিল। 1000,2000,3000,4000,5000,6000,7000 এবং 8000 উল্লম্ব সহ সম্পূর্ণ গ্রাফের জন্য পরীক্ষা করা হয়েছিল। প্রতিটি পরীক্ষার জন্য 50 টি এলোমেলো গ্রাফ তৈরি হয়েছিল এবং আউটপুট প্রতিটি স্তূপের গড় সময়:

আউটপুট সম্পর্কে দুঃখিত, এটি খুব ভার্বোজ নয় কারণ পাঠ্য ফাইলগুলি থেকে কিছু চার্ট তৈরি করার জন্য আমার এটির দরকার ছিল।


এখানে ফলাফলগুলি (সেকেন্ডে):

গাদা ফলাফল টেবিল


4
প্রতিটি ক্ষেত্রে কত প্রান্ত রয়েছে? এবং আপনি ঠিক কি চলছে অ্যালগরিদম? আমরা কী জানি আমরা কীভাবে কাজ করছি তা যদি না জানি তবে আপনার ফলাফলগুলি অর্থবোধ করে না।
কোকক্স

আমি দুঃখিত হিসাবে, সমস্ত গ্রাফ সম্পূর্ণ হয়ে গেছে, সুতরাং আপনি প্রতিটি মামলার জন্য প্রান্তের সংখ্যা গণনা করতে পারেন। আপনার অর্থ, "আপনি কি ঠিক চালাচ্ছেন"। তারা টেবিলের মাথায় রয়েছে।
গিলহার্ম টোরেস কাস্ত্রো

22
দেখে মনে হচ্ছে চলমান সময় পুরোপুরি গাদা ছাড়া অন্য কিছু দ্বারা প্রভাবিত হয় (এটি গ্রাফ বা কিছু আইও তৈরি করতে পারে) of এগুলি প্রায় একই ফলাফল অবিশ্বাস্য।
আল্পেদার

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

এই পরীক্ষাগুলি সম্পূর্ণ আলাদা কিছু পরিমাপ করছে বলে মনে হচ্ছে। আপনি যে পরীক্ষায় দৌড়েছিলেন সে সম্পর্কে আপনি মন্তব্য করতে পারেন? মনে রাখবেন যে দূরত্বগুলি জ্যামিতিক / ইউক্যালিডিয়ান হলে সম্পূর্ণ গ্রাফের সংক্ষিপ্ত পথের সমস্যাটি হ'ল (1)।
গামানিক

0

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

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