একটি পূর্ণসংখ্যার অ্যারের জন্য দ্রুততম বাছাই করা অ্যালগরিদম কী?


55

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

  • দ্রুততম বর্তমানে বাছাই করা অ্যালগরিদম কোনটি?
  • তাত্ত্বিকভাবে, এটি কি আরও দ্রুততরও সম্ভব? সুতরাং, বাছাই করার জন্য সর্বনিম্ন জটিলতা কী?

6
"দ্রুত" বলতে কী বোঝ? আপনি কি পরিমাপ করতে চান?
রাফেল

2
"পূর্ণসংখ্যার এলোমেলো অ্যারে" এর অর্থ কী? এলোমেলোভাবে কি বিতরণ? সমবন্টন? গসিয়ান? বিতরণের উপর নির্ভর করে প্রত্যাশিত চলমান সময় অ্যালগরিদমের চেয়ে ভাল হতে পারে । O(nlogn)
বাকুরিউ

@ জেনে রেডিক্স বাছাই করুন। সঠিক প্রয়োগের জন্য অন্তত 32 এর জন্য ও (এন) জটিলতা রয়েছে।
এই


1
@gen: নিরিখে asymptotics? তারপরে, এটি সহজ: কোনও Θ ( n লগ এন ) অ্যালগরিদম চয়ন করুন। মনে রাখবেন যে এটির (গড়) বাস্তব-বিশ্বের পারফরম্যান্সের সাথে কোনও সম্পর্ক নেইএটি এই ক্ষেত্রে একটি সার্থক পড়া হতে পারে। ΘΘ(nlogn)
রাফেল

উত্তর:


42

সাধারণ পরিভাষায়, বাছাই করা অ্যালগরিদম যেমন সন্নিবেশ বাছাই, বুদ্বুদ সাজানো এবং নির্বাচনের ধরণ রয়েছে, যা আপনার সাধারণত বিশেষ পরিস্থিতিতে ব্যবহার করা উচিত; কুইকোর্ট, যা সবচেয়ে খারাপ ক্ষেত্রে ( এন 2 ) তবে বেশিরভাগ ক্ষেত্রে ( এন লগ এন ) ভাল ধ্রুবক এবং বৈশিষ্ট্য এবং যা সাধারণ-উদ্দেশ্য অনুসারে বাছাইয়ের পদ্ধতি হিসাবে ব্যবহার করা যেতে পারে; হে ( লগ ইন করুন এন ) আলগোরিদিম, একত্রীকরণ-সাজানোর এবং গাদা-সাজানোর মত, যা ভাল সাধারণ বাছাই আলগোরিদিম আছে; এবং ( এন)O(n2)O(n2)O(nlogn)O(nlogn) বা লিনিয়ার, পূর্ণসংখ্যার তালিকার জন্য যেমন অ্যালগরিদমগুলি বাছাই করা যেমন র‌্যাডিক্স, বালতি এবং গণনা প্রকারগুলি, যা আপনার তালিকাগুলির মধ্যে পূর্ণসংখ্যার প্রকৃতির উপর নির্ভর করে উপযুক্ত হতে পারে।O(n)

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

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

এই উত্তরটি কেবল জটিলতার সাথে সম্পর্কিত। অ্যালগরিদমের বাস্তবায়নের আসল সময়গুলি একটি বৃহত সংখ্যক কারণের উপর নির্ভর করবে যা একক উত্তরের জন্য দায়ী hard


OΩ

1
ΘΩ

7
Ω

2
@ রিলেজস্লাউ: আমি এটাকে গর্বের সাথে পরিধান করেছি। :]
রাফেল

1
@gen দেখুন stackoverflow.com/a/3274203 কিছু আলোচনার জন্য। মূলত, যদি স্বতন্ত্র রেকর্ডগুলি বিশাল হয়, এবং এটি এলোমেলোভাবে অ্যাক্সেসের উপায়ে সংরক্ষণ করা হয় না এবং ডেটার পরিমাণটি এমন হয় যে এটি যথাস্থানে করা উচিত, তবে বুদবুদ সাজানোর উপায়। এই পরিস্থিতিতে সাধারণত আজকাল বিরল, কিন্তু আপনি এখনও তাদের মুখোমুখি হতে পারে।
প্যাট্রিক 87

16

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

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

তবে বাস্তবে, বাস্তবে, বাছাই করা অ্যালগরিদম খুব কমই একটি প্রধান কার্যকারিতা বাধা।


9

তদ্ব্যতীত, আপনার দ্বিতীয় প্রশ্নের উত্তর

তাত্ত্বিকভাবে, এটি কি আরও দ্রুততরও সম্ভব?
সুতরাং, বাছাই করার জন্য সর্বনিম্ন জটিলতা কী?

