কেন মিক্সোয়ার্টের চেয়ে কুইকোর্ট ভাল?


354

একটি সাক্ষাত্কারের সময় আমাকে এই প্রশ্ন করা হয়েছিল। এগুলি উভয়ই (এনলগন) এবং তবুও বেশিরভাগ লোক Mergesort এর পরিবর্তে Quicksort ব্যবহার করে। কেন এমন?


91
এটি খুব ভাল একটি সাক্ষাত্কার প্রশ্ন নয়। রিয়েল-ওয়ার্ল্ডের ডেটা বদলানো হয় না: এতে প্রায়শই প্রচুর অর্ডার থাকে যা একটি স্মার্ট সাজ্ট ব্যবহার করতে পারে এবং অ্যালগরিদম দুটি স্বয়ংক্রিয়ভাবে এটি করে না, কোকিকোর্টের চেয়ে এটি করার জন্য মার্জ সাজ্ট হ্যাক করা সহজ। গনুহ libc এর qsort, পাইথন এর list.sort, এবং Array.prototype.sortফায়ারফক্সের জাভাস্ক্রিপ্ট সমস্ত souped-আপ একত্রীকরণ প্রকারের হয়। (গনুহ STL sortIntrosort পরিবর্তে ব্যবহার করে, কিন্তু যে হতে পারে কারণ সি ++ সোয়াপিং সম্ভাব্য বড় অনুলিপি উপর ধিক্কার জানাই।)
জেসন Orendorff

3
@ জেসন ওরেডরফ: এটা কেন "easier to hack a mergesort to do it than a quicksort"? আপনি উল্লেখ করতে পারেন যে কোন নির্দিষ্ট উদাহরণ?
লেজার

16
@ESKay একটি মার্জ সাজান শুরু করা তথ্যগুলি বাছাই করা সাবারিগুলিতে গোষ্ঠীবদ্ধ করে শুরু হয়। যদি অ্যারে প্রথমে কিছু ইতিমধ্যে সাজানো অঞ্চল থাকে তবে আপনি শুরুর আগেই সেখানে উপস্থিত হয়ে সনাক্ত করে আপনি প্রচুর সময় বাঁচাতে পারেন। এবং আপনি ও (এন) সময়ে এটি করতে পারেন। নির্দিষ্ট উদাহরণগুলির জন্য, আমি উল্লিখিত তিনটি প্রকল্পের উত্স কোডটি দেখুন! সেরা উদাহরণ পাইথন এর Timsort, এখানে বিস্তারিতভাবে বর্ণনা হতে পারে: svn.python.org/view/python/trunk/Objects/... এবং বাস্তবায়িত svn.python.org/view/python/trunk/Objects/...
জেসন ওরেডরফ

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

3
@ জেআর্যান্ডম_হ্যাকার: ঠিক, আমি এটাই বোঝাচ্ছিলাম। তবে বিবেচনা করুন: {10, 2, 3, 4, 5, 6, 7, 8, 1, 9 almost প্রায় সম্পূর্ণরূপে বাছাই করা সত্ত্বেও, পার্টিশনের আগে পরীক্ষা করে এটি পাওয়া যাবে না এবং এর পরেও পাওয়া যাবে না। পরবর্তী কলের জন্য এটি পরীক্ষা করার আগে পার্টিশন এটি স্ক্রু করে দেবে। এদিকে, কোনও স্থানান্তরিত হওয়ার আগে বিভাগের ধাপগুলিতে বাছাই করা ক্রমগুলির জন্য সৃজনশীল ক্রমগুলি পরীক্ষা করুন এবং স্মার্ট ব্যক্তিরা বিভাগের পদক্ষেপের সময় এই জাতীয়
রানগুলি

উত্তর:


275

কুইকোর্টের ও ( এন 2 ) সবচেয়ে খারাপ ক্ষেত্রে রানটাইম এবং হে ( এন লগ এন) রয়েছে ) গড় কেস রানটাইম রয়েছে। যাইহোক, অনেক পরিস্থিতিতে একত্রিত করার পক্ষে এটি সর্বোত্তম because কারণ অনেকগুলি কারণ একটি অ্যালগরিদমের রানটাইমকে প্রভাবিত করে এবং যখন সেগুলি একসাথে নিয়ে যায়, কুইকোর্টটি জিতে যায়।

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

তদ্ব্যতীত, কুইকোর্টের সবচেয়ে খারাপ পরিস্থিতি ও ( এন 2 ) এর রান টাইমটিকে প্রায় পুরোপুরি পিভটের উপযুক্ত পছন্দ ব্যবহার করে এড়ানো এড়ানো খুব সহজ - যেমন এলোমেলোভাবে বাছাই করা (এটি একটি দুর্দান্ত কৌশল)।

std::sortবাস্তবে, কুইকোর্টের অনেকগুলি আধুনিক বাস্তবায়ন (বিশেষত libstdc ++ 's ) আসলে অন্তঃসত্ত্বা , যার তাত্ত্বিকভাবে সবচেয়ে খারাপ-কেস O ( n লগ এন ), মার্জ সাজানোর মতো same এটি পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করে এবং লগ এন ছাড়িয়ে গেলে ভিন্ন অ্যালগরিদম ( হিপসোর্ট ) এ স্যুইচ করে এটি অর্জন করে ।


4
উইকিপিডিয়া নিবন্ধে বলা হয়েছে যে এটি হিপসোর্টে স্যুইচ করে, মার্জোর্ট নয় ... শুধু এফওয়াইআই।
Sev:

3
@ শেভ:… যেমন অরিগনাল পেপার। ভুল উল্লেখ করার জন্য ধন্যবাদ। - এটি সত্যই গুরুত্বপূর্ণ নয়, যেহেতু তাদের অ্যাসিম্পটোটিক চলমান সময় একই।
কনরাড রুডল্ফ

110
কেন এটি সঠিক উত্তর হিসাবে নির্বাচিত? এগুলি ব্যাখ্যা করে যে সমস্যাগুলি কীভাবে দ্রুত প্যাচ করা যায়। এটি এখনও তাড়াতাড়ি জানায় না যে দ্রুত সাজানোর কেন অন্যের চেয়ে বেশি ব্যবহৃত হয়? "দ্রুত সাজানোর উত্তরটি কি অন্যের চেয়ে বেশি ব্যবহৃত হয় কারণ এক গভীরতার পরে আপনি হিপসোর্টে স্যুইচ করতে পারেন"? .. তবে প্রথমে হিপসোর্ট ব্যবহার করবেন না কেন? .. কেবল বোঝার চেষ্টা করছি ...
কোডওজারবার

16
@ পি 1 ভাল প্রশ্ন। আসল উত্তরটি হ'ল, গড় তথ্যের জন্য, কুইকোর্টটি মার্জ সাজ্টের চেয়ে দ্রুত (এবং সেই পরিমাণে হিপ সাজান) দ্রুত এবং এমনকি কোয়ারকোর্টের সবচেয়ে খারাপ পরিস্থিতি মার্জ সারণির চেয়ে ধীর হলেও, এই সবচেয়ে খারাপ পরিস্থিতি খুব সহজেই প্রশমিত করা যায় (তাই আমার উত্তর)
কনরাড রুডল্ফ

4
মেমরির ক্ষেত্রেও কুইকসোর্ট ভাল।
শাশ্বত

287

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

র‌্যামে এই অনুমান সাধারণত খুব খারাপ হয় না (ক্যাশেগুলির কারণে এটি সর্বদা সত্য নয়, তবে এটি খুব খারাপ নয়)। তবে যদি আপনার ডেটা স্ট্রাকচারটি ডিস্কে থাকার জন্য যথেষ্ট বড় হয় তবে কুইকোর্টটি মারা যায় killed আপনার গড় ডিস্কটি প্রতি সেকেন্ডে 200 এলোমেলো সন্ধানের মতো কিছু করে যে । কিন্তু সেই একই ডিস্কে প্রতি সেকেন্ডে ডেটা সেকেন্ডে মেগাবাইট পড়তে বা লেখাতে সমস্যা হয় না। যা হ'ল একত্রীকরণটি ঠিক তাই করে।

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

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

বেশ কয়েকটি অনুষ্ঠান হয়েছে যেখানে ডিস্ক সন্ধান কীভাবে এড়াতে হবে তা বোঝার ফলে আমাকে ডেটা প্রসেসিংয়ের কাজগুলি কয়েক দিনের বা সপ্তাহের চেয়ে কয়েক ঘন্টা সময় নিতে দেয়।


1
খুব সুন্দর, ডেটা স্ট্রাকচার অ্যাক্সেসের জন্য করা অনুমানগুলি সম্পর্কে ভাবেন নি। শুভ অন্তর্দৃষ্টি :)
chutsu

