কি দ্রুত সাজানোর জন্য একটি খারাপ কেস জন্য তোলে?


10

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

আমি এ পর্যন্ত তিনটি উদাহরণ ভেবেছি:

[1,2,3,4,5,6,7,8,9,10] - when the array is sorted
[10,9,8,7,6,5,4,3,2,1] - when the array is reversed
[1,1,1,1,1,1,1,1,1,1] - when the array is the same values
[1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys

উদাহরণস্বরূপ, আমি এটি সম্পর্কে খুব বেশি নিশ্চিত নই:

[1,3,5,7,9,10,8,6,4,2]

সুতরাং একটি অ্যারেরের জন্য কী এমনটি তৈরি হয় যে যেখানে (প্রায়) আদর্শ এটির তুলনায় কুইকোর্টের সাথে অসুবিধা হয়?


2
পিভট কীভাবে নির্বাচিত হয়? আপনি দুটি উপায় বলেছেন যে এটি নির্বাচন করা হয়নি, তবে এটি কীভাবে নির্বাচিত হয়েছিল তা নয়।
উইনস্টন ইওয়ার্ট

দয়া করে কুইকসোর্টের জন্য সবচেয়ে খারাপ কেস দিন - কখন এটি ঘটতে পারে? স্ট্যাকওভারফ্লোতে একটি পঠন। আমি বাছাই করা.টাকে বাছাই করা অ্যালগরিদমের একটি দুর্দান্ত ভিজ্যুয়ালাইজেশন হিসাবে দেখতে পাই

@ উইনস্টনওয়ার্ট পিভট প্রথম উপাদান দ্বারা নির্বাচিত হয়েছে।
mrQWERTY

@ রেনরেন ২৯ আমি প্রশ্নটিকে কিছুটা পরিবর্তন করেছি কারণ কেন উদাহরণস্বরূপ অ্যারে চেয়ে কোয়েস্টপোর্টের প্রদত্ত অ্যারেতে অসুবিধা হবে তার কারণের দিকে মনোযোগ কেন্দ্রীভূত করার জন্য (আমি লোকেরা আপনাকে উত্তর দিচ্ছি না [2,1,2,1,2,1,2,1]এবং পুরোটি হচ্ছে উত্তর). এই প্রশ্নের লক্ষ্যটি আদর্শভাবে, এমন এক হবে যেখানে অন্যান্য লোকেরা উদাহরণের পরিবর্তে (যার উত্তর রয়েছে) কেন (যার উত্তর রয়েছে) সম্পর্কে আরও জানতে পারেন ।

আপনি 2 টি উপাদানের অংশে কুইকসোর্ট চালাচ্ছেন? কারণ বাস্তব-বিশ্ব বাস্তবায়নগুলি ছোট ছোট খণ্ডগুলির জন্য সহজ প্রকারের ব্যবহার করতে ঝোঁক। উদাহরণস্বরূপ তুলনা এবং অদলবরণ N = 2 এর জন্য কুইকোর্টের চেয়ে অনেক সহজ।
এমসাল্টারস

উত্তর:


9

প্রতিটি ধরণের অ্যালগরিদমের একটি খারাপ পরিস্থিতি রয়েছে এবং অনেক ক্ষেত্রে সবচেয়ে খারাপ ক্ষেত্রে সত্যই খারাপ এটি এটির জন্য পরীক্ষা করার মতো worth সমস্যাটি হ'ল কেবলমাত্র বেসিক অ্যালগরিদম জানেন বলে কোনও একক নিকৃষ্টতম পরিস্থিতি নেই।

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

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


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


আমি দেখতে পাচ্ছি, সুতরাং গড় থেকে মান বিচ্যুতি সত্যিই বিভাজন ফলাফল নির্ধারণ করে।
mrQWERTY

"... এবং প্রায় প্রতিটি ক্ষেত্রেই সবচেয়ে খারাপ ঘটনা সত্যই খারাপ, তাই এটির জন্য এটি পরীক্ষা করার মতো।" । এটি বিতর্কযোগ্য। আমি যখন এই টেবিলটির দিকে নজর দিই: en.wikedia.org/wiki/… আমি উপসংহারে পৌঁছেছি যে বেশিরভাগ "ভাল" বাছাই করা অ্যালগরিদমগুলির জন্য (অর্থাত্ গড় O(NlogN)পারফরম্যান্স বা আরও ভাল সহ) সবচেয়ে খারাপ এবং গড়ের ক্ষেত্রে একই জটিলতা থাকে। এটি পরামর্শ দেয় যে সাধারণত সবচেয়ে খারাপ ক্ষেত্রে (গুলি) এর জন্য পরীক্ষা করা উপযুক্ত নয়। (দেওয়া হল যে পরীক্ষা সম্ভবত O(N)... বা আরও খারাপ))
স্টিফেন সি