সাধারণ উদ্দেশ্যে বাছাইয়ের জন্য, তুলনা-ভিত্তিক বাছাইয়ের সমস্যা জটিলতা হ'ল Ω (n লগ এন) । কিছু অ্যালগরিদম রয়েছে যা ও (এন) এ বাছাই করে তবে তারা সকলেই ইনপুটটি নিয়ে অনুমান করাতে নির্ভর করে এবং সাধারণ উদ্দেশ্য অনুসারে বাছাই করা অ্যালগরিদম নয়।

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

আপনি জটিলতা কম বাছাই আবদ্ধ জন্য আনুষ্ঠানিক প্রমাণ খুঁজে পেতে পারেন এখানে :


3
Ω(nlogn)

বাছাইয়ের সমস্যা দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে । সাধারণ-উদ্দেশ্য তুলনা-ভিত্তিক প্রকারভেদগুলি কেবলমাত্র ধরণের বাছাইয়ের সমস্যা নয় people
প্যাট্রিক 87

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

1
@ ডিডাব্লু: র‌্যাডিক্স সাজানোর একটি 'সাধারণ উদ্দেশ্য' বাছাই করা অ্যালগরিদমকে বিবেচনা করা উচিত নয়, কারণ এর জন্য নির্দিষ্ট দৈর্ঘ্যের পূর্ণসংখ্য কী প্রয়োজন; অন্যথায় এটি দরকারী না? তবে আমি আপনার বক্তব্য পেতে। :) আমার অনুমান যে আমার ভুলটি নির্দিষ্টভাবে পূর্ণসংখ্যা বাছাইয়ের পরিবর্তে এমন কিছু বাছাইয়ের দিকে মনোনিবেশ করেছিল যা তুলনা করা যায় । এগুলি বিভিন্ন সমস্যা এবং সম্ভাব্য সমাধানগুলির একটি আলাদা সেট রয়েছে। প্রশ্নটিতে "একটি পূর্ণসংখ্যার এলোমেলো অ্যারে" উল্লেখ করা হয়েছে তবে আমি স্বীকার করি যে আমি এটিকে একটি সীমাবদ্ধতার চেয়ে উদাহরণ হিসাবে গ্রহণ করেছি।
rla4

2
@ ডেভিডরিচার্জি, দেড় বছর পরে এই ফিরে তাকানো, আমি আপনার সাথে একমত। ধন্যবাদ.
ডিডাব্লিউ


1

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

An(n1)A(n1)Ω(n)O(n)Ω(n)

Ω(n)O(n)n2n3n51n2


O(n)nlgnn232O(n)O(nlgn)(কুইকোর্ট বা মার্জোর্টের জন্য), বাস্তবে তুলনাটি এতটা স্পষ্ট নয়: বিগ-ও নোটেশনে লুকানো স্থিরত্বগুলি খুব গুরুত্বপূর্ণ হয়ে ওঠে এবং র‌্যাডিক্স-বাছাইয়ের জন্য ধ্রুবকটি কুইকোর্ট বা সংযুক্তির জন্য ধ্রুবকের চেয়ে বেশি।
DW

lg(n)n

Ω(n)

2
O(wn)www{0,,2w1}lognnw=lognnlogn
ডেভিড রিচারবি

1

O(nloglogn)
O(nloglogU)U


0

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

তত্ত্বে যেমন quick_sortহয় O(n log n)। সঙ্গে pপ্রসেসর, আদর্শভাবে এই নিচে আসা উচিত O(n/p log n)আমরা যদি এটা সমান্তরাল চালানো।

উইকিপিডিয়া উদ্ধৃত: সময় জটিলতা ...

সর্বোত্তম সমান্তরাল বাছাই হল ও (লগ এন)

অনুশীলনে, বৃহত্তর ইনপুট আকারের O(log n)জন্য মাপদণ্ডের সমস্যার কারণে এটি অর্জন করা অসম্ভব ।

সমান্তরাল মার্জ সাজানোর জন্য সিউডো কোডটি এখানে । প্রয়োগটি merge()সাধারণ মার্জ সাজানোর মতোই হতে পারে:

// Sort elements lo through hi (exclusive) of array A.
algorithm mergesort(A, lo, hi) is
    if lo+1 < hi then  // Two or more elements.
        mid = ⌊(lo + hi) / 2⌋
        fork mergesort(A, lo, mid)
        mergesort(A, mid, hi)
        join
        merge(A, lo, mid, hi)

আরও দেখুন:


O(n2)

@ এভিল হ্যাঁ সমান্তরাল প্রক্রিয়াকরণের জন্য কুইকসোর্ট ভালভাবে উপযুক্ত নয়। এটি একটি উদাহরণ। যেগুলি ব্যবহার করা উচিত সেগুলি দেওয়া লিঙ্কগুলিতে তালিকাভুক্ত।
কাশ্যপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.