প্রতিটি বাছাই অ্যালগরিদম কখন ব্যবহার করা হয়? [বন্ধ]


170

যখন কোনও নির্দিষ্ট বাছাই করা অ্যালগরিদম অন্যের চেয়ে বেশি পছন্দ করা হয় তখন কী কী ব্যবহার করা যায় - কুইকসোর্ট বনাম হিপসোর্ট বনাম 'পরিচিতি সাজানো' ইত্যাদি একত্রিত করুন?

আকার, ডেটা স্ট্রাকচারের ধরণ, উপলভ্য মেমরি এবং ক্যাশে এবং সিপিইউ পারফরম্যান্সের ভিত্তিতে সেগুলি ব্যবহার করার জন্য কি কোনও প্রস্তাবিত গাইড রয়েছে?


বিভিন্ন ধরণের ডেটা এবং অ্যালগরিদমের জন্য অ্যানিমেশনের একটি সেট <a href=" বাছাই- algorithms.com/ "> বাছাই- algorithms.com </ a >
চিপ ইউনি


@ শিপউনি এখানে স্থির লিঙ্ক: টেলপাল.ডেভলভারস
এরিক

2
কেন এই প্রশ্নটি বন্ধ !?
অরবন্দ

উত্তর:


316

প্রথমত, একটি সংজ্ঞা, যেহেতু এটি বেশ গুরুত্বপূর্ণ: স্থিতিশীল বাছাই হ'ল এমন একটি যা গ্যারান্টিযুক্ত অভিন্ন কীগুলির সাহায্যে উপাদানগুলিকে পুনঃক্রম করতে না পারে।

প্রস্তাবনা:

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

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

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

Introsort: এটি একটি দ্রুত বাছাই যা দ্রুত বাছাইয়ের হে (এন ^ 2) সবচেয়ে খারাপ ক্ষেত্রে কেটে যাওয়ার জন্য একটি নির্দিষ্ট পুনরাবৃত্তির গভীরতার পরে একটি গাদা ধরণের স্যুইচ করে। এটি প্লেইন পুরাতন দ্রুত সাজানোর থেকে প্রায় সর্বদা ভাল, যেহেতু আপনি গ্যারান্টিযুক্ত ও (এন লগ এন) পারফরম্যান্স সহ একটি দ্রুত সাজানোর গড় কেস পান। এর পরিবর্তে হিপ সাজানোর ব্যবহারের একমাত্র কারণ হ'ল মারাত্মক মেমোরি সীমাবদ্ধ সিস্টেমে যেখানে হে (লগ এন) স্ট্যাকের স্থানটি কার্যত গুরুত্বপূর্ণ।

সন্নিবেশ সাজান : যখন এন ছোট হওয়ার গ্যারান্টিযুক্ত হয়, তাত্ক্ষণিকভাবে বা সাজানোর মেশিনের বেস কেস সহ। এটি ও (এন ^ 2) হলেও এটির একটি খুব সামান্য ধ্রুবক রয়েছে এবং এটি একটি স্থিতিশীল বাছাই।

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


তুলনাহীন প্রকারের: কিছু মোটামুটি সীমাবদ্ধ শর্তে ও (এন লগ এন) বাধা ভেঙে ও (এন) বাছাই করা সম্ভব। এখানে এমন কয়েকটি মামলা রয়েছে যেখানে এটি চেষ্টা করার মতো:

গণনা বাছাই: আপনি যখন একটি সীমিত পরিসরের সাথে পূর্ণসংখ্যার বাছাই করছেন।

রেডিক্স সাজান: যখন লগ (এন) কে এর চেয়ে উল্লেখযোগ্যভাবে বড় হয়, যেখানে কে মূলমাত্রার অঙ্কের সংখ্যা is

বালতির সাজান: আপনি যখন নিশ্চিত করতে পারেন যে আপনার ইনপুটটি প্রায় অভিন্নভাবে বিতরণ করা হয়েছে।


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


2
+1 খুব আকর্ষণীয়। আপনি কীভাবে "গ্যারান্টি ... প্রায় অভিন্নভাবে বিতরণ করা যায়" তা ব্যাখ্যা করার যত্ন নেবেন? বালতি বাছাইয়ের জন্য?
স্যাম ওভারটন 21

2
কেন অন্তর্মুখী দ্রুত সাজানোর চেয়ে যথেষ্ট ধীর হবে? একমাত্র ওভারহেড হ'ল পুনরাবৃত্তির গভীরতা গণনা করা, যা নগদ হওয়া উচিত। এটি কেবল পুনরাবৃত্তির পরে স্যুইচ হয় এটি একটি ভাল দ্রুত সাজানোর ক্ষেত্রে হওয়া উচিত তার চেয়ে অনেক গভীর।
dsimcha

