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


97

আমি JDK-8 (x64) ব্যবহার করছি। জন্য Arrays.sort(প্রিমিটিভের) আমি জাভা ডকুমেন্টেশন নিম্নলিখিত পাওয়া যায়নি:

বাছাই আলগোরিদিম একটি ডুয়াল-পিভট হয় Quicksort ভ্লাদিমির Yaroslavskiy, জন বেন্টলি, এবং জশুয়া Bloch.` দ্বারা

জন্য Collections.sort(বস্তু) আমি পাওয়া এই "Timsort":

এই বাস্তবায়নটি একটি স্থিতিশীল, অভিযোজিত, পুনরাবৃত্তী সংহতকরণ ... এই প্রয়োগটি নির্দিষ্ট তালিকাটিকে একটি অ্যারেতে ফেলে দেয়, অ্যারে বাছাই করে এবং অ্যারেতে সংশ্লিষ্ট অবস্থান থেকে প্রতিটি উপাদান পুনরায় সেট করে তালিকার উপরে পুনরাবৃত্তি করে।

যদি Collections.sortকোনও অ্যারে ব্যবহার করা হয় তবে কেন এটি কেবল Arrays.sortডুয়েল-পিভট কুইকসোর্ট কল করে না বা ব্যবহার করে না ? কেন Mergesort ব্যবহার করবেন ?


9
আদিমদের অ্যারেগুলির জন্য এটি জাভাডোক - অবজেক্টের অ্যারেগুলি মাইগ্রোগোর্ট ব্যবহার করে বাছাই করা হয়।
Assylias

4
সংশ্লেষ আপনাকে সর্বদা nlogn দেয় যখন কুইকসোর্ট একসাথে nlogn2 জেনারালি অ্যারে আকার দিতে পারে তবে এটি বড় নয় তবে সংগ্রহগুলি সহজেই কয়েক মিলিয়ন এন্ট্রি পর্যন্ত যায় তাই nlogn2 এর ঝুঁকি নেওয়া পিএস nlogn2 এর অর্থ নয়
কুমার সৌরভ

কুইকোর্টের জন্য ও (এন ^ 2) চরম খারাপ পরিস্থিতি। অনুশীলনে এটি আরও দ্রুত
জেমস ওয়েয়ারজবা

তবে আপনি এপি তৈরির সময় সেই কসিকে উপেক্ষা করতে পারবেন না
কুমার সৌরভ

4
এই লিঙ্কটি খুব সম্পর্কিত।
কুর্তাল

উত্তর:


100

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

অবজেক্টগুলির জন্য আপনি খেয়াল করতে পারেন, যখন বিভিন্ন পরিচয় সমেত বস্তুগুলি যা তাদের equalsপ্রয়োগ অনুসারে সমান হিসাবে বিবেচিত হয় বা সরবরাহিত Comparatorতাদের অর্ডার পরিবর্তন করে। অতএব, কুইকসোর্ট কোনও বিকল্প নয়। সুতরাং MergeSort এর একটি বৈকল্পিক ব্যবহৃত হয়, বর্তমান জাভা সংস্করণগুলি টিমসোর্ট ব্যবহার করে । এটি উভয়ের ক্ষেত্রেই প্রযোজ্য Arrays.sortএবং Collections.sortজাভা 8 এর সাথে, Listনিজেই বাছাই করা অ্যালগরিদমগুলিকে ওভাররাইড করতে পারে।


Qu কুইকসোর্টের দক্ষতার সুবিধার্থে স্থানটিতে কাজ করার সময় কম স্মৃতি দরকার। তবে এটির একটি নাটকীয়ভাবে সবচেয়ে খারাপ কেস পারফরম্যান্স রয়েছে এবং টিমসোর্টের মতো একটি অ্যারেতে প্রাক-সাজানো ডেটা চালানো যায় না।

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

বর্তমান পরিস্থিতি (জাভা 8 থেকে জাভা 11 সহ) নিম্নরূপ:

  • সাধারণত, আদিম অ্যারেগুলির জন্য বাছাই করার পদ্ধতিগুলি নির্দিষ্ট কিছু পরিস্থিতিতে শুধুমাত্র কুইকসোর্ট ব্যবহার করবে । বড় অ্যারেগুলির জন্য, তারা টিমসোর্টের মতো প্রথমে প্রাক-সাজানো ডেটাগুলির রানগুলি সনাক্ত করার চেষ্টা করবে এবং যখন রানগুলির সংখ্যা নির্দিষ্ট প্রান্তিকের চেয়ে বেশি না হয় তখন সেগুলি মার্জ করবে। অন্যথায় তারা কুইকসোর্টে ফিরে যাবে , তবে এমন একটি বাস্তবায়ন যা ছোট রেঞ্জগুলির জন্য সন্নিবেশ সাজানোর ক্ষেত্রে ফিরে আসবে , যা কেবলমাত্র ছোট অ্যারেগুলিকেই প্রভাবিত করে না, তবে দ্রুত সাজানোর পুনরাবৃত্তিও ঘটায়।
  • sort(char[],…)এবং sort(short[],…)আরও একটি বিশেষ কেস যুক্ত করুন, অ্যারেগুলির গণনা বাছাইয়ের জন্য যার দৈর্ঘ্য একটি নির্দিষ্ট প্রান্তিকের চেয়ে বেশি
  • অনুরূপভাবে, গণনা বাছাইsort(byte[],…) ব্যবহার করবে তবে অনেক ছোট প্রান্তিকের সাহায্যে, যা ডকুমেন্টেশনের সবচেয়ে বড় বৈপরীত্য তৈরি করে, কখনও কখনও কুইকসোর্ট ব্যবহার করে না। এটি কেবলমাত্র ছোট অ্যারে এবং অন্যথায় গণনা বাছাইয়ের জন্য সন্নিবেশ বাছাই ব্যবহার করে ।sort(byte[],…)

4
হুঁ, আকর্ষণীয়ভাবে কালেকশনস.সওয়ার্ট জাভাদোক বলেছেন: "এই ধরণের স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত", তবে যেহেতু এটি তালিকা.সোর্টকে প্রতিনিধিত্ব করে, যা তালিকা বাস্তবায়ন দ্বারা ওভাররাইড করা যেতে পারে, স্থিতিশীল বাছাই সত্যই সংগ্রহগুলির দ্বারা গ্যারান্ট করা যায় না all সমস্ত তালিকার জন্য বাছাই করুন s বাস্তবায়ন। নাকি আমি কিছু মিস করছি? এবং List.sort- এ স্থিতিশীল হওয়ার জন্য বাছাই অ্যালোগার্থ্মের প্রয়োজন হয় না।
পুস

11
@ পিউস: এর সহজ অর্থ হল যে এই গ্যারান্টির দায় এখন যারা ওভাররাইডিং List.sortপদ্ধতি প্রয়োগ করে তাদের হাতে in Collections.sortগ্যারান্টিটি প্রতিটি Listপ্রয়োগের জন্য সঠিকভাবে কাজ করতে পারে না কারণ এটি গ্যারান্টি হতে পারে না , উদাহরণস্বরূপ যে এটি Listতাত্পর্যপূর্ণভাবে এর বিষয়বস্তু পরিবর্তন করে না। এটি সমস্তই ফুটে উঠেছে যে কেবলমাত্র গ্যারান্টি Collections.sortসঠিক Listপ্রয়োগকরণ (এবং সঠিক Comparatorবা equalsবাস্তবায়ন) এর ক্ষেত্রে প্রযোজ্য ।
হোলার

4
@ পুস: তবে আপনি ঠিক বলেছেন, উভয় পদ্ধতিতেই জাভাদোক এই সীমাবদ্ধতা সম্পর্কে সমানভাবে স্পষ্ট নয় তবে কমপক্ষে সাম্প্রতিকতম ডকুমেন্টেশনে বলা হয়েছে যে Collections.sortতারা এই প্রতিনিধিত্ব করবে List.sort
হোলার

@ পুস: এর প্রচুর উদাহরণ রয়েছে, যেখানে গুরুত্বপূর্ণ সম্পত্তিগুলি ধরণের অংশ নয় তবে কেবলমাত্র ডকুমেন্টেশনে উল্লিখিত হয় (এবং এইভাবে সংকলক দ্বারা এটি পরীক্ষা করা হয় না)। কোনও আকর্ষণীয় বৈশিষ্ট্য প্রকাশ করার জন্য জাভার ধরণের সিস্টেমটি খুব দুর্বল। (এ ক্ষেত্রে গতিশীল টাইপ করা ভাষার চেয়ে এটি আলাদা নয়, সেখানেও, ডকুমেন্টেশনে বৈশিষ্ট্যগুলি সংজ্ঞায়িত করা হয় এবং এটি লঙ্ঘন করা হয়নি তা নিশ্চিত করার জন্য এটি প্রোগ্রামারের উপর নির্ভর করে)) এটি আরও এগিয়ে যায়, আসলে: আপনি কি লক্ষ্য করেছেন? যে Collections.sortএমনকি তার টাইপ স্বাক্ষরে উল্লেখ না যে আউটপুট অনুসারে বাছাই করা হয়?
Jörg ডব্লু মিট্টাগ

4
আরও উদ্বেগজনক টাইপ সিস্টেমের ভাষায়, রিটার্নের ধরণটি Collections.sortএমন কিছু হবে "বৈশিষ্ট্যগুলির সাথে ইনপুট হিসাবে একই ধরণের এবং দৈর্ঘ্যের সংগ্রহ যা 1) ইনপুটটিতে উপস্থিত প্রতিটি উপাদান আউটপুটে উপস্থিত থাকে, 2 ) আউটপুট থেকে প্রতিটি জোড় উপাদানগুলির জন্য, বাম দিকটি ডান একের চেয়ে বড় নয়, 3) আউটপুট থেকে প্রতিটি জোড় উপাদানগুলির জন্য, ইনপুটটিতে বামের সূচকটি ডানটির চেয়ে ছোট "বা এর মতো কিছু যে।
Jörg ডব্লু মিটাগ

20

আমি ডকুমেন্টেশন সম্পর্কে জানি না, তবে java.util.Collections#sortজাভা 8 (হটস্পট) এর প্রয়োগটি এইভাবে চলে:

@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

এবং List#sortএই বাস্তবায়ন আছে:

@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

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


16

জাভাডোকের মতে, শুধুমাত্র আদিম অ্যারেগুলি কুইকসোর্ট ব্যবহার করে বাছাই করা হয়। অবজেক্ট অ্যারেগুলি মার্জসোর্টের সাথেও বাছাই করা হয়।

সুতরাং সংগ্রহগুলি.সোর্টটি অবজেক্টগুলির জন্য অ্যারে.সোর্ট হিসাবে একই বাছাই করা অ্যালগরিদম ব্যবহার করে বলে মনে হচ্ছে।

আরেকটি প্রশ্ন হ'ল কেন বস্তুর অ্যারেগুলির চেয়ে পৃথক ধরণের অ্যালগোরিদম আদিম অ্যারেগুলির জন্য ব্যবহৃত হয়?


2

যেমন উত্তর অনেক জুড়ে।

আরিস.সোর্ট দ্বারা কুইকসোর্টটি আদিম সংগ্রহগুলি বাছাই করার জন্য ব্যবহার করা হয় কারণ স্থায়িত্বের প্রয়োজন হয় না (আপনি যদি জানেন না বা যত্ন নেবেন না যদি দুটি অভিন্ন ইন্টি সাজানো হয় তবে)

MergeSort বা আরও নির্দিষ্টভাবে টিমসোর্ট অ্যারাই.সোর্ট দ্বারা অবজেক্ট সংগ্রহের বাছাইয়ের জন্য ব্যবহার করা হয়। স্থায়িত্ব প্রয়োজন। কুইকসোর্ট স্থিতিশীলতার জন্য সরবরাহ করে না, টিমসোর্ট করেন।

সংগ্রহগুলি। অ্যারেগুলিতে প্রতিনিধিদের বাছাই করুন.এই কারণেই আপনি মার্জসর্টকে উল্লেখ করে জাভাদোকটি দেখছেন।


1

মেশিন সাজানোর ক্ষেত্রে কুইক সার্টের দুটি বড় ত্রুটি রয়েছে:

  • আদিমতার সময় এটি স্থিতিশীল নয়।
  • এটি এন লগ এন কর্মক্ষমতা গ্যারান্টি দেয় না।

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

স্বেচ্ছাসেবক বস্তু বাছাই করার সময় স্থায়িত্ব একটি বড় বিষয় deal এটি একটি দুর্দান্ত পার্শ্ব সুবিধা যা মার্জ বাছাই এন লগ এন (সময়) পারফরম্যান্সের গ্যারান্টি দেয় the এই কারণেই অবজেক্টের রেফারেন্সগুলি বাছাইয়ের জন্য একটি স্থিতিশীল বাছাই (মার্জ সাজান) সরবরাহ করার জন্য মার্জ সাজান নির্বাচন করা হয়।


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