@ রেনরেন ২৯: 3 টি পিভটের মধ্যমা কেবল প্রথম বা শেষ হবে যদি 2 বা 3 এর মান একই হয়। এসডি এতে আসে না।
ডেভিড.পিএফএক্স

@ স্টেফেনসি: কুইকোর্ট সহ অনেকগুলি 'ভাল' অ্যালগরিদমের নিকৃষ্টতম জটিলতায় n 2 রয়েছে। তবে সম্পাদনা দেখুন।
ডেভিড.পিএফএক্স

@ ডেভিড.পিএফএক্স - "কিছু" ... হ্যাঁ। "প্রায় প্রতিটি" ... না
স্টিফেন সি

0

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

নিম্নলিখিত ফলাফলটি আমার ফাংশন qsort_random () দ্বারা উত্পাদিত হয়েছে। এন = 100,000

usec    call   compare   copy    pattern
80132   62946  1971278   877143  random
47326   57578  1606067   215155  sorted : 0,1,2,3,...,n-1
49927   63578  1628883   338715  sorted in reverse : n-1,n-2,...,2,1,0
55619   63781  1596934   377330  nearly reverse : n-2,n-1,n-4,n-3,...,2,3,0,1
54714   66667  1611454   290392  median-3-killer : n-1,0,1,2,...,n-2
1491    1      99999     4       all values the same : n,n,n,...
1577    1      99999     4       first is higher : n,1,1,1,...
2778    2      156159    10      last is lower : n,n,n,...,n,1
2994    3      199996    100009  a few data : n,...,n,1,...,1
3196    3      199996    50012   zigzag : n,1,n,1,...,n,1
917796  56284  67721985  673356  valley(sawtooth?) : n-1,n-3,...,0,...,n-4,n-2

বেশিরভাগ ক্ষেত্রে একটি এলোমেলো নিদর্শন চেয়ে দ্রুত। বেশিরভাগ পিভট নির্বাচনের জন্য ভ্যালি প্যাটার্ন একটি খারাপ কেস।

qsort(3)       usec = 14523   call = 0      compare = 884463    copy = 0
qsort_head()   usec = 138609  call = 99999  compare = 8120991   copy = 1214397
qsort_middle() usec = 664325  call = 99999  compare = 52928111  copy = 1036047
qsort_trad()   usec = 118122  call = 99999  compare = 6476025   copy = 1337523
qsort_random() usec = 295699  call = 58806  compare = 19439952  copy = 732962
qsort_log2()   usec = 66411   call = 63987  compare = 1597455   copy = 944821

qsort_log2 () লগ 2 (এন) উপাদানগুলিতে একটি পিভট নির্বাচন করে খারাপ কেস থেকে পালিয়ে যায়।
qsort (3) GNU লাইব্রেরি ব্যবহার করুন যা সূচীকরণের একীভূত সাজান।
qsort_trad () প্রথম, মধ্য এবং শেষ উপাদানগুলিতে একটি পাইভট নির্বাচন করুন।
qsort_random () এবং qsort_log2 () অদলবদল ব্যবহার করবেন না।
সোর্স সি প্রোগ্রাম এবং স্ক্রিপ্টগুলি গিথুবে পোস্ট করা হয় ।

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