المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:دوره ی تابستان:دوره ی ۱۹:الگوریتم ها:سوال ۳

سوال ۳

می‌دانیم مشکل اصلی ‎$Quicksort$‎ در پیدا کردن کلید قسمت ‎Partition‎ است. به‌طوری که اگر کلید عنصر مناسبی باشد دو زیر مسئله ما اندازه‌های برابر (و مساوی ‎$\frac{n}{2}$‎) خواهند داشت و اگر کلید عنصر مناسبی از آب در نیاید، رابطه بازگشتی ما کُند خواهد بود.

برای حل این مشکل، علی قسمت انتخاب کلید تابع ‎Parition‎ را (که روی زیرآرایه‌ی‎ $n=r-l+1$ ،‎عنصری ‎$A[l..r]$‎ اجرا می‌شود)، به صورت زیر می‌نویسد.

  • ابتدا ماکزیمم عناصر آرایه را در ‎${\cal O}(n)$‎ پیدا کن و آن را ‎$M$‎ بنام.
  • سپس مینیمم عناصر آرایه را در ‎${\cal O}(n)$‎ پیدا کن و آن را ‎$m$‎ بنام.
  • برای هر عنصر ‎$A_i$‎ از ‎$n$‎ عنصر موجود در آرایه (زیر آرایه)، مقدار ‎$C_i = Max(M-A_i,A_i-m)$‎ را حساب کن.
  • عنصری که ‎$C_i$‎ آن کم‌تر یا مساوی سایر ‎$C_i$‎ هاست را ‎$q$‎ بنام ‎($\forall_{i=l}^r C_q \le C_i$)‎‎ و $A[q]$ را عنصر کلید برای ‎Partition‎ قرار بده. یعنی ‎$key \leftarrow A[q]$‎.

دقت کنید که کل این رویه ‎۵ مرحله‌ای قرارست جایگزین ‎$key \leftarrow A[random(l..r)]$‎ بشود.‎

آیا با این کارِ علی تغییری در بهترین و بدترین زمان اجرای الگوریتم ‎$QuickSort$‎ به‌وجود می‌آید؟ جواب خود را در صورت لزوم با مثال و رابطه‌بازگشتی و یا اثبات بیان کنید.


ابزار صفحه