مرتب‌سازی شکیبانه

از ویکی‌پدیا، دانشنامهٔ آزاد
مرتب‌سازی شکیبانه
ردهالگوریتم مرتب‌سازی
ساختمان دادهآرایه
کارایی بدترین حالت

مرتب‌سازی صبورانه یک الگوریتم مرتب‌سازی است که بر پایهٔ کارت بازی یک نفره‌است وخاصیتی دارد که می‌تواند به طوز مؤثر طول بزرگترین زیر دنباله صعودی در یک آزایهٔ داده شده را محاسبه کند.

کارت بازی[ویرایش]

بازی با یک دسته بر زده شده شروع می‌شود که شماره‌گذاری شده‌است. ابتدا کارت‌ها ۱ به ۱ مقدار دهی و توزیع می‌شوند که البته این مقدار دهی و توزیع در کپه‌های متوالی و جدا از هم روی میز قرار دارد

    1. در ابتدا هیچ کپه‌ای از کارت وجود ندارد و اولین کارت که مقدار دهی و توزیع می‌شود یک کپهٔ جدید به وجود می‌آورد که تنها دارای یک کارت است.
    2. هر کارت جدید ممکن است در یکی از دسته‌های (کپه‌های) موجود قرار بگیرد که در هر کدام از این کپه‌ها کارت با مقدار بیشتر در آغاز قرار دارد. بنابراین با افزوده شدن پی در پی کارت‌ها، تعداد کارت‌های آن کپه یا همهٔ دسته‌های موجود افزایش پیدا می‌کند که در نتیجهٔ آن یک دسته جدید شکل می‌گیرد.
    3. وقتی که دیگر کارتی وجود ندارد باقی مانده‌ها را بررسی و محاسبه کنید.(پایان بازی)

یک مسئله مهم و اساسی در این بازی به اتمام رساندن آن با کمترین تعداد کپه‌های ممکن است.

الگوریتم مرتب‌سازی[ویرایش]

آرایه با یک روش مرتب‌سازی به عنوان ورودی مرتب‌سازی داده شده‌است. به این مسئله به دید جمع‌آوری کارت بنگرید که باید با مرتب‌سازی آماری هر عنصر بر اساس نمایه (index) خود مرتب شود.
نکته:

  • این بازی از مقدار واقعی کارت‌ها فقط برای مقایسه بین دو کارت استفاده می‌نماید که با این کار ارتباط هر دو عنصر دلخواه از آرایه بررسی می‌شود.

حال بازی مرتب‌سازی صبورانه را شبیه‌سازی کنید وهر کارت جدید را در چپ‌ترین کپه با رعایت قانون قرار دهید. در هر مرحله از این بازی با این استراتژی برچسب‌های (label) کارت‌های سر (top) از چپ به راست به‌طور صعودی هستند. حال توالی مرتب شده را بازیابی کنید و کارت با کمترین مقدار از سر ستون در هر مرحله جمع‌آوری کنید.

پیچیدگی[ویرایش]

اگر تعداد کارت‌ها در محدودهٔ ، باشد یک پیاده‌سازی کارآمد با در بدترین حالت برای قرار دادن کارت‌ها در کپه‌ها وجود دارد (که برای یک مرتب‌سازی کامل در بدترین حالت است و ) فضا برای پشتیبانی ساختارها صرف می‌شود. با توجه به گفتهٔ van Emde Boas tree تعدادی از این گفته‌ها به حقیقت پیوسته است. وقتی که هیچ فرضی در مورد مقادیر نداریم استراتژی حریصانه Greedy algorithm در بدترین حالت در پیاده‌سازی می‌شود.
در حقیقت یک روش پیاده‌سازی آن این است که با یک آرایه‌ای از پشته‌ها که بوسیلهٔ مقادیر کارت‌های سر(top) مرتب شده‌اند کار می‌کنیم که در این روش برای وارد کردن کارت جدید(insert) می‌توان از جستجوی باینری استفاده کرد که در حالت بدبینانه دارای است که P در این جا تعداد کپه‌ها است.
برای کامل کردن مرتب‌سازی در بدترین حالت می‌شود. در هر مرحله کارتی که کمترین مقدار را در topهای سمت چپ کپه مورد نظر دارد بازیابی می‌شود و بعد دوباره تعدادی از کارها باید انجام شود. پیدا کردن کارت بعدی بوسیلهٔ جستجوی آن در میان همهٔ topهای کپه‌ها در هر مرحله انجام شود مثل wikibooksها که در بهترین حالت . با وجود این وارد کردن اولین کپه در لیست کپه‌ها ی باقی‌مانده با مراجعه به کارت‌های مرتب شدهٔ سر (top) انجام شود که در هر مرحله هزینهٔ دارد که در کل با توجه بهn مرحله دارای پیچیدگی زمانی است.

الگوریتم برای پیدا کردن بزرگترین زیر دنبالهٔ صعودی[ویرایش]

ابتدا الگوریتم مرتب‌سازی که در بالا توضیح داده شد را اجرا کنید. در نتیجه آن تعداد اعداد بدست آمده برای هر کپه دارای طول‌های مساوی در بزرگترین زیر دنباله صعودی دارد. هر وقت که یک کارت در سر(top) یک کپه قرار می‌گیرد یک پوینتر به عقب (برگشتی) به کارت سر در کپهٔ قبلی نگه دارید (مثلاً فرض کنید یک عدد با مقداری کمتر از کارت جدید داشته باشیم). در آخر با توجه به اشاره گر به عقب از کارت سر آخرین کپه می‌توانیم یک زیر دنباله نزولی از بزرگترین طول‌ها بازیابی کنیم؛ که در این روش یک حالت بازگشت دارد که جوابی برای الگوریتم بزرگترین زیر دنباله صعودی است.

تاریخچه[ویرایش]

با توجه به گفته یD. Aldous and P. Diaconis مرتب‌سازی صبورانه اولین الگوریتم بود برای محاسبه بزرگترین زیر دنباله صعودی که توسط Hammersley پیاده‌سازی شده‌است و به وسیلهٔ A.S.C. Ross وBob Floyd مقدمات الگوریتم پیاده‌سازی شد.

منابع[ویرایش]