2
"ডিস্কের সন্ধান করুন" বলতে আপনি কী বোঝাতে চেয়েছেন তার অর্থ কি যখন ডিস্কে ডেটা সংরক্ষণ করা হয় তখন কোনও একক মান সন্ধান করা হয়?
জেমস ওয়েয়ারজবা

8
@ জেমস ওয়েয়ারজবা আমি প্রসঙ্গ থেকে নিচ্ছি যে তার অর্থ "ডিস্কে কোনও অবস্থান সন্ধান করা"। একটি ঘোরানো ডিস্ক ডিভাইসে "সন্ধান করা" এর অর্থ হল, পঠিত মাথাটি বাছাই করা এবং এটিকে একটি নতুন পরম ঠিকানায় নিয়ে যাওয়া, যা একটি কুখ্যাত ধীর অপারেশন। আপনি সংরক্ষণ করা অর্ডারে যখন ডেটা অ্যাক্সেস করেন, তখন ডিস্ক হার্ডওয়্যারটি সন্ধান করতে হয় না, এটি কেবল উচ্চ গতিতে লাঙল দেয়, আইটেমগুলি ধারাবাহিকভাবে পড়া হয়।
nclark

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

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

89

আসলে, কুইকসোর্ট হ'ল ও (এন 2 )। এটির গড় কেস চলমান সময় হ'ল (এনলগ (এন)), তবে এর সবচেয়ে খারাপ অবস্থা হ'ল (এন 2 ), আপনি যখন কয়েকটি অনন্য আইটেম যুক্ত তালিকায় এটি চালান তখন ঘটে occurs এলোমেলোকরণ O (n) নেয়। অবশ্যই, এটি এর সবচেয়ে খারাপ ক্ষেত্রে পরিবর্তন করে না, এটি কেবল কোনও দূষিত ব্যবহারকারীকে আপনার সাজানোর জন্য দীর্ঘ সময় নিতে বাধা দেয়।

কুইকসোর্ট আরও জনপ্রিয় কারণ এটি:

  1. স্থানে রয়েছে (মার্জসার্টের বাছাই করার জন্য উপাদানের সংখ্যার জন্য অতিরিক্ত মেমরি রৈখিক প্রয়োজন))
  2. একটি ছোট লুকানো ধ্রুবক আছে।

4
প্রকৃতপক্ষে, কুইকসোর্টের বাস্তবায়ন রয়েছে যা সবচেয়ে খারাপ ক্ষেত্রে ও (এন * লগ (এন)) নয়, ও (এন ^ 2)।
jfs

12
এটি কম্পিউটার আর্কিটেকচারের উপরও নির্ভর করে। কুইকোর্টটি ক্যাশে থেকে উপকৃত হয়, যখন মার্জসর্ট এটি করে না।
ক্রিশ্চিয়ান সিউপিতু

4
@ জেএফ সেবাস্তিয়ান: এগুলি সম্ভবত কুইকোর্ট নয়, ইন্ট্রোসর্ট বাস্তবায়ন ros (অন্তর্দ্বরণটি কুইকোর্ট হিসাবে শুরু হয় এবং এটি যদি এন * লগ (এন) হওয়া বন্ধ করতে চলেছে তবে হিপসোর্টে স্যুইচ করে।
সিজারব

44
আপনি জায়গায় একীভূতকরণ কার্যকর করতে পারেন।
মার্সিন

6
মার্জ বাছাই এমনভাবে কার্যকর করা যেতে পারে যার জন্য কেবল ও (1) অতিরিক্ত স্টোরেজ প্রয়োজন, তবে এই বাস্তবায়নগুলির বেশিরভাগই পারফরম্যান্সের ক্ষেত্রে ভীষণ ভোগেন।
ক্লিয়ারার

29

"এবং এখনও বেশিরভাগ মানুষ Mergesort এর পরিবর্তে Quicksort ব্যবহার করেন use কেন?"

একটি মনস্তাত্ত্বিক কারণ যা দেওয়া হয়নি তা হ'ল কুইকোর্টের আরও চতুরতার সাথে নাম দেওয়া হয়েছে। অর্থাত্ ভাল বিপণন।

হ্যাঁ, ট্রিপল পার্টিশন সহ কুইকসোর্ট সম্ভবত একটি সাধারণ সাধারণ উদ্দেশ্য বাছাই করা অ্যালগরিদমগুলির মধ্যে একটি তবে "কুইক" বাছাই "মার্জ" বাছাইয়ের চেয়ে অনেক বেশি শক্তিশালী বলে মনে হচ্ছে না।


3
কোনটি ভাল সে সম্পর্কে প্রশ্নের উত্তর দেয় না। কোনটি আরও ভাল তা নির্ধারণে অ্যালগরিদমের নাম অপ্রাসঙ্গিক।
নিক গ্যালিমোর

18

অন্যরা যেমন উল্লেখ করেছে, কুইকসোর্টের সবচেয়ে খারাপ অবস্থা হ'ল ও (এন ^ 2), যখন একত্রীকরণ এবং হিপসোর্টগুলি ও (নলগন) এ থাকে। গড় ক্ষেত্রে, যাইহোক, তিনটিই হ'ল O (nlogn); সুতরাং তারা তুলনীয় বিস্তৃত ক্ষেত্রে।

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


9

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

তবে সত্য কথাটি বলা যায়, ব্যবহারিক পরিস্থিতিতে বেশিরভাগ লোকের জন্য কেবল ভাল গড় পারফরম্যান্স প্রয়োজন এবং কুইকোর্টটি ... দ্রুত =)

সমস্ত ধরণের অ্যালগরিদমে তাদের উত্থান-পতন হয়। ভাল ওভারভিউয়ের জন্য অ্যালগরিদমগুলি বাছাই করার জন্য উইকিপিডিয়া নিবন্ধটি দেখুন ।


7

কুইকোর্টে উইকিপিডিয়া এন্ট্রি থেকে :

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


7

মু! কুইকসোর্টটি ভাল নয়, এটি মার্জর্টের চেয়ে আলাদা ধরণের অ্যাপ্লিকেশনের পক্ষে ভাল।

মার্জোর্টটি বিবেচনা করার মতো, যদি গতির মূল কথাটি হয় তবে খারাপের ক্ষেত্রে সবচেয়ে খারাপ পারফরম্যান্স সহ্য করা যায় না এবং অতিরিক্ত স্থান পাওয়া যায়। 1

আপনি বলেছিলেন যে তারা O তারা উভয়ই (nlogn) […] »» এটা ভুল. «কুইকসোর্ট সবচেয়ে খারাপ ক্ষেত্রে প্রায় n ^ 2/2 তুলনা ব্যবহার করে»

তবে আমার অভিজ্ঞতা অনুসারে সর্বাধিক গুরুত্বপূর্ণ সম্পত্তি হ'ল ক্রমবর্ধমান দৃষ্টান্তের সাথে প্রোগ্রামিং ভাষা ব্যবহার করার সময় বাছাই করার সময় আপনি যে ক্রমিক ক্রিয়াকলাপটি ব্যবহার করতে পারেন তা সহজেই কার্যকর করা।