2
আপনি উল্লেখ করতে ব্যর্থ হন যে বুদ্বুদ সাজানোর সর্বোত্তম কেস হল ও (এন)!
তারা

33

কুইকসোর্টটি সাধারণত গড়ে সবচেয়ে দ্রুত, তবে এটিতে বেশ খারাপ অভ্যাসগত আচরণ রয়েছে। সুতরাং আপনার যদি কোনও গ্যারান্টি দিতে হয় তবে কোনও খারাপ ডেটা আপনাকে দেয় নাO(N^2) এটি এড়ানো উচিত।

মার্জ-সাজানোর অতিরিক্ত মেমরি ব্যবহার করে তবে এটি বাহ্যিক বাছাইয়ের জন্য বিশেষভাবে উপযুক্ত (যেমন বিশাল ফাইলগুলি যা মেমরির সাথে খাপ খায় না)।

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

যেখানে কেবল একটি সীমাবদ্ধ পরিসরে পূর্ণসংখ্যা জড়িত রয়েছে, আপনি এটিকে খুব দ্রুত করতে কিছু ধরণের রেডিক্স সাজানোর ব্যবহার করতে পারেন।

99% ক্ষেত্রে, আপনি সাধারণত ক্যুইকোর্টের উপর ভিত্তি করে লাইব্রেরির ধরণের সাথে ভাল থাকবেন।


6
+1: "99% ক্ষেত্রে, আপনি লাইব্রেরি ধরণের সাথে ভাল থাকবেন, যা সাধারণত কোকসোর্টের ভিত্তিতে থাকে" "
জিম জি।

র‌্যান্ডমাইজড পাইভোটিং কুইকসোর্টকে খারাপ ব্যবহারের বিষয়ে কোনও গ্যারান্টি ছাড়াই সমস্ত ব্যবহারিক কাজের জন্য একটি রানটাইম দেয় a আমি সত্যিই মনে করি না যে কেউ কোনও প্রডাকশন কোডের জন্য একটি ও (এন ^ 2) কুইকোর্টের প্রয়োগ করে।
এমএকে

2
সি, স্ট্যান্ডার্ড লাইব্রেরি কিউসোর্ট বাদে কি ম্যাক? ( google.com/codesearch/… ) - যার উপর "প্রডাকশন কোড" সর্বাধিক নির্ভর করে
এলি বেন্ডারস্কি

লাইব্রেরি বাছাই সাধারণত কুইকোর্টের উপর ভিত্তি করে নয়, কারণ এটি স্থিতিশীল নয়। প্রায় সমস্ত উচ্চতর ভাষা (সি এর জন্য প্রত্যাশা) একটি স্থিতিশীল বাছাই সরবরাহ করে। বেশিরভাগ ক্ষেত্রে আমি জানি আপনার একটি স্থিতিশীল, বা কমপক্ষে একটি নির্বিচারক, বাছাই করা দরকার।
12431234123412341234123


3

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

http://corte.si/posts/code/visualisingsorting/index.html এবং http://corte.si/posts/code/mittedort/index.html এ বিভিন্ন বাছাই করা অ্যালগরিদমের সাথে তুলনা করে কিছু দুর্দান্ত চিত্রও রয়েছে।


0

@ ডিএসিমচা লিখেছেন: গণনা বাছাই: আপনি যখন একটি সীমিত পরিসরের সাথে পূর্ণসংখ্যাগুলি বাছাই করছেন

আমি এটিতে পরিবর্তন করব:

গণনা বাছাই: আপনি পজিটিহোলের কারণে ধনাত্মক পূর্ণসংখ্যগুলি সাজান (0 - পূর্ণসংখ্যার। MAX_VALUE-2)।

আপনি সর্বদা লিনিয়ার সময়টিতে দক্ষতার সংজ্ঞা হিসাবে সর্বাধিক এবং ন্যূনতম মানগুলি পেতে পারেন।
মধ্যবর্তী অ্যারের জন্য আপনার কমপক্ষে n অতিরিক্ত স্থানও প্রয়োজন এবং এটি স্পষ্টতই স্থিতিশীল।

/**
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

(যদিও এটি প্রকৃতপক্ষে MAX_VALUE-2 এ অনুমতি দেবে) দেখুন: জাভা অ্যারেগুলির কি সর্বোচ্চ আকার রয়েছে?

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

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