প্যাডোগোগিকাল ডাইমেনশন
এর সরলতার কারণে লোমুতোর বিভাজন পদ্ধতি কার্যকর করা সহজ হতে পারে। বাছাই করার বিষয়ে জন বেন্টলির প্রোগ্রামিং পার্লে একটি দুর্দান্ত উপাখ্যান রয়েছে :
“কুইকোর্টের বেশিরভাগ আলোচনায় দুটি আগমন সূচকের উপর ভিত্তি করে একটি বিভাজন স্কিম ব্যবহার করা হয় [...] [অর্থাত্ হোয়ারের]। যদিও এই স্কিমটির প্রাথমিক ধারণাটি সোজা, তবুও আমি বিশদটি সবসময়ই জটিল বলে খুঁজে পেয়েছি - আমি একবার দু'দিনের একটি ভাল অংশ একটি সংক্ষিপ্ত পার্টিশনের লুপে লুকিয়ে থাকা বাগের পিছনে পিছনে তাড়া করে কাটিয়েছি। প্রাথমিক খসড়ার পাঠক অভিযোগ করেছিলেন যে স্ট্যান্ডার্ড দ্বি-সূচক পদ্ধতিটি আসলে লোমুতোর চেয়ে সহজতর এবং তার বক্তব্যটি তৈরি করার জন্য কিছু কোড স্কেচ করেছে; আমি দুটি বাগ পেয়েছি দেখাশোনা বন্ধ করে দিয়েছি। "
পারফরম্যান্স মাত্রা
ব্যবহারিক ব্যবহারের জন্য, বাস্তবায়নের স্বাচ্ছন্দ্য দক্ষতার জন্য ত্যাগ করা হতে পারে। তাত্ত্বিক ভিত্তিতে, আমরা পারফরম্যান্সের তুলনা করার জন্য উপাদানগুলির তুলনা এবং অদলবদলের সংখ্যা নির্ধারণ করতে পারি। অতিরিক্তভাবে, আসল চলমান সময় অন্যান্য বিষয়গুলির দ্বারা প্রভাবিত হবে, যেমন ক্যাশিং কর্মক্ষমতা এবং শাখার ভুল p
নীচে যেমন দেখানো হয়েছে, অ্যালগরিদমগুলি অদলবদলের সংখ্যা বাদ দিয়ে এলোমেলো অনুক্রমের সাথে খুব অনুরূপ আচরণ করে । সেখানে হোমেরে তিনবারের মতো লোমুতো দরকার !
তুলনা সংখ্যা
উভয় পদ্ধতি ব্যবহার করে বাস্তবায়ন করা যায় তুলনা দৈর্ঘ্যের একটি অ্যারের পার্টিশন করার । এটি মূলত সর্বোত্তম, যেহেতু আমাদের প্রতিটি উপাদানকে কোথায় রাখা উচিত তা স্থির করার জন্য পাইভটের সাথে তুলনা করতে হবে।n−1n
অদলবদলের সংখ্যা
অ্যারেতে থাকা উপাদানগুলির উপর নির্ভর করে অ্যালগরিদমের জন্য অদলবদলের সংখ্যা এলোমেলো। যদি আমরা এলোমেলোভাবে অনুমানের অনুমান করি , অর্থাৎ সমস্ত উপাদান পৃথক এবং উপাদানগুলির প্রতিটি ক্রমানুসারে সমান সম্ভাবনা থাকে তবে আমরা অদলবদলের প্রত্যাশিত সংখ্যা বিশ্লেষণ করতে পারি ।
শুধু আপেক্ষিক অর্ডার সংখ্যা, আমরা ধরে নিই যে উপাদান সংখ্যা । এটি নীচের আলোচনাকে আরও সহজ করে তোলে যেহেতু কোনও উপাদানের পদমর্যাদা এবং এর মান সমান হয়।1,…,n
লোমুতোর পদ্ধতি
সূচী ভেরিয়েবল পুরো অ্যারে স্ক্যান করে এবং যখনই আমরা পাইভট চেয়ে ছোট উপাদান পাই, আমরা একটি অদলবদল করি। উপাদানের মধ্যে , ঠিক বেশী চেয়ে ছোট হয় , তাই আমরা পেতে অদলবদল যদি পিভট হয় ।jA[j]x1,…,nx−1xx−1x
সামগ্রিক প্রত্যাশা তারপরে সমস্ত পিভটকে গড়ে গড়ে তোলে। Value প্রতিটি মান পিভট হওয়ার সমান সম্ভাবনা (যথা সহ ), তাই আমাদের কাছে{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
গড়ে অদলবদল দৈর্ঘ্যের একটি অ্যারের পার্টিশন করার Lomuto এর পদ্ধতি সঙ্গে।n
Hoare এর পদ্ধতি
এখানে, বিশ্লেষণটি কিছুটা জটিল: এমনকি পাইভট স্থির করেও অদলবদলের সংখ্যা এলোমেলো থেকে যায়।x
আরো অবিকল: সূচকের এবং একে অপরের যতক্ষণ না তারা ক্রস, যা প্রতি রান সবসময় ঘটবে (হোয়ারে এর পার্টিশন আলগোরিদিম শুদ্ধি দ্বারা!)। এটি কার্যকরভাবে অ্যারেটিকে দুটি অংশে বিভক্ত করে: একটি বাম অংশ যা দ্বারা স্ক্যান করে এবং ডান অংশটি দ্বারা স্ক্যান করে ।ijxij
এখন, " জোড়া লাগানো" উপাদানগুলির প্রতিটি জুটির জন্য ঠিক একটি অদলবদল করা হয় , অর্থাত্ একটি বড় উপাদান ( চেয়ে বড় , এটি ডান পার্টিশনের অন্তর্ভুক্ত) বর্তমানে বাম অংশে অবস্থিত এবং ডান অংশে অবস্থিত একটি ছোট উপাদান। নোট করুন যে এই জুটি গঠনটি সর্বদা কার্যকর হয়, অর্থাত্ প্রাথমিকভাবে ডান অংশে ছোট উপাদানগুলির সংখ্যা বাম অংশের বৃহত উপাদানের সংখ্যার সমান হয়।x
এক দেখাতে পারেন যে, এই জোড়া সংখ্যা hypergeometrically বিতরণ করা: জন্য বৃহৎ উপাদান আমরা এলোমেলোভাবে অ্যারের মধ্যে তাদের অবস্থানের আঁকা এবং -এ অবস্থানের বাম অংশ তদনুসারে, জোড়া প্রত্যাশিত সংখ্যা যে দেওয়া পিভট হয় ।Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
অবশেষে, হোয়েরের বিভাজনের জন্য সামগ্রিকভাবে প্রত্যাশিত অদলবদলগুলি পেতে আমরা সমস্ত পাইভট মানগুলির উপরে আবার গড়:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(আরও বিস্তারিত বিবরণ আমার মাস্টারের থিসিস , পৃষ্ঠা 29 এ পাওয়া যাবে 29)
মেমরি অ্যাক্সেস প্যাটার্ন
উভয় অ্যালগরিদম অ্যারেতে দুটি পয়েন্টার ব্যবহার করে যা এটি ক্রমানুসারে স্ক্যান করে । অতএব উভয়ই প্রায় অনুকূল রিট ক্যাচিং আচরণ করে।
সমান উপাদান এবং ইতিমধ্যে সাজানো তালিকাগুলি
ভ্যান্ডারিং লজিকের দ্বারা ইতিমধ্যে উল্লিখিত হিসাবে, এলোগরিদমের কার্যকারিতা এলোমেলোভাবে অনুমতি ছাড়াই নয় এমন তালিকার জন্য আরও মারাত্মকভাবে পৃথক।
ইতিমধ্যে বাছাই করা একটি অ্যারেতে হোয়ারের পদ্ধতিটি কখনই বদল হয় না, কারণ কোনও ভুল জায়গায় যুক্ত জোড় নেই (উপরে দেখুন), যদিও লোমুতোর পদ্ধতিটি এখনও তার মোটামুটি স্বাপগুলি করে !n/2
সমান উপাদানের উপস্থিতি কুইকোর্টে বিশেষ যত্ন প্রয়োজন। (আমি নিজেই এই ফাঁদে পা দিলাম ; "অকাল অপ্টিমাইজেশান এর টেল" এর জন্য আমার মাস্টারের থিসিস পৃষ্ঠা 36 দেখুন) টি দ্বারা ভরা একটি অ্যারে হিসাবে চরম উদাহরণ হিসাবে বিবেচনা করুন । এই ধরণের অ্যারেতে, হোয়েরের পদ্ধতিটি প্রতিটি জোড়া উপাদানগুলির জন্য একটি অদলবদল করে - যা হোয়েরের বিভাজনের পক্ষে সবচেয়ে খারাপ ঘটনা - তবে এবং সবসময় অ্যারের মাঝখানে মিলিত হয়। সুতরাং, আমাদের অনুকূল পার্টিশন রয়েছে এবং মোট চলমান সময়টি রয়ে গেছে ।আমি জে ও ( এন লগ এন )0ijO(nlogn)
লোমুতোর পদ্ধতিটি সমস্ত অ্যারেতে অনেক বেশি নির্বোধ আচরণ করে : তুলনাটি সর্বদা সত্য হবে, তাই আমরা প্রতিটি একক উপাদানের জন্য অদলবদল করি ! তবে আরও খারাপ: লুপের পরে, আমাদের সর্বদা , সুতরাং আমরা সামগ্রিক কর্মক্ষমতাটিকে অবনমিত করে সবচেয়ে খারাপ কেস বিভাজন পর্যবেক্ষণ করি !i = n Θ ( n 2 )0A[j] <= x
i=nΘ(n2)
উপসংহার
লোমুতোর পদ্ধতিটি সহজ এবং প্রয়োগ করা সহজ, তবে গ্রন্থাগার বাছাইয়ের পদ্ধতিটি প্রয়োগ করার জন্য ব্যবহার করা উচিত নয়।
A[i+1] <= x
। একটি সাজানো অ্যারেতে (এবং যুক্তিসঙ্গতভাবে বেছে নেওয়া পিভট দেওয়া হয়) হোয়ের প্রায় কোনও অদলবদল করে না এবং লোমুটো একটি টন করে না (একবার জে যথেষ্ট পরিমাণে ছোট হয়ে যায় তখন সমস্ত কিছুA[j] <= x
) আমি কী অনুপস্থিত?