1 সেজউইক, অ্যালগরিদমস


মার্জোর্টটি যথাযথভাবে প্রয়োগ করা যেতে পারে, এর জন্য অতিরিক্ত স্থানের প্রয়োজন হয় না। : একটি ডবল লিঙ্ক তালিকা সঙ্গে উদাহরণস্বরূপ stackoverflow.com/questions/2938495/...
lanoxx

6

কুইকসোর্টটি অনুশীলনে সর্বাধিক দ্রুত বাছাই করা অ্যালগরিদম তবে বেশিরভাগ প্যাথলজিকাল কেস রয়েছে যা এটি ও (এন 2) এর মতো খারাপভাবে সম্পাদন করতে পারে।

হিপসোর্টটি O (n * ln (n)) এ চালানোর গ্যারান্টিযুক্ত এবং কেবল সীমাবদ্ধ অতিরিক্ত স্টোরেজ প্রয়োজন। কিন্তু বাস্তব বিশ্বের পরীক্ষার অনেকগুলি উদ্ধৃতি রয়েছে যা দেখায় যে হিপসোর্টটি গড়পড়তা হারের তুলনায় উল্লেখযোগ্যভাবে ধীর।


5

উইকিপিডিয়া এর ব্যাখ্যা:

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

Quicksort

Mergesort

আমি মনে করি Mergesort (যা Ω (n)) এর জন্য কুইকোর্টের বাস্তবায়নের জন্য প্রয়োজনীয় পরিমাণ সঞ্চয়স্থানের সমস্যা রয়েছে। সবচেয়ে খারাপ ক্ষেত্রে, এগুলি একই পরিমাণে অ্যালগোরিদমিক সময়, তবে সংশ্লেষের জন্য আরও সঞ্চয়স্থান প্রয়োজন।


কুইকোর্টের সবচেয়ে খারাপ ক্ষেত্রে হ'ল ও (এন), একত্রীকরণ ও (এন লগ এন) - সুতরাং সেখানে একটি বড় পার্থক্য রয়েছে।
পল23

1
নিকৃষ্টতম কুইকোর্টটি হ'ল ও (এন ^ 2) - আমার আগের মন্তব্যটি সম্পাদনা করতে পারে না এবং
টাইপও করতে পারে

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

5

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

এলোমেলো অ্যাক্সেস সমস্যার বাইরে, দুটি মূল কারণ রয়েছে যা কুইকসোর্টের কার্যকারিতাকে প্রভাবিত করতে পারে এবং তারা উভয়ই পিভট কীভাবে ডেটা বাছাইয়ের সাথে তুলনা করে তা সম্পর্কিত।

1) ডেটাতে সংখ্যক কীগুলি। সমস্ত একই মানের একটি ডেটাসেট একটি ভ্যানিলা 2-পার্টিশন কুইকসোর্টে n ^ 2 সময় অনুসারে বাছাই করবে কারণ পিভট অবস্থান ব্যতীত সমস্ত মান প্রতিটি সময় একদিকে রাখা হয়। আধুনিক বাস্তবায়নগুলি 3-পার্টিশন বাছাইয়ের মতো পদ্ধতি দ্বারা এটিকে সম্বোধন করে। এই পদ্ধতিগুলি ও (এন) সময়ে সমস্ত একই মানের একটি ডেটাसेटে চালিত করে। সুতরাং এই জাতীয় বাস্তবায়ন ব্যবহারের অর্থ হ'ল অল্প সংখ্যক কী সহ একটি ইনপুট কার্য সম্পাদন সময়কে আরও উন্নত করে এবং এখন আর উদ্বেগের বিষয় নয়।

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

আদর্শহীন পিভট নির্বাচন কার্যকর করার সময়কে কতটা প্রভাবিত করে?

আসুন এমন একটি মামলা বিবেচনা করুন যেখানে পিভটটি ধারাবাহিকভাবে এমনটি বেছে নেওয়া হয় যে 75% ডেটা পিভটের একদিকে থাকে। এটি এখনও ও (এন * লগন) তবে এখন লগের ভিত্তি 1 / 0.75 বা 1.33 এ পরিবর্তিত হয়েছে। বেস পরিবর্তন করার সময় পারফরম্যান্সের সম্পর্কটি সর্বদা লগ (2) / লগ (নিউবেস) দ্বারা প্রতিনিধিত্ব করা হয়। এই ক্ষেত্রে, ধ্রুবকটি 2.4। সুতরাং পাইভট পছন্দটির এই মানেরটি আদর্শের চেয়ে ২.৪ গুণ বেশি সময় নেয়।

এটি কত দ্রুত খারাপ হয়?

পিভট পছন্দটি খুব খারাপ না হওয়া পর্যন্ত খুব দ্রুত নয় (ধারাবাহিকভাবে) খুব খারাপ:

  • 50% একদিকে: (আদর্শ কেস)
  • 75% একদিকে: দীর্ঘ হিসাবে 2.4 বার
  • 90% একদিকে: দীর্ঘ হিসাবে 6.6 বার
  • 95% একদিকে: দীর্ঘ হিসাবে 13.5 গুণ
  • 99% একদিকে: 69 বার দীর্ঘ

যেহেতু আমরা একদিকে 100% এর কাছে পৌঁছেছি মৃত্যুদন্ডের লগ অংশ n এর কাছে পৌঁছে যায় এবং পুরো সম্পাদন asympototically O (n ^ 2) এর কাছে পৌঁছে যায়।

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

  • ছোট ডাটা সেট। সবচেয়ে খারাপ কেসটি যুক্তিসঙ্গতভাবে সম্ভব তবে ও (এন ^ 2) বিপর্যয়কর নয় কারণ এন যথেষ্ট পরিমাণে এন also 2 ছোটও।
  • বড় ডেটা সেট। তাত্ত্বিক ক্ষেত্রে সবচেয়ে খারাপ ক্ষেত্রে সম্ভব তবে বাস্তবে তা সম্ভব নয়।

আমরা কীভাবে ভয়ঙ্কর অভিনয় দেখতে পাচ্ছি?

সম্ভাবনাগুলি অদৃশ্যভাবে ছোট । আসুন এক ধরণের 5,000 মান বিবেচনা করুন:

আমাদের অনুমানমূলক বাস্তবায়ন 3 এলোমেলোভাবে নির্বাচিত সূচকগুলির মাঝারি ব্যবহার করে একটি পাইভট বেছে নেবে। আমরা 25% -75% পরিসরে থাকা পাইভটগুলি "ভাল" এবং 0% -25% বা 75% -100% পরিসরে থাকা পাইভটগুলি "খারাপ" বলে বিবেচনা করব। যদি আপনি 3 এলোমেলো সূচকের মধ্যমা ব্যবহার করে সম্ভাব্যতা বন্টনটি দেখেন তবে প্রতিটি পুনরাবৃত্তিতে একটি ভাল পিভট শেষ হওয়ার 11/16 সুযোগ থাকে। আসুন গণিতকে সহজ করতে 2 রক্ষণশীল (এবং মিথ্যা) অনুমান করা যাক:

  1. ভাল পাইভটগুলি সর্বদা 25% / 75% বিভাজনে থাকে এবং 2.4 * আদর্শ ক্ষেত্রে কাজ করে। আমরা কখনই আদর্শ বিভাজন বা 25/75 এর চেয়ে ভাল বিভাজন পাই না।

  2. খারাপ পাইভটগুলি সর্বদা সবচেয়ে খারাপ পরিস্থিতি এবং সমাধানে মূলত কিছুই অবদান রাখে না।

