জাভা এর অ্যারেস.সোর্ট পদ্ধতিতে বিভিন্ন ধরণের জন্য দুটি পৃথক বাছাই করা অ্যালগরিদম ব্যবহার করে কেন?


121

জাভা 6 এর Arrays.sortপদ্ধতিতে আদিমগুলির অ্যারেগুলির জন্য কুইকসোর্ট ব্যবহার করা হয় এবং অবজেক্টগুলির অ্যারেগুলির জন্য মার্জ সাজ্ট ব্যবহার করা হয়। আমি বিশ্বাস করি যে বেশিরভাগ সময় কুইকসোর্টটি মার্জ সাজানোর চেয়ে দ্রুত এবং মেমরির দাম কম। আমার পরীক্ষাগুলি এটিকে সমর্থন করে, যদিও উভয়ই অ্যালগরিদমগুলি হ'ল (এন লগ (এন))। তাহলে কেন বিভিন্ন ধরণের জন্য বিভিন্ন অ্যালগরিদম ব্যবহার করা হয়?


14
কুইকোর্টের নিকৃষ্টতম ঘটনাটি N log 2 এনলগএন নয়।
কোডায়াডিক্ট

অপেক্ষা করুন, যদি আপনার Integerএস বা কিছু থাকে তবে কী ঘটে ?
টিখন জেলভিস

1
এই ব্যাখ্যা না হয় উৎস আপনি পড়তে?
হামফ্রে বোগার্ট

5
এই তথ্য এখন আর নেই। জাভা এসই 7 এ শুরু করে, মার্জসার্ট টিমসোর্টের সাথে প্রতিস্থাপন করা হয়েছে এবং কুইকসোর্টটি ডুয়েল-পিভট কুইকসোর্টের সাথে প্রতিস্থাপন করা হয়েছে । জাভা এপিআই ডক্সের লিঙ্কগুলির জন্য আমার উত্তরটি নীচে দেখুন।
উইল বার্ন

আরও দেখুন stackoverflow.com/questions/15154158/... এবং JDK জন্য 7+ দেখতে stackoverflow.com/questions/32334319/...
rogerdpack

উত্তর:


200

সর্বাধিক সম্ভাব্য কারণ: কুইকোর্টটি স্থিতিশীল নয় , সমান এনট্রিগুলি সাজানোর সময় তাদের আপেক্ষিক অবস্থান পরিবর্তন করতে পারে; অন্যান্য জিনিসের মধ্যে, এর অর্থ হ'ল আপনি যদি ইতিমধ্যে সাজানো অ্যারে বাছাই করেন তবে এটি অপরিবর্তিত থাকতে পারে না।

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

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


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

আদিম ধরণের জন্য এটি অ্যারের ক্লোন করে না, এটি তাদের জায়গায় বাছাই করতে পারে, তাই আমি মনে করি কেবল কারণ স্থায়িত্ব চুক্তি, মূলত ...
রোজারডপ্যাক

27

এই উত্তরে জাভা 7 এপিআই ডক্স অনুসারে , Arrays#Sort()অবজেক্ট অ্যারেগুলির জন্য এখন টিমসোর্ট ব্যবহার করে যা মার্জসোর্ট এবং ইনসারেশনসোর্টের একটি সংকর। অন্যদিকে, Arrays#sort()আদিম অ্যারেগুলির জন্য এখন ডুয়াল-পিভট কুইকসোর্ট ব্যবহার করা হয় । এই পরিবর্তনগুলি জাভা এসই 7 থেকে শুরু করে বাস্তবায়ন করা হয়েছিল।


2
এটি কোনও উত্তর নয়, কেন 2 টি পৃথক অ্যালগরিদম বেছে নেওয়া হয়েছে।
আলেকজান্দ্র

12

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

বিভিন্ন অ্যালগরিদমের একটি শালীন ভিজ্যুয়াল তুলনা রয়েছে, বিভিন্ন অ্যালগরিদমের জন্য ডান-সর্বাধিক গ্রাফের প্রতি বিশেষ মনোযোগ দিন।


2
জাভা কুইকোর্টটি এমন একটি পরিবর্তিত কুইকোর্ট যা ও (N ^ 2) এর কাছে হ্রাস করে না, ডকস থেকে "এই অ্যালগরিদম অনেক ডেটা সেটগুলিতে এন * লগ (এন) পারফরম্যান্স সরবরাহ করে যা অন্যান্য
কোকিক্রোটসকে

7

আমি আলগোরিদম এবং কোর্সেরা ক্লাস করছিলাম একটি প্রভাষক প্রফেসর বব সেডজিক জাভা সিস্টেমের জন্য মূল্যায়নের উল্লেখ করে:

"যদি কোনও প্রোগ্রামার অবজেক্ট ব্যবহার করে তবে স্থানটি একটি সমালোচনামূলকভাবে গুরুত্বপূর্ণ বিবেচনা নয় এবং একত্রিতকরণের মাধ্যমে অতিরিক্ত স্থান ব্যবহার করা সমস্যা সম্ভবত নাও সমস্যা And দ্রুত বাছাই। "


4
এটি প্রধান কারণ নয়। সেই বাক্যটির ঠিক পরে সেখানে একটি প্রশ্ন ছিল, "রেফারেন্স ধরণের জন্য কেন মার্জসর্ট ব্যবহার করা হয়?" (কারণ এটি স্থিতিশীল)। আমার মনে হয় সেডজউইক ভিডিওতে এটি প্রশ্নের জন্য রেখে দেওয়ার জন্য উল্লেখ করেন নি।
26:46

1

java.util.Arrays ব্যবহারসমূহ quicksort যেমন int- এ এবং আদিম ধরনের জন্য mergesort যে বস্তু বাস্তবায়নে জন্য তুলনীয় বা ব্যবহার comparator । দুটি পৃথক পদ্ধতি ব্যবহারের ধারণাটি হ'ল যদি কোনও প্রোগ্রামার যদি অবজেক্টগুলি ব্যবহার করে তবে সম্ভবত স্থানটি একটি সমালোচনামূলকভাবে গুরুত্বপূর্ণ বিবেচনা না হয় এবং তাই সংযোজন দ্বারা ব্যবহৃত অতিরিক্ত স্থান সম্ভবত কোনও সমস্যা নয় এবং যদি প্রোগ্রামার আদিম ধরণের ব্যবহার করে তবে সম্ভবত কর্মক্ষমতা সবচেয়ে গুরুত্বপূর্ণ বিষয় তাই ব্যবহার করুন quicksort

উদাহরণস্বরূপ: স্থায়িত্বের বিষয়গুলি বাছাই করার সময় এটি উদাহরণ।

এখানে চিত্র বর্ণনা লিখুন

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

সূত্র: ইনফো


0

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

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