কেন কালেকশন.সোর্টটি কুইকোর্টের পরিবর্তে মার্জ সাজ্ট ব্যবহার করে?


101

আমরা জানি যে দ্রুত সাজানোর কাজটি দ্রুততম বাছাই করা অ্যালগরিদম।

জেডি কে 6 collections.sortদ্রুত বাছাইয়ের পরিবর্তে মার্জ সাজ্ট অ্যালগরিদম ব্যবহার করে। তবে অ্যারেস.সোর্ট দ্রুত সাজানোর অ্যালগরিদম ব্যবহার করে।

সংগ্রহগুলি.সোর্ট দ্রুত সাজানোর পরিবর্তে মার্জ সাজ্ট ব্যবহার করার কারণ কী?


4
আপনি জেডিকে লেখককে উত্তর না পেতে না পারলে আপনি যা যাচ্ছেন তা অনুমান করা। আসল প্রশ্ন নয়।
লার্নের মারকুইস

4
@ এজেপি ভাল পয়েন্ট, তবে অবশ্যই "গঠনমূলক নয়" সঠিক বন্ধনের কারণ। প্রশ্নটি এখানে কী তা আমার কাছে স্পষ্ট।
ডানকান জোন্স

4
কারণ জাভা ছেলেরা এইভাবে এটি করার সিদ্ধান্ত নিয়েছে। তাদেরকে জিজ্ঞেস করো. আমার মনে হয় আপনি এখানে কোনও বৈধ উত্তর পেতে পারবেন না। এবং দ্রুত কেমন হয় না সেরা। এটা শুধুমাত্র জন্য সবচেয়ে ভাল হয় জেনেরিক ব্যবহার
অ্যাডাম আর্ল্ড

4
একটি অনুমান: কুইকসোর্ট স্থিতিশীল নয়, মার্জেসোর্ট। আদিমদের জন্য, একটি স্থিতিশীল / অ-স্থিতিশীল বাছাই অপ্রাসঙ্গিক, বস্তুগুলির জন্য এটি হতে পারে (বা কমপক্ষে, আপনি একটি অস্থির বাছাইয়ের বিরুদ্ধে বাগ ফাইল করতে পারেন)।
পার্সিফাল

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

উত্তর:


188

অত্যন্ত সম্ভবত জোশ ব্লচ থেকে § :

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

  1. এটি স্থিতিশীল নয় (যেমনটি পার্সিফাল উল্লেখ করেছেন)।

  2. এটি এন লগ এন কর্মক্ষমতা গ্যারান্টি দেয় না ; এটি প্যাথলজিকাল ইনপুটগুলিতে চতুষ্কোণ পারফরম্যান্সকে হ্রাস করতে পারে।

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

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

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

এছাড়াও, নিম্নলিখিতটি প্রাসঙ্গিক:

Java.util.Arrays.sort এবং (অপ্রত্যক্ষভাবে) java.util. Collections. দ্বারা ব্যবহৃত অ্যালগরিদমকে অবজেক্ট রেফারেন্সগুলি বাছাই করতে "পরিবর্তিত সংহতকরণ (যার মধ্যে নিম্ন সাবলিস্টে সর্বাধিক উপাদানটি কম হলে মার্জটি বাদ দেওয়া হয়) উচ্চ সাবলিস্টে সর্বনিম্ন উপাদান)। এটি একটি যুক্তিসঙ্গত দ্রুত স্থিতিশীল বাছাই যা ও (এন লগ এন) পারফরম্যান্সের গ্যারান্টি দেয় এবং ও (এন) অতিরিক্ত স্থানের প্রয়োজন হয়। এর দিনটিতে (এটি 1997 সালে জোশুয়া ব্লচ লিখেছিলেন), এটি একটি দুর্দান্ত পছন্দ ছিল তবে আজ কিন্তু আমরা আরও ভাল করতে পারি।

২০০৩ সাল থেকে পাইথনের তালিকা সাজানো টাইমসোর্ট (টিম পিটার্সের পরে কে লিখেছেন) নামে পরিচিত একটি অ্যালগরিদম ব্যবহার করেছে। এটি একটি স্থিতিশীল, অভিযোজিত, পুনরাবৃত্ত একীকরণ যা আংশিকভাবে বাছাই করা অ্যারেগুলিতে চলার সময় এন লগ (এন) তুলনায় অনেক কম প্রয়োজন, যখন র্যান্ডম অ্যারে চলাকালীন একটি aতিহ্যবাহী সংশ্লেষের সাথে তুলনীয় পারফরম্যান্স সরবরাহ করে। সমস্ত যথাযথ একীকরণের মতো টাইমসোর্ট স্থিতিশীল এবং ও (এন লগ এন) সময় (সবচেয়ে খারাপ ক্ষেত্রে) চলে। সবচেয়ে খারাপ ক্ষেত্রে, টাইমসোর্টের জন্য n / 2 অবজেক্টের রেফারেন্সের জন্য অস্থায়ী স্টোরেজ স্পেস প্রয়োজন; সর্বোত্তম ক্ষেত্রে, এর জন্য কেবলমাত্র একটি সামান্য ধ্রুব স্থান প্রয়োজন। বর্তমান বাস্তবায়নের সাথে এটি বৈপরীত্য করুন, যার জন্য সর্বদা n অবজেক্টের রেফারেন্সের জন্য অতিরিক্ত স্থানের প্রয়োজন হয় এবং কেবলমাত্র সাজানো তালিকায় n লগ এনকে প্রহার করে।

টিমসোর্টটি এখানে বিশদে বর্ণনা করা হয়েছে: http://svn.python.org/projects/python/trunk/Objects/listsort.txt

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

এছাড়াও, দেখুন জাভা 7 টি কি পদ্ধতি অ্যারেগুলির জন্য টিম বাছাই করে? বাছাই করুন?

একক "সেরা" পছন্দ নেই। অন্যান্য অনেক কিছুর মতো এটিও বাণিজ্য সম্পর্কিত।

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