আমাদের কুইকসোর্ট বাস্তবায়ন n = 10 এ থামবে এবং একটি সন্নিবেশ সাজানোর ক্ষেত্রে স্যুইচ করবে, সুতরাং আমাদের এখন পর্যন্ত 5,000 মান ইনপুট ভাঙতে 22 25% / 75% পিভট পার্টিশন প্রয়োজন। (10 * 1.333333 ^ 22> 5000) অথবা, আমাদের কাছে 4990 সবচেয়ে খারাপ কেস পিভট দরকার। মনে রাখবেন যে আমরা যদি কোনও মুহুর্তে ২২ টি ভাল পাইভোট সংগ্রহ করি তবে বাছাইটি সম্পূর্ণ হবে, তাই নিকৃষ্টতম পরিস্থিতি বা এর নিকটে যে কোনও কিছুর জন্য অত্যন্ত দুর্ভাগ্যের প্রয়োজন। যদি আমাদের সত্যিকার অর্থে এন = 10 এ বিভক্ত করার জন্য প্রয়োজনীয় 22 টি ভাল পিভট অর্জন করতে 88 টি পুনরাবৃত্তি লাগে তবে তা 4 * 2.4 * আদর্শ কেস বা আদর্শ ক্ষেত্রে কার্যকর হওয়ার সময় 10 গুণ হবে। এটা সম্ভব না যে আমরা না 88 পুনরাবৃত্তির পরে প্রয়োজনীয় 22 ভাল পিভট অর্জন ?

দ্বিপদী সম্ভাব্যতা বিতরণগুলি এর উত্তর দিতে পারে এবং উত্তরটি প্রায় 10 ^ -18। (এন, ৮৮, কে ২১, পি ০.8৮75৫) আপনার ব্যবহারকারীর ১ হাজার সেকেন্ডে বাজ পড়ার সম্ভাবনা প্রায় 1 সেকেন্ডে বেশি হয় [সোর্ট] ক্লিক করার চেয়ে তারা দেখতে পান যে 5,000 আইটেম সাজানোর কোনও খারাপ অবস্থা চলছে than 10 * আদর্শ ক্ষেত্রে। ডেটাসেট আরও বড় হওয়ার সাথে সাথে এই সুযোগটি আরও ছোট হয়। 10 * আদর্শের চেয়ে বেশি সময় চলার জন্য এখানে কিছু অ্যারের আকার এবং তাদের সম্পর্কিত সম্ভাবনা রয়েছে:

  • 640 আইটেমের অ্যারে: 10 ^ -13 (60 টির মধ্যে 15 টি ভাল পিভট পয়েন্ট প্রয়োজন)
  • 5000 আইটেমের অ্যারে: 10 ^ -18 (88 টির মধ্যে 22 টি ভাল পিভট দরকার)
  • 40,000 আইটেমের অ্যারে: 10 ^ -23 (116 এর মধ্যে 29 টি ভাল পিভট দরকার)

মনে রাখবেন এটি 2 রক্ষণশীল অনুমান যা বাস্তবতার চেয়ে খারাপ than সুতরাং প্রকৃত কর্মক্ষমতা এখনও ভাল, এবং বাকি সম্ভাবনার ভারসাম্যটি আদর্শের চেয়ে বেশি কাছাকাছি।

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


1
"বিদ্যমান দুর্দান্ত উত্তর" - সেগুলি কোনটি? আমি তাদের সনাক্ত করতে পারি না।
জিম বাল্টার

পার্টিশন সম্পর্কে তাত্ক্ষণিক বাছাইয়ের কোনও পরিবর্তনগুলি তুলনা ফাংশনকে কীভাবে অবহিত করে যে এটি এমন পরিস্থিতিতে ব্যবহার করতে পারে যেখানে মূল অংশের অংশটি একটি পার্টিশনের সমস্ত আইটেমের জন্য একই হবে?
সুপারক্যাট

4

কেন কুইকোর্ট ভাল?

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

কুইকসোর্ট কি সর্বদা মার্জেসোর্টের চেয়ে ভাল?

আসলে তা না.

  • Mergesort স্থিতিশীল তবে কুইকসোর্ট নেই। সুতরাং আপনার যদি আউটপুটে স্থিতিশীলতার প্রয়োজন হয় তবে আপনি মার্জোর্টটি ব্যবহার করবেন। অনেক ব্যবহারিক অ্যাপ্লিকেশনগুলিতে স্থায়িত্ব প্রয়োজন।
  • স্মৃতি আজকাল সস্তা। সুতরাং Mergesort দ্বারা ব্যবহৃত অতিরিক্ত মেমরি যদি আপনার অ্যাপ্লিকেশনটির পক্ষে গুরুতর না হয় তবে Mergesort ব্যবহারের কোনও ক্ষতি নেই।

বিঃদ্রঃ: জাভাতে, অ্যারেস.সোর্ট () ফাংশনটি আদিম উপাত্তের ধরণের জন্য কুইকসোর্ট এবং অবজেক্ট ডেটা ধরণের জন্য Mergesort ব্যবহার করে। যেহেতু বস্তুগুলি মেমরির ওভারহেড গ্রাস করে, তাই Mergesort এর জন্য সামান্য ওভারহেড যুক্ত করা পারফরম্যান্স দৃষ্টিকোণের জন্য কোনও সমস্যা হতে পারে না।

তথ্যসূত্র : 3 তম সপ্তাহের কুইকসোর্ট ভিডিওগুলি দেখুন , প্রিন্সটন আলগোরিদিম কোর্সে কোর্সেরা


"বাছাই শুরু করার আগে এলোমেলো শ্যাফেল দ্বারা এটি প্রশমিত করা যায়" "- এর, না, এটি ব্যয়বহুল হবে। পরিবর্তে, এলোমেলো পিভট ব্যবহার করুন।
জিম বাল্টার

4

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

তদ্ব্যতীত, একত্রীকরণটি তাদের মূল ক্রমে আইটেমগুলি অভিন্ন কীগুলির সাথে রাখে, একটি দরকারী বৈশিষ্ট্য।


2
আপনার দ্বিতীয় বাক্যটি বলে ... "মার্জোর্টটি ... মার্জোর্টের চেয়ে সম্ভবত ধীরে ধীরে"। প্রথম রেফারেন্সটি সম্ভবত কুইকোর্টের হওয়া উচিত।
জোনাথন লেফলার

মার্জ বাছাই কেবল স্থিতিশীল যদি মার্জ অ্যালগরিদম স্থিতিশীল হয়; এটি গ্যারান্টিযুক্ত নয়।
ক্লিয়ারার

@ ক্লিয়ারার এটির <=তুলনা করার পরিবর্তে যদি ব্যবহার করা হয় তবে এটির নিশ্চয়তা <রয়েছে এবং এর কারণ না করার কোনও কারণ নেই।
জিম বাল্টার

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

@ ক্লেয়ার কুইকোর্ট একটি মার্জ সাজ্ট নয় ... আপনার 21 ডিসেম্বর '14 এর যে বক্তব্য আমি সাড়া দিয়েছি তা মার্জ সাজানোর এবং এটি স্থিতিশীল কিনা তা সম্পর্কে কঠোরভাবে ছিল। কুইকোর্ট এবং যা দ্রুত তা আপনার মন্তব্য বা আমার প্রতিক্রিয়ার সাথে মোটেই প্রাসঙ্গিক নয়। আমার জন্য আলোচনার শেষ ... বাইরে এবং বাইরে।
জিম বাল্টার

3

আদিম মানের জন্য ডুয়ালপিভোটকুইকোর্টের সাথে আনা পরিবর্তনগুলিতে উত্তরটি সামান্য কুইকোর্ট রাইটের দিকে ঝুঁকবে। এটি JAVA 7java.util.Arrays বাছাই করতে ব্যবহৃত হয়

It is proved that for the Dual-Pivot Quicksort the average number of
comparisons is 2*n*ln(n), the average number of swaps is 0.8*n*ln(n),
whereas classical Quicksort algorithm has 2*n*ln(n) and 1*n*ln(n)
respectively. Full mathematical proof see in attached proof.txt
and proof_add.txt files. Theoretical results are also confirmed
by experimental counting of the operations.

