মূল বিষয়বস্তু
মার্জ সর্ট বিশ্লেষণ
Given that the time when merging elements, how do we get to showing that time? We start by thinking about the three parts of divide-and-conquer and how to account for their running times. We assume that we're sorting a total of elements in the entire array.
merge
function runs in mergeSort
runs in - সাবঅ্যারের আকার যাই হোক না কেন বিভক্তিকরণ ধাপ এর সময় ধ্রুবক হবে। আসলে বিভক্তিকরণ(ডিভাইড) ধাপটি শুধুমাত্র সুচক
এবং এর মধ্যবিন্দু হিসাব করে। আমরা একে big-Θ আকারে লিখব, আমরা দিয়ে ধ্রুবক সময়কে বুঝাব। - কনকার ধাপটি এমন একটি ধাপ যেখানে দুইটি সাবঅ্যারেরকে বার বার সর্ট করা হয় যাদের প্রতিটির উপাদান আনুমানিক
, ধাপটি সম্পন্ন হতে কিছু সময় লাগে, যা আমরা ছোট সমস্যাগুলো বিবেচনা করার সময় হিসাব করব। - উভয় ধাপ একত্রিত করলে
সময়ে সংখ্যক উপাদান পাওয়া যায়।
যদি আমরা বিভক্তকরন এবং একত্রকরণ ধাপগুলোকে একসাথে চিন্তা করি তাহলে দেখা যায়, বিভক্তকরন ধাপের সময় একত্রকরণ ধাপের সময় থেকে কম। তাহলে, চিন্তা করে দেখ বিভক্তকরন এবং একত্রকরণ ধাপ একসাথে সম্পন্ন হতে সময় নেয়। আরও ভালভাবে বোঝার জন্য, ধরি বিভক্তকরন এবং একত্রকরণ ধাপগুলো একসাথে সম্পন্ন হতে সময় নেয় যেখানে একটি ধ্রুবক।
সহজভাবে বলা যায় যদি হয় তাহলে সর্বদা জোড় সংখ্যা হবে। অর্থাৎ যখন হয় তখন এটি একটি পূর্ণসংখ্যা হবে। (যেসব ক্ষেত্রে এর মান বিজোড় হয় সেসব ক্ষেত্রে big-Θ চিহ্নের জন্য মানের কোন পরিবর্তন হয় না)। তাহলে উপাদান বিশিষ্ট সাবঅ্যারের জন্য হবে উপাদান বিশিষ্ট সাবঅ্যারের (বিভক্তকরন এবং একত্রকরণ ধাপ—শুধুমাত্র একত্রিত করার জন্য)।
মার্জ সর্ট
এর সময় মার্জ সর্ট
এর সময়ের সমষ্টির দ্বিগুণ (জয় ধাপ) যোগ এখন আমাদের উপদানের recursive calls (রিকারসিভ কল) এর রান করার সময় বের করতে হবে। প্রতিটি recursive calls এর রান করার সময় উপাদানবিশিষ্ট subarray (কেননা কে অর্ধেক করে ভাগ করতে হবে) এবং এর আকারের দুইটি ছোট সমস্যা আছে যার প্রতিটি মার্জ করার জন্য সময় নেয়। সুতরাং আকারের ছোট সমস্যাগুলো মার্জ করতে সর্বমোট সময় লাগে।
মার্জ সর্ট
করার দিগুন। আমাদের চল মার্জিং এর সময়গুলোকে "tree" (ট্রি) আকারে আকিঃ
কম্পিউটার বিজ্ঞানীরা বাস্তবিক trees বৃদ্ধি পাওয়ার বৈশিষ্টের উল্টো করে tree অঙ্কন করে। tree হচ্ছে এক ধরনের গ্রাফ যা চক্রাকার নয় (যার শুরু এবং শেষ একই জায়গায়)। প্রচলিত নিয়ম হল শীর্ষবিন্দুগুলো একটি ট্রিতে এর নোডসহ কল করা। মূল node(নোড) একদম শীর্ষে থাকে; এখানে, বাস্তব অ্যারে উপাদান এর জন্য মুলটি আকারের subarray দিয়ে লেবেল করা। মূল নোড এর নিচে দুইটি child nodes (চাইল্ড নোড) থাকে, যাদের প্রত্যেকে দিয়ে লেবেল করা এবং আকারের দুইটি ছোট সমস্যার জন্য সাবঅ্যারে কে প্রকাশ করে।
প্রতিটি আকারের ছোট সমস্যা অথবা আকারের দুইটি subarray কে রিকার্সিভ সর্ট করে। কেননা আকারের দুইটি এবং আকারের চারটি ছোট সমস্যা আছে। এই চারটি ছোট সমস্যার প্রতিটি সর্বমোট উপাদান মার্জ করে এবং চারটি ছোট সমস্যার প্রতিটির মার্জ করার সময় । চারটি subproblem কে একত্রিত করলে আমরা দেখতে পাই যে আকারের সবগুলো subproblem এর মার্জ করার সময় :
subproblems যত ছোট হতে থাকবে রিকার্সন এর প্রতিটি "লেভেল" এ subproblem এর সংখ্যা দিগুণ হতে থাকবে কিন্তু মার্জিং এর সময় অর্ধেক হয়ে যাবে। দিগুণ এবং অর্ধেক, এরা পরস্পরকে বাতিল করে দিবে এবং রিকার্সন এর প্রতিটি লেভেল এ মার্জিং সময় হবে। ধীরে ধীরে, আমরা সাইজ 1 এর ছোট সমস্যাগুলোতে প্রবেশ করব: মূল সমস্যা। 1 আকারের subarray সর্ট করতে আমাদের সময় ব্যয় করতে হবে, কেননা আমাদের পরীক্ষা করে দেখতে হবে এবং এই পরীক্ষার কত সময় দরকার। 1 আকারের, কতটি subarrays আছে? যেহেতু আমরা উপাদান নিয়ে শুরু করেছি সেহেতু এর উপাদান সংখ্যা অবশ্যই হবে। যেহেতু প্রতিটি বেস কেস এর জন্য সময় দরকার হয় সেহেতু দ্মনে করে নেওয়া যায় যে বেস কেস এর জন্য সময় দরকার হয়।
Now we know how long merging takes for each subproblem size. The total time for levels in the tree, then the total merging time is . So what is ? We start with subproblems of size and repeatedly halve until we get down to subproblems of size 1. We saw this characteristic when we analyzed binary search, and the answer is . For example, if , then , and sure enough, the tree has four levels: . The total time for . When we use big-Θ notation to describe this running time, we can discard the low-order term ( ) and the constant coefficient ( ), giving us a running time of , as promised.
mergeSort
is the sum of the merging times for all the levels. If there are mergeSort
, then, is মার্জ সর্ট সম্পরকে আরেকটি বিষয় গুরুত্বপূর্ণ। মার্জিং এর সময় এটি একটি সর্ট করা পূর্ণ array এর কপি করে রাখে যার এক অর্ধেক
lowHalf
অবস্থানে এবং অপর অর্ধেক highHalf
অবস্থানে থাকে। এটি কিছু সময় বস্তুর উপাদানের ধ্রুবক সংখ্যা কপি করে, অর্থাৎ মার্জ সর্ট জায়গায় কাজ করে না । তুলনামুলকভাবে সিলেকশন সর্ট এবং ইনসারশন সর্ট সকল জায়গায় কাজ করে, কেননা তারা কখনও একই সময়ে একের অধিক উপদানের ধ্রুবক সংখ্যার কপি করে না। কম্পিউটার বিজ্ঞানীগণ এরকমভাবে চিন্তা করতে পচ্ছন্দ কর যে একটি অ্যালগোরিদম সঠিক জায়গাতে ঠিক মত কাজ করছে কিনা, কারণ আমাদের কিছু কিছু সিস্টেম আছে যার মধ্যে স্থান খুবই গুরুত্বপূর্ণ এবং তাই সঠিক স্থানে অ্যালগোরিদম থাকা গুরুত্বপূর্ণ।এই বিষয়বস্তুটি Dartmouth Computer Science এর প্রফেসর Thomas Cormen এবং Devin Balkcom এর সহযোগিতায় এবং একই সাথে খান একাডেমির কম্পিউটিং শিক্ষাক্রম দলের একসাথে কাজ করার মাধ্যমে তৈরি করা হয়েছে। এই বিষয়বস্তু CC-BY-NC-SA দিয়ে লাইসেন্সকৃত।
আলোচনায় অংশ নিতে চাও?
কোন আলাপচারিতা নেই।