زنگ تفريح شماره 109
بر اساس تعریف درخت heap، در یک max-heap (یا min-heap) بزرگترین (یا کوچکترین) مقدار بین دادهها همواره در ریشه درخت قرار دارد. یافتن بزرگترین (یا کوچکترین) عنصر بین عناصر، هزینه ثابت ( Ө( 1 دارد. با حذف این عنصر از درخت، بزرگترین (یا کوچکترین) عنصر بعدی مجددا در ریشه قرار میگیرد. به این ترتیب با حذف متوالی عناصر درخت heap و درج آنها در محل جدید، یک آرایه مرتبشده نزولی (یا صعودی) به دست خواهد آمد.
به عنوان نمونه آرايه زیر را در نظر بگیرید:
گام صفر:درخت مين هيپ مورد نظر را از روي آرايه ميسازيم. اولين خانه آرايه به عنوان ريشه در نظر گرفته ميشود و خانههاي بعدي به صورت چپ به راست به در جايگاه فرزندان قرار ميگيرند:
در مرتب سازي مين هيپ هر ريشه بايد از فرزندانش كوچكتر باشد
1 از فرزندانش يعني 4 و 5 كوچكتر است و 4و 5 هر كدام از فرزندانشان كوچكترند.
گام اول:براي اين منظور يك آرايه خالي با همين اندازه در نظر بگيريد. ريشه مين هيپ يعني عدد1 در اولين خانه اين آرايه قرار ميگيرد. حالا بايد دوباره مين هيپ را مرتب كنيم. كوچكترين فرزند 1 يعني عدد 4 به جاي او قرار ميگيرد و درخت را بر اساس كوچكتر بودن ريشه از فرزندانش مرتب ميكنيم . درخت به شكل زير درميآيد:
گام دوم: ريشه مين هيپ يعني عدد4 در دومين خانه ارايه بعد از 1 قرار ميگيرد. در هر مرحله درخت را بايد مرتب كنيم. در اين مرحله درخت به شكل زير در ميآيد:
به همين شيوه ادامه ميدهيم. شرح گامها به صورت زير است:
نكته:مين هيپ براي مرتب سازي صعودي است. براي مرتب كردن نزولي از مكس هيپ استفاده ميشود كه دقيقا به همين روال است اما در هر مرحله به جاي كوچكترين عدد به دنبال بزرگترين عدد هستيم و فرزندان هر ريشه بايد از عدد ريشه كوچكتر باشند.
بررسی فضای مصرفی مرتبسازی هرمی
در روش بحث شده برای مرتب کردن n عنصر، دو آرایه n عنصری نیاز است. یکی از این آرایهها عناصر را به فرم درخت heap به عنوان ورودی الگوریتم، و دیگری عناصر مرتب شده را به عنوان خروجی الگوریتم شامل میشوند. در چنین حالتی این الگوریتم یک روش مرتبسازی درجا نیست. با اندکی تغییر در روش پیادهسازی الگوریتم میتوان عملکرد دو آرایه را در یک آرایه ادغام کرده، و میزان حافظه مصرفی را کاهش داد.
درخت min-heap مثال فوق را در نظر بگیرید. با حذف عدد یک به عنوان گره ریشه درخت و اعمال تغییرات لازم به نتیجه زیر میرسیم:
خط عمودی پررنگ، انتهای اطلاعات درخت در آرایه را نشان میدهد. خانه شماره 6 حاوی اطلاعات سوخته و بلا استفاده است. پس میتوانیم عنصر حذف شده را در آن قرار دهیم:
توجه داشته باشید که در حال حاضر درخت از پنج عنصر تشکیل شده است و عنصر ششم آرایه از عناصر درخت نیست. به همین ترتیب با حذف مجدد گره ریشه با مقدار 4 آرایه زیر حاصل میشود:
و با درج عنصر حذف شده در محل بلا استفاده:
به همین ترتیب با تکرار الگوریتم نتیجه نهایی حاصل میشود:
البته توجه داشته باشید که بر خلاف نتیجه نهایی روش قبل، در این حالت عناصر به صورت نزولی به دست آمدهاند. یعنی در این روش از درخت min-heap برای مرتبسازی نزولی و از درخت max-heap برای مرتبسازی صعودی استفاده میشود.