আপনি এখানে JAVA7 ইমপ্লিটেশনটি খুঁজে পেতে পারেন - http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Arrays.java

ডুয়ালপাইভোটিকিকসোর্টে আরও দুর্দান্ত পড়া - http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/2628


3

মার্জ-সাজানোর ক্ষেত্রে সাধারণ অ্যালগরিদমটি হ'ল:

  1. বাম উপ-অ্যারে বাছাই করুন
  2. ডান সাব অ্যারে বাছাই করুন
  3. 2 বাছাই করা সাব-অ্যারেগুলি মার্জ করুন

শীর্ষ স্তরে, 2 বাছাই করা সাব-অ্যারেগুলি মার্জ করাতে এন উপাদানগুলির সাথে জড়িত।

এর এক স্তরের নীচে, পদক্ষেপ 3 এর প্রতিটি পুনরাবৃত্তিতে N / 2 উপাদানগুলির সাথে ডিল করা জড়িত তবে আপনাকে এই প্রক্রিয়াটি দু'বার পুনরাবৃত্তি করতে হবে। সুতরাং আপনি এখনও 2 * এন / 2 == এন উপাদানগুলি নিয়ে কাজ করছেন।

এর এক স্তরের নীচে, আপনি 4 * N / 4 == N উপাদানগুলি মার্জ করছেন so পুনরাবৃত্তাকার স্ট্যাকের প্রতিটি গভীরতায় সেই গভীরতার জন্য সমস্ত কল জুড়ে একই সংখ্যক উপাদান একত্রিত করা জড়িত।

পরিবর্তে দ্রুত সাজানোর অ্যালগরিদম বিবেচনা করুন:

  1. একটি পিভট পয়েন্ট বাছাই করুন
  2. বামদিকে সমস্ত ছোট উপাদান এবং ডানদিকে বৃহত্তর উপাদান সহ অ্যারেতে পিভট পয়েন্টটি সঠিক স্থানে রাখুন
  3. বাম-সুবরে বাছাই করুন
  4. ডান-সুবরে বাছাই করুন

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

এর এক স্তরের নীচে, আপনি এমন দুটি উপ-অ্যারে নিয়ে কাজ করছেন যা এন -1 এর সম্মিলিত আকার রয়েছে (অর্থাত্, পূর্ববর্তী পাইভট পয়েন্টটি বিয়োগ করুন)। আপনি প্রতিটি উপ-অ্যারের জন্য একটি পিভট পয়েন্ট বেছে নিন যা 2 টি অতিরিক্ত পিভট পয়েন্ট পর্যন্ত আসে।

তার এক স্তরের নীচে, আপনি উপরের মত একই কারণে 4 টি সাব-অ্যারে সম্মিলিত আকারের এন -3 এর সাথে ডিল করছেন।

তারপরে এন -7 ... তারপরে এন -15 ... তারপরে এন -32 ...

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

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


পিভটগুলি পরের স্তরের ধরণের অংশ নয় কারণ কিউএস আরও পারফরম্যান্ট। অতিরিক্ত অন্তর্দৃষ্টি জন্য অন্যান্য উত্তর দেখুন।
জিম বাল্টার

@ জিমবাল্টার আপনি কোন "অন্যান্য উত্তরগুলি" উল্লেখ করছেন? শীর্ষের উত্তরে কেবল বলা হয়েছে যে কিউএসকে "অতিরিক্ত অতিরিক্ত স্থানের প্রয়োজন হয় এবং ভাল ক্যাশে লোকেশন প্রদর্শন করা হয়" তবে এটি কেন হয় সে সম্পর্কে কোনও ব্যাখ্যা দেয় না এবং এটি কোনও উদ্ধৃতি সরবরাহ করে না। ২ য় উত্তরটি সহজভাবে বলে যে বৃহত্তর ডেটা-সেটগুলির জন্য মার্জ-সাজানো আরও ভাল
আরভিপিআর

আপনি গোলপোস্টগুলি সরিয়ে নিয়ে যাচ্ছেন, কেন থেকে কিউএস এটি পরিচালনা করে তা সম্পর্কে মৌলিক তথ্য ব্যাখ্যা করতে আরও পারফরম্যান্ট। অন্যান্য প্রশ্নের উত্তরগুলি সেগুলি করে: স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 9444714/ … ... আমি আশা করি এটি আপনার পক্ষে যথেষ্ট; আমি আর উত্তর দেব না।
জিম বাল্টার

3

মার্জ বাছাইয়ের বিপরীতে কুইক বাছাই একটি সহায়ক স্থান ব্যবহার করে না। যেখানে মার্জ বাছাই করা একটি সহায়ক স্থান O (n) ব্যবহার করে। তবে মার্জ বাছাই করার ক্ষেত্রে ও (নলগন) এর সবচেয়ে খারাপ সময়ের জটিলতা রয়েছে যখন কুইক বাছাইয়ের সবচেয়ে খারাপ কেস জটিলতা হ'ল (এন ^ 2) যা অ্যারে ইতিমধ্যে বাছাই করা হয় যখন ঘটে।


না, কুইকসোর্টের সবচেয়ে খারাপ পরিস্থিতি ঘটবে না যখন অ্যারে ইতিমধ্যে বাছাই করা হয়, যদি না আপনি প্রথম বা শেষ আইটেমটিকে পাইভট হিসাবে ব্যবহার করেন তবে কেউ তা করে না।
জিম বাল্টার

2

কুইকোর্টের ক্ষেত্রে গড় গড় জটিলতা রয়েছে তবে কিছু অ্যাপ্লিকেশনে এটি ভুল পছন্দ। কুইকসোর্ট পরিষেবা আক্রমণকে অস্বীকার করার পক্ষে ঝুঁকিপূর্ণ। যদি কোনও আক্রমণকারী সাজানোর জন্য ইনপুট চয়ন করতে পারে তবে তিনি সহজেই এমন একটি সেট তৈরি করতে পারেন যা ও (n ^ 2) এর সবচেয়ে খারাপ ক্ষেত্রে সময় জটিলতা নেয়।

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

এই কারণে আমি কুইকসোর্টের চেয়ে আমি মার্জার্সোর্টের আরও বড় ভক্ত।


2
কীভাবে কুইকসোর্টের আরও ভাল গড় কেস জটিলতা থাকে? এরা উভয়েই (nlgn)। আমি যুক্তি দিয়ে বলব যে কোনও আক্রমণকারী কোনও ধরণের বাছাই করা অ্যালগরিদমকে ইনপুট সরবরাহ করবে না ... তবে অস্পষ্টতার দ্বারা সুরক্ষা গ্রহণ না করার স্বার্থে, ধরে নিতে পারি যে সে পারত। যদিও এন ^ 2 চলমান সময়টি এনলগনের চেয়ে খারাপ, এটি কোনও একক আক্রমণের ভিত্তিতে একটি ওয়েব সার্ভার ক্র্যাশ হওয়ার পক্ষে যথেষ্ট খারাপ নয়। প্রকৃতপক্ষে, ডসের যুক্তিটি বেশ নাল, কারণ যে কোনও ওয়েব সার্ভার একটি ডিডিওএস আক্রমণে ঝুঁকিপূর্ণ এবং আক্রমণকারীর পক্ষে হোস্টের বিতরণযোগ্য নেটওয়ার্ক, সমস্ত টিসিপি এসওয়াইএন বন্যার ব্যবহার সম্ভব হয়।
CaTalyst.X

"কুইকসোর্টের ক্ষেত্রে গড় গড় জটিলতা রয়েছে" - না এটি হয় না।
জিম বাল্টার

2

