رده | الگوریتم مرتبسازی |
---|---|
ساختمان داده | آرایه |
کارایی بدترین حالت |
مرتبسازی صبورانه یک الگوریتم مرتبسازی است که بر پایهٔ کارت بازی یک نفرهاست وخاصیتی دارد که میتواند به طوز مؤثر طول بزرگترین زیر دنباله صعودی در یک آزایهٔ داده شده را محاسبه کند.
بازی با یک دسته بر زده شده شروع میشود که شمارهگذاری شدهاست. ابتدا کارتها ۱ به ۱ مقدار دهی و توزیع میشوند که البته این مقدار دهی و توزیع در کپههای متوالی و جدا از هم روی میز قرار دارد
یک مسئله مهم و اساسی در این بازی به اتمام رساندن آن با کمترین تعداد کپههای ممکن است.
آرایه با یک روش مرتبسازی به عنوان ورودی مرتبسازی داده شدهاست. به این مسئله به دید جمعآوری کارت بنگرید که باید با مرتبسازی آماری هر عنصر بر اساس نمایه (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 مقدمات الگوریتم پیادهسازی شد.