কুইকোর্ট এবং হিপসোর্ট উভয়ই জায়গায় স্থান বাছাই করে। কোনটা ভাল? কোনটি অ্যাপ্লিকেশন এবং ক্ষেত্রে পছন্দসই হয়?
উত্তর:
এই কাগজটির কিছু বিশ্লেষণ আছে।
এছাড়াও, উইকিপিডিয়া থেকে:
কুইকোর্টের সর্বাধিক প্রত্যক্ষ প্রতিযোগী হিপসোর্ট। হিপসোর্টটি সাধারণত কুইকোর্টের চেয়ে কিছুটা ধীর গতিতে থাকে তবে সবচেয়ে খারাপ সময় চলার সময়টি সর্বদা Θ (nlogn)। কুইকসোর্টটি সাধারণত দ্রুত হয়, যদিও ইন্ট্রোসর্ট বৈকল্পিক ব্যতীত সবচেয়ে খারাপ ক্ষেত্রে পারফরম্যান্সের সম্ভাবনা রয়ে যায়, যা কোনও খারাপ কেস সনাক্ত হওয়ার পরে হিপসোর্টে স্যুইচ করে। যদি এটি আগে থেকেই জানা যায় যে হিপসোর্টটি প্রয়োজনীয় হতে চলেছে তবে এটি সরাসরি ব্যবহার করা ইন্ট্রোসোর্টে এটির বদলে অপেক্ষা করার চেয়ে দ্রুত হবে।
হিপসোর্টটি হ'ল (এন লগ এন) গ্যারান্টিযুক্ত, কুইকোর্টে সবচেয়ে খারাপ অবস্থার চেয়ে আরও ভাল। মার্জেসোর্টের প্রয়োজন অনুসারে অর্ডারযুক্ত ডেটা রাখার জন্য হ্যাপসোর্টের আরও অ্যারেটির জন্য আরও মেমরির প্রয়োজন হয় না। তাহলে কেন কৌতুকাল অ্যাপ্লিকেশনগুলি কুইকোর্টের সাথে লেগে থাকে? অন্যদের বাস্তবায়নের ক্ষেত্রে কুইকোর্টের কী এতটা বিশেষ?
আমি নিজেই অ্যালগরিদমগুলি পরীক্ষা করেছি এবং আমি দেখেছি কুইকসোর্টে আসলেই বিশেষ কিছু রয়েছে। এটি দ্রুত সঞ্চালিত হয়, হিপ এবং মার্জ অ্যালগরিদমের চেয়ে অনেক দ্রুত।
কুইকোর্টের গোপনীয়তা: এটি প্রায়শই অযৌক্তিক উপাদানগুলির অদলবদল করে না। অদলবদল সময় সাপেক্ষ।
হ্যাপসোর্টের সাহায্যে, আপনার সমস্ত ডেটা ইতিমধ্যে অর্ডার করা থাকলেও অ্যারের অর্ডার দেওয়ার জন্য আপনি 100% উপাদানগুলি অদলবদল করতে চলেছেন।
মার্জোর্টের সাথে এটি আরও খারাপ। আপনি অন্য অ্যারেতে 100% উপাদান লিখতে চলেছেন এবং ডেটা ইতোমধ্যে অর্ডার করা থাকলেও এটি মূলটিতে আবার লিখতে চলেছেন।
কুইকসোর্টের সাহায্যে আপনি ইতিমধ্যে যা আদেশ করেছেন তা অদলবদল করবেন না। যদি আপনার ডেটা পুরোপুরি অর্ডার করা হয় তবে আপনি প্রায় কিছুই অদলবদল করেন! যদিও নিকৃষ্টতম পরিস্থিতি নিয়ে প্রচুর ঝগড়া-বিবাদ চলছে, তবে পাইভট বাছাইয়ের ক্ষেত্রে কিছুটা উন্নতি, অ্যারের প্রথম বা শেষ উপাদানটি পাওয়া ছাড়া অন্য যে কোনও বিষয় এড়াতে পারে। আপনি যদি প্রথম, শেষ এবং মাঝারি উপাদানের মধ্যবর্তী উপাদান থেকে একটি পাইভট পান তবে সবচেয়ে খারাপ পরিস্থিতি এড়ানো যথেষ্ট।
কুইকসোর্টে যা উচ্চতর তা সবচেয়ে খারাপ ঘটনা নয়, তবে সেরা ক্ষেত্রে! সর্বোত্তম ক্ষেত্রে আপনি একই সংখ্যার তুলনা করেন, ঠিক আছে, তবে আপনি প্রায় কিছুই পরিবর্তন করেন না। গড় ক্ষেত্রে আপনি উপাদানগুলির কিছু অংশ অদলবদল করেন, তবে হিপসোর্ট এবং মার্জেসোর্টের মতো সমস্ত উপাদান নয়। এটিই কুইকোর্টকে সেরা সময় দেয়। কম অদলবদল, আরও গতি।
আমার কম্পিউটারে সি # এর নীচে বাস্তবায়ন, রিলিজ মোডে চলমান রয়েছে, অ্যারেকে মারধর করে middle সেকেন্ডের মাঝারি পাইভট এবং 2 সেকেন্ড উন্নত পিভট দিয়ে (হ্যাঁ, একটি ভাল পিভট পাওয়ার জন্য ওভারহেড রয়েছে))
static void Main(string[] args)
{
int[] arrToSort = new int[100000000];
var r = new Random();
for (int i = 0; i < arrToSort.Length; i++) arrToSort[i] = r.Next(1, arrToSort.Length);
Console.WriteLine("Press q to quick sort, s to Array.Sort");
while (true)
{
var k = Console.ReadKey(true);
if (k.KeyChar == 'q')
{
// quick sort
Console.WriteLine("Beg quick sort at " + DateTime.Now.ToString("HH:mm:ss.ffffff"));
QuickSort(arrToSort, 0, arrToSort.Length - 1);
Console.WriteLine("End quick sort at " + DateTime.Now.ToString("HH:mm:ss.ffffff"));
for (int i = 0; i < arrToSort.Length; i++) arrToSort[i] = r.Next(1, arrToSort.Length);
}
else if (k.KeyChar == 's')
{
Console.WriteLine("Beg Array.Sort at " + DateTime.Now.ToString("HH:mm:ss.ffffff"));
Array.Sort(arrToSort);
Console.WriteLine("End Array.Sort at " + DateTime.Now.ToString("HH:mm:ss.ffffff"));
for (int i = 0; i < arrToSort.Length; i++) arrToSort[i] = r.Next(1, arrToSort.Length);
}
}
}
static public void QuickSort(int[] arr, int left, int right)
{
int begin = left
, end = right
, pivot
// get middle element pivot
//= arr[(left + right) / 2]
;
//improved pivot
int middle = (left + right) / 2;
int
LM = arr[left].CompareTo(arr[middle])
, MR = arr[middle].CompareTo(arr[right])
, LR = arr[left].CompareTo(arr[right])
;
if (-1 * LM == LR)
pivot = arr[left];
else
if (MR == -1 * LR)
pivot = arr[right];
else
pivot = arr[middle];
do
{
while (arr[left] < pivot) left++;
while (arr[right] > pivot) right--;
if(left <= right)
{
int temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
left++;
right--;
}
} while (left <= right);
if (left < end) QuickSort(arr, left, end);
if (begin < right) QuickSort(arr, begin, right);
}
বেশিরভাগ পরিস্থিতিতে, দ্রুত বনাম সামান্য দ্রুত হওয়া অপ্রাসঙ্গিক ... আপনি কখনও কখনও এটি কখনও কখনও ওয়াইয়াই ধীর হওয়া চান না। যদিও ধীরে ধীরে পরিস্থিতি এড়াতে আপনি কুইকসোর্টটিকে সামান্য তাত্পর্যপূর্ণ করতে পারেন তবে আপনি প্রাথমিক কুইকসোর্টের কমনীয়তা হারাবেন। সুতরাং, বেশিরভাগ জিনিসের জন্য, আমি হিপসোর্টটি পছন্দ করি ... আপনি এটির পুরো সাধারণ কমনীয়তায় এটি প্রয়োগ করতে পারেন, এবং কোনও ধীরে ধীরে পাবেন না।
আপনি বেশিরভাগ ক্ষেত্রে সর্বাধিক গতি চান এমন পরিস্থিতিতে, কুইকসোর্ট হিপসোর্টের চেয়ে বেশি পছন্দ করা যেতে পারে, তবে সঠিক উত্তরও হতে পারে না। গতি-সংকটপূর্ণ পরিস্থিতির জন্য, পরিস্থিতির বিশদটি নিবিড়ভাবে পরীক্ষা করা মূল্যবান। উদাহরণস্বরূপ, আমার কিছু গতি-সমালোচনামূলক কোডে, এটি খুব সাধারণ যে ডেটা ইতিমধ্যে বাছাই করা হয়েছে বা কাছাকাছি-বাছাই করা হয়েছে (এটি একাধিক সম্পর্কিত ক্ষেত্রকে সূচকযুক্ত করে যা প্রায়শই উপরে এবং নীচে একসাথে সরানো হয় বা একে অপরের বিপরীতে উপরে এবং নীচে সরানো হয়, সুতরাং একবার আপনি বাছাই করার পরে, অন্যগুলি হয় বাছাই করা হয় বা বিপরীত-বাছাই করা বা বন্ধ করা হয় ... যার মধ্যেই কুইকসোর্টকে হত্যা করতে পারে)। সেক্ষেত্রে, আমি উভয়ই প্রয়োগ করিনি ... পরিবর্তে, আমি ডিজকস্ট্রার স্মুথসোর্ট ... একটি হিপসোর্ট বৈকল্পিক প্রয়োগ করেছি যা ইতিমধ্যে বাছাই করা বা কাছাকাছি বাছাই করার সময় ও (এন) হয় ... এটি এত মার্জিত নয়, বোঝা খুব সহজ নয়, কিন্তু দ্রুত ... পড়ুনhttp://www.cs.utexas.edu/users/EWD/ewd07xx/EWD796a.PDF আপনি কোডে কিছুটা চ্যালেঞ্জজনক কিছু চাইলে পারেন।
কুইকসোর্ট-হিপসোর্ট ইন-প্লেস হাইব্রিডগুলিও খুব আকর্ষণীয়, যেহেতু তাদের বেশিরভাগেরই সবচেয়ে খারাপ ক্ষেত্রে n * লগ এন তুলনা প্রয়োজন (তারা এ্যাসেমপটিক্সের প্রথম মেয়াদে সম্মানের সাথে অনুকূল, তাই তারা সবচেয়ে খারাপ পরিস্থিতি এড়াতে পারে কুইকোর্টের), ও (লগ এন) অতিরিক্ত স্থান এবং তারা ইতিমধ্যে আদেশযুক্ত ডেটা সেট সম্পর্কিত শ্রদ্ধার সাথে কুইকোর্টের ভাল আচরণের কমপক্ষে "অর্ধেক" সংরক্ষণ করে। ডিকার্ট এবং ওয়েইস http://arxiv.org/pdf/1209.4214v1.pdf- তে একটি অত্যন্ত আকর্ষণীয় অ্যালগরিদম উপস্থাপন করেছেন :
কমপ। মধ্যে quick sort
এবং merge sort
উভয় যেহেতু জায়গা বাছাই সেখানে দ্রুত সাজানোর জন্য সময় চলমান wrost মামলার সময় চলমান wrost ক্ষেত্রে মধ্যে একটি পার্থক্য আছে এর ধরনের হয় O(n^2)
এবং জন্য গাদা সাজানোর এটা এখনওO(n*log(n))
এবং তথ্য একটি গড় পরিমাণ জন্য দ্রুত সাজানোর আরো উপযোগী হতে হবে। যেহেতু এটি এলোমেলোম এলোমেলো তাই সঠিক উত্তর পাওয়ার সম্ভাবনা। কম সময়ে আপনি বেছে নেওয়া পিভট উপাদানগুলির অবস্থানের উপর নির্ভর করবে।
সুতরাং ক
ভাল কল: এল এবং জি এর আকার প্রতিটি 3s / 4 এর চেয়ে কম
খারাপ কল: এল এবং জি এর মধ্যে একটির আকার 3s / 4 এর চেয়ে বেশি
অল্প পরিমাণে আমরা সন্নিবেশ সাজানোর জন্য যেতে পারি এবং খুব বড় পরিমাণে ডেটা হিপ সাজানোর জন্য যেতে পারি।
হে (n * লগ (এন)) সবচেয়ে খারাপ চলমান ক্ষেত্রে হিপসোর্টের সুবিধা রয়েছে তাই যেসব ক্ষেত্রে কুইকোর্টটি খুব খারাপভাবে সঞ্চালিত হওয়ার সম্ভাবনা রয়েছে (বেশিরভাগ ক্ষেত্রে সাজানো ডেটা সেটগুলি সাধারণত সাজানো হয়) হিপসোর্টটি বেশি পছন্দ করা হয়।
আচ্ছা আপনি যদি আর্কিটেকচার লেভেলে যান ... আমরা ক্যাশে মেমোরিতে ক্যু ডেটা স্ট্রাকচার ব্যবহার করি so তাই যা সারিতে পাওয়া যায় তা বাছাই হয়ে যাবে। দ্রুত সাজানোর ক্ষেত্রে অ্যারেটিকে কোনও দৈর্ঘ্যে বিভক্ত করার কোনও সমস্যা নেই ... তবে গাদাতে সাজান (অ্যারে ব্যবহার করে) এটি এমনটি ঘটতে পারে যা পিতামাতারা ক্যাশে উপলব্ধ সাব অ্যারেটিতে উপস্থিত নাও হতে পারে এবং তারপরে এটি ক্যাশে স্মৃতিতে আনতে হবে ... যা সময় সাপেক্ষ। ওটা কুইকোর্ট সবচেয়ে ভাল !! 😀
হিপসোর্ট একটি হিপ তৈরি করে এবং তারপরে বারবার সর্বাধিক আইটেমটি বের করে। এর নিকৃষ্টতম পরিস্থিতি হ'ল ও (এন লগ এন)।
তবে যদি আপনি দ্রুত বাছাইয়ের সবচেয়ে খারাপ পরিস্থিতিটি দেখতে পান যা ও (এন 2) হয় তবে আপনি বুঝতে পেরেছেন যে দ্রুততর বাছাই করা বড় ডেটার জন্য খুব ভাল-পছন্দ নয়।
সুতরাং এটি বাছাই একটি আকর্ষণীয় জিনিস; আমি বিশ্বাস করি যে আজ এতগুলি বাছাই করা অ্যালগরিদমগুলি যে কারণে বেঁচে আছে তা হ'ল কারণ সেগুলি তাদের সেরা জায়গায় 'সেরা'। উদাহরণস্বরূপ, ডেটা বাছাই করা হলে বুদ্বুদ বাছাই দ্রুত বাছাই করতে পারে। বা আমরা যদি সাজানোর জন্য আইটেমগুলি সম্পর্কে কিছু জানি তবে সম্ভবত আমরা আরও ভাল করতে পারি।
এটি আপনার প্রশ্নের সরাসরি উত্তর দিতে পারে না, ভেবেছিলাম আমি আমার দুটি সেন্ট যুক্ত করব।
খুব বড় ইনপুটগুলির সাথে কাজ করার সময় হিপ বাছাই করা একটি নিরাপদ বাজি। অ্যাসিপটোটিক বিশ্লেষণ সবচেয়ে খারাপ ক্ষেত্রে হিপসোর্টের বৃদ্ধির ক্রম প্রকাশ করেছে Big-O(n logn)
, যা কুইকোর্টের চেয়ে Big-O(n^2)
সবচেয়ে খারাপ পরিস্থিতি হিসাবে ভাল । তবে, বেশিরভাগ মেশিনে হিপসোর্ট অনুশীলনে কিছুটা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চালিত হয় দ্রুত প্রয়োগের কারণে is হিপসোর্ট একটি স্থিতিশীল বাছাই অ্যালগরিদমও নয়।
কুইকোর্টের তুলনায় হিপসোর্টটি অনুশীলনে ধীর গতির কারণটি হল কুইকোর্টে অবস্থিত রেফারেন্সের আরও ভাল লোকাল (" https://en.wikedia.org/wiki/Locality_of_references "), যেখানে তথ্য উপাদান তুলনামূলকভাবে নিকটবর্তী স্টোরেজ অবস্থানের মধ্যে থাকে। যে সিস্টেমগুলি রেফারেন্সের শক্তিশালী লোকাল প্রদর্শিত হয় সেগুলি পারফরম্যান্স অপটিমাইজেশনের জন্য দুর্দান্ত প্রার্থী। হিপ বাছাই, তবে আরও বড় লাফিয়ে পড়ে। এটি কুইকসোর্টকে আরও ছোট ইনপুটগুলির পক্ষে অনুকূল করে তোলে।
আমার কাছে হিপসোর্ট এবং কুইকোর্টের মধ্যে খুব মৌলিক পার্থক্য রয়েছে: পরেরটি একটি পুনরাবৃত্তি ব্যবহার করে। পুনরাবৃত্তিমূলক আলগোরিদিমগুলিতে পুনরাবৃত্তির সংখ্যার সাথে গাদা বেড়ে যায়। এটি এন ছোট কিনা তাতে কিছু যায় আসে না , তবে এই মুহূর্তে আমি এন = 10 !! 9 দিয়ে দুটি ম্যাট্রিক পাঠাচ্ছি ! প্রোগ্রামটি প্রায় 10 গিগাবাইট র্যাম নেয় এবং যে কোনও অতিরিক্ত মেমরি আমার কম্পিউটারকে ভার্চুয়াল ডিস্ক মেমরিটিতে অদলবদল করতে শুরু করবে। আমার ডিস্কটি একটি র্যাম ডিস্ক, তবে এটির মধ্যে অদলবদল করা গতির ক্ষেত্রে একটি বিশাল পার্থক্য করে । সুতরাং সি ++ তে কোডড একটি স্ট্যাটপ্যাক যাতে প্রোগ্রামারটির আগাম অজানা আকার সহ সামঞ্জস্যযোগ্য মাত্রা ম্যাট্রিক্স অন্তর্ভুক্ত থাকে এবং খুব বড় ডেটা ম্যাট্রিক্সের সাথে ব্যবহারে বিলম্ব এড়াতে আমি হিপসোর্টটি পছন্দ করি।
কথায় কথায় সরল কথায় >> হিপসোর্টটি "ও (এন লগ এন)" এর কুইকসোর্টের ~ গড় চলমান সময়ের বিপরীতে "ও (এন লগ এন)" চলমান সময় "সবচেয়ে খারাপ-ক্ষেত্রে" এর গ্যারান্টি দিয়েছে। কুইকসোর্টটি সাধারণত অনুশীলনে ব্যবহৃত হয়, কারণ সাধারণত এটি দ্রুত হয় তবে হ্যাপসোর্টটি বাইরের ধরণের জন্য ব্যবহার করা হয় যখন আপনার কম্পিউটারের মেমরির সাথে খাপ খায় না এমন বিশাল ফাইল বাছাই করা দরকার।
মূল প্রশ্নের উত্তর দিতে এবং এখানে অন্যান্য কয়েকটি মন্তব্যে সম্বোধন করতে:
আমি কেবল নির্বাচনের বাস্তবায়নগুলি, দ্রুত, সংশ্লেষ এবং হ্যাপ সাজানোর তুলনা করেছি যে তারা একে অপরের বিরুদ্ধে কীভাবে দাঁড়াবে। উত্তরটি হ'ল তাদের সবার ডাউনসাইড রয়েছে।
টিএল; ডিআর: কুইক হ'ল সাধারন উদ্দেশ্য অনুসারে বাছাই (যুক্তিসঙ্গতভাবে দ্রুত, স্থিতিশীল এবং বেশিরভাগ স্থানে থাকা) ব্যক্তিগতভাবে আমি হিপ বাছাই পছন্দ করি তবে আমার স্থিতিশীল সাজানোর প্রয়োজন না থাকলেও।
নির্বাচন - এন ^ 2 - এটি 20 টিরও কম উপাদানগুলির পক্ষে সত্যই ভাল তবে এটি কার্যকর হয় formed যদি না আপনার ডেটা ইতিমধ্যে বাছাই করা হয় বা খুব, খুব প্রায় তাই। এন ^ 2 সত্যই দ্রুত গতিতে ধীরে ধীরে আসে।
দ্রুত, আমার অভিজ্ঞতা, না আসলে যে দ্রুত সব সময়। সাধারণ সাজানোর হিসাবে দ্রুত বাছাইয়ের জন্য বোনাসগুলি হ'ল এটি যথাযথভাবে দ্রুত এবং এটি স্থিতিশীল। এটি একটি অন্তর্নিহিত অ্যালগরিদমও তবে এটি সাধারণত পুনরাবৃত্তভাবে প্রয়োগ করা হওয়ায় এটি অতিরিক্ত স্ট্যাকের স্থান গ্রহণ করবে। এটি ও (এন লগ এন) এবং ও (এন ^ 2) এর মধ্যেও পড়ে। কিছু প্রকারের সময় নির্ধারণ করা এটিকে নিশ্চিত করে মনে হয়, বিশেষত যখন মানগুলি একটি শক্ত পরিসরের মধ্যে পড়ে। এটি 10,000,000 আইটেমের উপর বাছাইয়ের ধরণের চেয়ে দ্রুত, তবে মার্জ বা হিপ থেকে ধীরে ধীরে।
মার্জ সাজানোর গ্যারান্টিযুক্ত হে (এন লগ এন) যেহেতু এর সাজানো ডেটা নির্ভর করে না। আপনি যা মান দিয়েছেন তা নির্বিশেষে এটি এটি যা করে তা কেবল তা করে। এটিও স্থিতিশীল, তবে আপনি যদি প্রয়োগের বিষয়ে সতর্ক না হন তবে খুব বড় ধরণের আপনার স্ট্যাক ফুটিয়ে তুলতে পারে। কিছু জটিল ইন-প্লেস মার্জ সাজ্ট বাস্তবায়ন রয়েছে, তবে সাধারণত আপনার মানগুলিকে একীভূত করতে আপনার প্রতিটি স্তরে আরেকটি অ্যারের প্রয়োজন। যদি সেই অ্যারেগুলি স্ট্যাকটিতে থাকে তবে আপনি সমস্যার সমাধান করতে পারেন।
হিপ সাজানো সর্বাধিক ও (এন লগ এন) হয় তবে অনেক ক্ষেত্রে লগ এন ডিপ হিপকে আপনার মানগুলি কতটা সরিয়ে নিতে হয় তার উপর নির্ভর করে দ্রুত হয়। আসলটি সহজেই মূল অ্যারেটিতে প্রয়োগ করা যেতে পারে, সুতরাং এটির জন্য অতিরিক্ত মেমরির প্রয়োজন হয় না এবং এটি পুনরাবৃত্ত হয়, সুতরাং পুনরাবৃত্তি করার সময় স্ট্যাকের ওভারফ্লো সম্পর্কে কোনও উদ্বেগ নেই। বিশাল গাদা থেকে downside হয় সাজানোর যে এটি একটি স্থিতিশীল সাজানোর, যা এটি ডান আউট মানে যদি আপনি যে প্রয়োজন হয় না।