এটি বলা শক্ত। মার্জসর্টের মধ্যে সবচেয়ে খারাপটি হ'ল এন (লগ 2 এন) -এন + 1, যা n এর সমান 2 ^ কে (আমি ইতিমধ্যে এটি প্রমাণ করে দিয়েছি) সঠিক। তবে যে কোনও এন এর জন্য এটি (এন এলজি এন - এন + এর মধ্যে) 1) এবং (এন এলজি এন + এন + ও (এলজি এন)) quick তবে কুইকসোর্টের জন্য এর সেরাটি হল এনলগ ২ এন (এছাড়াও এন সমান 2 ^ কে) I আপনি যদি কুইকসোর্ট দ্বারা মার্জারসোর্টকে বিভক্ত করেন তবে এনটি অসীম হলে এটি সমান হয় o সুতরাং এটি দেখে মনে হয়েছে যে কুইকসোর্টের সবচেয়ে ভাল ক্ষেত্রেটির তুলনায় মার্জসার্টের সবচেয়ে খারাপ পরিস্থিতি কেন আমরা কোকসোর্ট ব্যবহার করব? তবে মনে রাখবেন, মার্জসোর্টটি স্থানে নেই, এর জন্য 2n মেমেরয়ে স্পেস প্রয়োজন। এবং মার্জসোর্টকেও অনেক অ্যারে অনুলিপিগুলি করা দরকার যা আমরা অ্যালগরিদমের বিশ্লেষণে অন্তর্ভুক্ত করবেন না a এক কথায়, মার্জসার্ট থেরয়ে রিকুইকোর্টের চেয়ে সত্যই দ্রুততর, তবে বাস্তবে আপনাকে মেমোরি স্পেস, অ্যারের অনুলিপিটির ব্যয়টি বিবেচনা করা দরকার, মার্জারটি দ্রুত সাজানোর চেয়ে ধীর হয় I আমি একবার তৈরি করেছি পরীক্ষা যেখানে আমাকে এলোমেলো ক্লাস দ্বারা জাভাতে 1000000 সংখ্যা দেওয়া হয়েছিল,এবং এটি একীভূত হয়ে 2610 মিমি নিয়েছে, কোুইকোর্টের মাধ্যমে 1370 মাইল।


2

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

মার্জ বাছাইয়ের জন্য ও (2 এন) মেমরিরও প্রয়োজন, যখন দ্রুত বাছাই করা যায় ঠিক জায়গায় (কেবল ও (এন) প্রয়োজন)। এটি আরও একটি কারণ যা দ্রুত সাজানোর সাধারণত মার্জ সাজানোর চেয়ে বেশি পছন্দ হয়।

অতিরিক্ত তথ্য:

পিভটটি দুর্বলভাবে বেছে না নিলে দ্রুত সাজানোর সবচেয়ে খারাপ পরিস্থিতি দেখা দেয়। নিম্নলিখিত উদাহরণ বিবেচনা করুন:

[5, 4, 3, 2, 1]

যদি পাইভটটিকে গ্রুপের মধ্যে সবচেয়ে ছোট বা বৃহত্তম সংখ্যা হিসাবে বেছে নেওয়া হয় তবে দ্রুত সাজানো ও (এন ^ 2) এ চলবে। তালিকার বৃহত্তম বা ক্ষুদ্রতম 25% এ উপাদানটি বেছে নেওয়ার সম্ভাবনা 0.5%। এটি অ্যালগরিদমকে একটি ভাল পিভট হওয়ার 0.5 টি সুযোগ দেয়। আমরা যদি একটি সাধারণ পিভট বেছে নিয়ে অ্যালগরিদম বাছাই করে নিয়োগ করি (এলোমেলো উপাদান বেছে নেওয়ার জন্য বলুন), আমরা পিভটের প্রতিটি পছন্দের জন্য একটি ভাল পিভট বাছাই করার সম্ভাবনা 0.5 আছে chance বড় আকারের সংগ্রহের জন্য সর্বদা দরিদ্র পিভট বাছাই করার সম্ভাবনা 0.5 * এন হয়। এই সম্ভাবনার উপর ভিত্তি করে দ্রুত সাজানোর গড় (এবং আদর্শ) কেসটির পক্ষে দক্ষ।


ও (2 এন) == ও (এন) সঠিক বিবৃতিটি হ'ল মার্জেসোর্টের ও (এন) অতিরিক্ত মেমরি প্রয়োজন (আরও সুনির্দিষ্টভাবে এটির জন্য n / 2 সহায়ক মেমরি প্রয়োজন)। এবং এটি লিঙ্কযুক্ত তালিকার জন্য সত্য নয়।
জিম বাল্টার

@ জিমবাল্টার স্যার, প্রশ্নের উত্তরের হিসাবে তাদের পারফোলেন্স সম্পর্কে আপনার উজ্জ্বল এবং সার্থক ধারণা আমাদের সাথে ভাগ করে নিতে আপত্তি করবেন? আগাম ধন্যবাদ.
SNR

2

এটি বেশ পুরানো প্রশ্ন, তবে যেহেতু আমি দু'জনের সাথে সাম্প্রতিককালে এখানে কাজ করেছি আমার 2 সি:

গড় sort N লগ এন তুলনা তুলনায় সর্টের প্রয়োজন। ইতিমধ্যে (প্রায়) বাছাই করা অ্যারেগুলির জন্য এটি 1/2 এন লগ এন-এ নেমে যায়, যেহেতু আমরা (প্রায়) সর্বদা "বাম" অংশটি 1/2 N বার নির্বাচন করি এবং তারপরে ডান 1/2 এন উপাদানগুলি অনুলিপি করি। অতিরিক্তভাবে আমি অনুমান করতে পারি যে ইতিমধ্যে সাজানো ইনপুট প্রসেসরের শাখার ভবিষ্যদ্বাণীকে উজ্জ্বল করে তোলে তবে প্রায় সমস্ত শাখাকে সঠিকভাবে অনুমান করে, এইভাবে পাইপলাইন স্টলগুলি রোধ করে।

দ্রুত সাজানোর জন্য ~ 1.38 এন লগ এন তুলনা প্রয়োজন। তুলনার দিক থেকে এটি ইতিমধ্যে বাছাই করা অ্যারে থেকে খুব বেশি উপকৃত হয় না (তবে এটি স্যুপের ক্ষেত্রে এবং সম্ভবত সিপিইউর ভিতরে শাখার পূর্বাভাসের ক্ষেত্রে থাকে)।

মোটামুটি আধুনিক প্রসেসরের উপর আমার মানদণ্ডগুলি নিম্নলিখিতটি দেখায়:

তুলনা ফাংশন যখন কলব্যাক ফাংশন হয় (যেমন Qsort () libc বাস্তবায়নের ক্ষেত্রে) কুইকোর্টটি এলোমেলো ইনপুটটিতে 15% এবং ইতিমধ্যে 64 বিট ইন্টিজারের জন্য বাছাই করা অ্যারের জন্য 30% দ্বারা মার্জ্টের চেয়ে ধীর হয়।

অন্যদিকে তুলনা যদি কলব্যাক না হয় তবে আমার অভিজ্ঞতা হ'ল কুইকসোর্ট আউটপারফর্মগুলি 25% পর্যন্ত একীভূত করে।

তবে আপনার (বৃহত্তর) অ্যারেতে খুব কম কিছু অনন্য মান থাকলে, মার্জ সাজ্ট কোনও ক্ষেত্রেই কোকসোর্টের উপরে লাভ শুরু করে।

সুতরাং সম্ভবত নীচের অংশটি হ'ল: তুলনা ব্যয়বহুল হলে (যেমন কলব্যাক ফাংশন, স্ট্রিংগুলির তুলনা করা, কাঠামোর অনেক অংশের তুলনা করা বেশিরভাগ ক্ষেত্রে দ্বিতীয়-তৃতীয়াংশের সাথে "যদি" পার্থক্য করতে হয়) - তবে সম্ভাবনাগুলি হ'ল আপনি আরও ভাল হবেন মার্জ সাজানোর সাথে। সহজ কাজের জন্য কুইকোর্ট দ্রুততর হবে।

