আমি সর্বোত্তম কেস থেকে সরে যাওয়ার সময় কুইকসোর্ট কীভাবে সম্পাদন করে এবং কীভাবে সম্ভব তা সম্পর্কে কিছু গণিত বিদ্যমান মহান জবাবগুলিতে যুক্ত করতে চাই, যা আমি আশা করি যে ও (এন ^ 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 রক্ষণশীল (এবং মিথ্যা) অনুমান করা যাক:
ভাল পাইভটগুলি সর্বদা 25% / 75% বিভাজনে থাকে এবং 2.4 * আদর্শ ক্ষেত্রে কাজ করে। আমরা কখনই আদর্শ বিভাজন বা 25/75 এর চেয়ে ভাল বিভাজন পাই না।
খারাপ পাইভটগুলি সর্বদা সবচেয়ে খারাপ পরিস্থিতি এবং সমাধানে মূলত কিছুই অবদান রাখে না।
আমাদের কুইকসোর্ট বাস্তবায়ন 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 সুতরাং প্রকৃত কর্মক্ষমতা এখনও ভাল, এবং বাকি সম্ভাবনার ভারসাম্যটি আদর্শের চেয়ে বেশি কাছাকাছি।
অবশেষে, অন্যরা যেমন বলেছে, এমনকি যদি পুনরাবৃত্তি স্ট্যাকটি খুব গভীর হয় তবে এই অযৌক্তিকভাবে অসম্ভব সম্ভাব্য কেসগুলি একটি গাদা সাজানোর দিকে স্যুইচ করার মাধ্যমে নির্মূল করা যেতে পারে। সুতরাং টিএলডিআর হ'ল, কুইকসোর্টের ভাল প্রয়োগের জন্য, সবচেয়ে খারাপ পরিস্থিতি প্রকৃতপক্ষে উপস্থিত নেই কারণ এটি ইঞ্জিনিয়ার হয়েছে এবং ও (এন * লগন) সময়ে কার্যকর হয়।
qsort
, পাইথন এরlist.sort
, এবংArray.prototype.sort
ফায়ারফক্সের জাভাস্ক্রিপ্ট সমস্ত souped-আপ একত্রীকরণ প্রকারের হয়। (গনুহ STLsort
Introsort পরিবর্তে ব্যবহার করে, কিন্তু যে হতে পারে কারণ সি ++ সোয়াপিং সম্ভাব্য বড় অনুলিপি উপর ধিক্কার জানাই।)