পূর্বে যা বলা হয়েছিল তা সত্য: - কুইকোর্টটি এন ^ 2 হতে পারে, তবে সেডজউইক দাবি করেছেন যে একটি ভাল এলোমেলো বাস্তবায়নে কম্পিউটার ^ 2 যাওয়ার চেয়ে বাজ পড়ার সম্ভাবনা বেশি থাকে - মার্জোর্টকে অতিরিক্ত স্থানের প্রয়োজন হয়


তুলনা কম হলে কি কিসোর্ট বীটগুলি এমনকি বাছাই করা ইনপুটগুলির জন্য মার্জর্ট করে?
ইওনিল

2

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


পিওটস এর কিউএস এর সাথে কেন কম সংখ্যক পুনরাবৃত্তি কল রয়েছে তার কিছুই করার নেই ... কারণ এটি কিউএসের অর্ধেক পূনরাঞ্চল লেজ পুনরাবৃত্তি, যা নির্মূল করা যেতে পারে।
জিম বাল্টার

2

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

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

2- সবচেয়ে খারাপ ক্ষেত্রে: কুইকোর্টের সবচেয়ে খারাপ পরিস্থিতি O(n^2)এলোমেলো কুইকোর্ট ব্যবহার করে এড়ানো যায়। ডান পিভটটি চয়ন করে এটি উচ্চ সম্ভাবনার সাথে সহজেই এড়ানো যায়। ডান পিভট এলিমেন্টটি বেছে নিয়ে একটি গড় কেস আচরণ অর্জন এটিকে পারফরম্যান্সের উন্নতি করে এবং মার্জ সাজানোর মতো দক্ষ করে তোলে।

3- রেফারেন্সের লোকেশন: লোকেশন বিশেষত কুইকোর্টটি ভাল ক্যাশে লোকালটি প্রদর্শন করে এবং এটি ভার্চুয়াল মেমরি এনভায়রনমেন্টের মতো অনেক ক্ষেত্রে মার্জ সাজ্টের চেয়ে দ্রুততর করে তোলে।

4- লেজ পুনরাবৃত্তি: মার্জ বাছাই করা না থাকলে কুইকসোর্টটি লেজ পুনরাবৃত্ত হয়। একটি লেজ রিকার্সিভ ফাংশন এমন একটি ফাংশন যেখানে পুনরাবৃত্ত কলটি ফাংশন দ্বারা সম্পাদিত শেষ জিনিস। লেজ রিকার্সিভ ফাংশনগুলি লেজ পুনরাবৃত্তির ক্রিয়াকলাপগুলির চেয়ে ভাল বলে বিবেচিত হয় কারণ সংকলক দ্বারা পুচ্ছ-পুনরাবৃত্তি অনুকূলিত করা যায়।


1

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

যাহোক! আমি ব্যক্তিগতভাবে প্রায়শই একত্রীকরণ বা একটি কুইকোর্টের বৈকল্পিক ব্যবহার করব যা কুইকোর্টটি খারাপভাবে করলে খারাপ হয় না ort মনে রাখুন। কুইকসোর্টটি গড়ে ও ও (এন লগ এন) হয় । এটি সবচেয়ে খারাপ পরিস্থিতি হে (এন ^ 2)! Mergesort সর্বদা O (n লগ এন) থাকে। যে ক্ষেত্রে রিয়েলটাইম পারফরম্যান্স বা প্রতিক্রিয়াশীলতা আবশ্যক এবং আপনার ইনপুট ডেটা দূষিত উত্স থেকে আসতে পারে, আপনার প্লেইন কোয়েস্কোর্ট ব্যবহার করা উচিত নয়।


1

সমস্ত জিনিস সমান হচ্ছে, আমি প্রত্যাশা করতাম যে বেশিরভাগ লোকেরা সবচেয়ে সহজলভ্যভাবে যা কিছু ব্যবহার করেন, এবং এটি Qsort (3) হিসাবে প্রবণতাযুক্ত। এর বাইরে কুইকোর্টটি খুব দ্রুত অ্যারেতে পরিচিত, ঠিক তেমনি তালিকার সাধারণ পছন্দটি একত্রীকরণ is

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

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

অন্যান্য খবরে, ভাসমানগুলি পূর্ণসংখ্যার হিসাবে বাছাই করা যায় তবে আপনাকে পরে নেতিবাচক সংখ্যাগুলি ঘুরিয়ে দিতে হবে।

সম্পাদনা: প্রকৃতপক্ষে, এখানে পূর্ণসংখ্যার মতো ভাসমানগুলি বাছাই করার জন্য আরও এক জঘন্য উপায়: http://www.stereopsis.com/radix.html । নোট করুন যে বিট-ফ্লিপিং ট্রিকটি আপনি আসলে কীভাবে অ্যালগরিদমকে বাছাই করে তা ব্যবহার না করেই ব্যবহার করা যেতে পারে ...


1
আমি রেডিক্স প্রকারের আমার ভাগ দেখেছি। কিন্তু এটা ব্যবহার করা বেশ কঠিন কারণ যদি সঠিকভাবে বিশ্লেষণ, তার রানটাইম হয় না হে (ঢ) যেমন ইনপুট উপাদানের সংখ্যা বেশি উপর নির্ভর করে। সাধারণভাবে, এই জাতীয় দৃic় ভবিষ্যদ্বাণী করা খুব শক্ত যে রেডিক্স সাজানোর ইনপুট সম্পর্কে দক্ষ হওয়া দরকার।
কনরাড রুডলফ

এটা তোলে হয় হে (ঢ), যেখানে n হল মোট ইনপুট আকার, যে উপাদানের আকার সহ হয়। এটি সত্য যে আপনি এটি বাস্তবায়ন করতে পারেন তাই আপনাকে প্রচুর শেরো দিয়ে প্যাড করতে হবে, তবে তুলনার জন্য একটি খারাপ প্রয়োগ ব্যবহার করা বাজে কথা। (এটি বলেছে, বাস্তবায়ন কঠিন হতে পারে, ymmv।)
অ্যান্ডার্স ইউরেনিয়াস

নোট করুন যে আপনি যদি GNU libc ব্যবহার করেন তবে qsortতা একত্রিত করার পদ্ধতি।
জেসন ওরেডরফ

তবে, সুনির্দিষ্টভাবে বলতে গেলে, এটি প্রয়োজনীয় সংস্থাগুলি মেমরির বরাদ্দ করা না হলে এটি একীভূত সাজানোর। cvs.savannah.gnu.org/viewvc/libc/stdlib/…
জেসন

1

দ্রুত বনাম মার্জ আকারে ছোট সংযোজন।

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

উদাহরণস্বরূপ, আমরা রিমোট সার্ভারে নেটওয়ার্ক প্রোটোকল ব্যবহার করে আইটেমগুলি বাছাই করি।

এছাড়াও, "লিঙ্কযুক্ত তালিকা" এর মতো কাস্টম পাত্রে, দ্রুত সাজানোর কোনও সুবিধা নেই।
1. লিঙ্কযুক্ত তালিকায় বাছাই করুন, অতিরিক্ত মেমরির দরকার নেই। 2. দ্রুত বাছাইয়ের উপাদানগুলিতে অ্যাক্সেস ক্রমানুসারে নয় (মেমরিতে)


0

দ্রুত বাছাই একটি ইন-প্লেস বাছাই অ্যালগরিদম, সুতরাং এটির জন্য আরও ভাল উপযুক্ত। অন্যদিকে মার্জ সাজ্টের জন্য ও (এন) এর অতিরিক্ত স্টোরেজ প্রয়োজন এবং এটি লিঙ্কযুক্ত তালিকার জন্য আরও উপযুক্ত।

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

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

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

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


0

সময় এবং স্থান জটিলতা উভয় বিবেচনা করুন। মার্জ সাজানোর জন্য: সময়ের জটিলতা: O (nlogn), স্পেস জটিলতা: O (nlogn)

দ্রুত বাছাইয়ের জন্য: সময়ের জটিলতা: O (n ^ 2), স্থান জটিলতা: O (n)

এখন, তারা উভয়ই একটি করে দৃশ্যে জয়লাভ করে। তবে, একটি এলোমেলো পিভট ব্যবহার করে আপনি প্রায় সর্বদা দ্রুত সাজানোর ও (টাইম) টাইমের জটিলতা হ্রাস করতে পারেন।

সুতরাং, মার্জ বাছাইয়ের পরিবর্তে অনেকগুলি অ্যাপ্লিকেশনে দ্রুত বাছাই করা পছন্দ হয়।


-1

সি / সি ++ জমিগুলিতে, stl পাত্রে ব্যবহার না করার সময়, আমি কুইকোর্ট ব্যবহার করার প্রবণতা রাখি কারণ এটি রান টাইমে তৈরি করা হয়েছে, যখন মার্জোর্টটি নেই।

সুতরাং আমি বিশ্বাস করি যে অনেক ক্ষেত্রে এটি কেবল সর্বনিম্ন প্রতিরোধের পথ।

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


3
প্রকৃতপক্ষে, যদি আপনি যে Qsort () লাইব্রেরির ফাংশনটির কথা বলছেন তা যদি হয় তবে এটি quicksort হিসাবে প্রয়োগ করা হতে পারে বা নাও হতে পারে।
টমাস প্যাড্রন-ম্যাকার্থি

3
কনরাড, এই সম্পর্কে কিছুটা মলদ্বার হওয়ার জন্য দুঃখিত, তবে আপনি এই গ্যারান্টিটি কোথায় পাবেন? আমি এটি আইএসও সি স্ট্যান্ডার্ড বা সি ++ স্ট্যান্ডার্ডে খুঁজে পাচ্ছি না।
টমাস প্যাড্রন-ম্যাকার্থি

2
GNU libc এর qsortএকত্রিতকরণ বাছাই করা হয় যদি না উপাদানগুলির সংখ্যা সত্যই বিশাল হয় বা অস্থায়ী মেমরি বরাদ্দ না করা যায়। cvs.savannah.gnu.org/viewvc/libc/stdlib/…
জেসন

-3

এর অন্যতম কারণ আরও দার্শনিক। কুইকসোর্ট শীর্ষ-> ডাউন দর্শন। বাছাই করার জন্য এন উপাদানগুলির সাথে, এন রয়েছে! সম্ভাবনার। মি & এনএম এর 2 পার্টিশন যা পারস্পরিক একচেটিয়া, সম্ভাবনার সংখ্যা কয়েকটি মাত্রার আকারে কমিয়ে দেয়। মি! * (এনএম)! এন এর চেয়ে বেশ কয়েকটি অর্ডার দিয়ে ছোট! একা। কল্পনা করুন 5! বনাম 3! * 2 !. 5! 2 এবং 3 টির প্রতিটি বিভাজনের চেয়ে 10 গুণ বেশি সম্ভাবনা রয়েছে। এবং 1 মিলিয়ন ফ্যাক্টরিয়াল বনাম 900 কে! এক্সট্রাপোলেটেড! 100 ক! বনাম। সুতরাং কোনও পরিসর বা পার্টিশনের মধ্যে কোনও অর্ডার স্থাপনের বিষয়ে চিন্তা করার পরিবর্তে, পার্টিশনের বিস্তৃত স্তরে অর্ডার স্থাপন করুন এবং একটি পার্টিশনের মধ্যে সম্ভাবনাগুলি হ্রাস করুন। পার্টিশনগুলি পারস্পরিকভাবে একচেটিয়া না হলে কোনও ব্যাপ্তির মধ্যে পূর্বে প্রতিষ্ঠিত কোনও আদেশ পরে বিরক্ত হবে।

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

কুইক বাছাই ব্যবস্থাপনার পদ্ধতির মতো যেখানে প্রাথমিকভাবে কোনও অর্ডার সম্পর্কে উদ্বিগ্ন নয়, কেবল অর্ডারকে বিবেচনা না করে একটি বিস্তৃত মানদণ্ডটি পূরণ করার বিষয়ে। তারপরে আপনি একটি বাছাই করা সেট না পাওয়া পর্যন্ত পার্টিশনগুলি সংকীর্ণ করা হবে। কুইকসোর্টে আসল চ্যালেঞ্জটি হ'ল অন্ধকারে একটি পার্টিশন বা মানদণ্ড সন্ধান করা যখন আপনি বাছাই করার উপাদানগুলি সম্পর্কে কিছুই জানেন না। এজন্য আমাদের হয় একটি মধ্যমানের মান খুঁজে পেতে কিছু প্রচেষ্টা ব্যয় করতে হবে বা এলোমেলোভাবে কিছু বা নির্বিচারে "ম্যানেজমেন্টাল" পদ্ধতির জন্য 1 বাছাই করতে হবে। একটি নিখুঁত মধ্যস্থতা খুঁজে পেতে প্রচুর পরিমাণে প্রচেষ্টা নিতে পারে এবং আবার একটি বোকা নীচে আপ পদ্ধতির দিকে নিয়ে যায়। সুতরাং কুইকসোর্ট কেবলমাত্র একটি র্যান্ডম পিভট বেছে নিন এবং আশা করেন যে এটি মাঝখানে কোথাও থাকবে বা আরও ভাল মিডিয়ান খোঁজার জন্য 3, 5 বা আরও কিছু খুঁজে পাওয়ার জন্য কিছু কাজ করবে তবে নিখুঁত হওয়ার পরিকল্পনা নেই এবং ডন ' প্রাথমিকভাবে অর্ডারে কোনও সময় নষ্ট করবেন না। আপনি ভাগ্যবান বা মাঝেমধ্যে মিডিয়ান না পেলে কেবল একটি সুযোগ নেওয়ার ক্ষেত্রে যদি কখনও ভাগ্যবান হন বা কখনও কখনও ^ 2 এ অবনতি হন তবে এটি ভাল হবে বলে মনে হয়। যে কোনও উপায়ে ডেটা এলোমেলো। ঠিক আছে। সুতরাং আমি শীর্ষে -> কুইকোর্টের যৌক্তিক পদ্ধতির সাথে আরও সম্মত হই এবং এটি দেখা যায় যে পাইভট নির্বাচন এবং তুলনা যে এটি আগে সংরক্ষণ করে তা যে কোনও ছাঁটাই এবং পুরো স্থিতিশীল নীচে -> এর মত পদ্ধতির চেয়ে আরও বেশি বার কাজ করবে বলে মনে হয় মার্জ সাজান। কিন্তু যে তুলনাগুলি এটি আগে সংরক্ষণ করে তা মনে হয় যে কোনও মাতাল এবং পুঙ্খানুপুঙ্খ স্থিতিশীল নীচে -> মার্জ সাজানোর মতো পদ্ধতির চেয়ে আরও বেশি বার কাজ করা হয়েছে। কিন্তু যে তুলনাগুলি এটি আগে সংরক্ষণ করে তা মনে হয় যে কোনও মাতাল এবং পুঙ্খানুপুঙ্খ স্থিতিশীল নীচে -> মার্জ সাজানোর মতো পদ্ধতির চেয়ে আরও বেশি বার কাজ করা হয়েছে। কিন্তু


পিভিট নির্বাচনের এলোমেলোভাবে থেকে কুইকোর্ট উপকার করে। এলোমেলো পিভট স্বাভাবিকভাবেই 50:50 পার্টিশনের দিকে ঝুঁকবে এবং চূড়ান্তর কোনওটির দিকে ধারাবাহিকভাবে হওয়ার সম্ভাবনা কম। গড় পার্টিশন 60-40 বা 70-30 অবধি অবধি অবধি নলনগনের ধ্রুবক ফ্যাক্টরটি মোটামুটি কম।
শীতের তরমুজ

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