مرتب‌سازی فلش

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

مرتب سازی Flash الگوریتم مرتب سازی ای بر اساس توزیع احتمال است که برای داده های با توزیع یکنواخت، با حافظه نسبتا بیشتر، دارای پیچیدگی زمان اجرای O(n) است. این الگوریتم اولین بار در سال 1998 توسط Karl-Dietrich Neubert منتشر شد.[۱]

مفهوم[ویرایش]

ایده اصلی مرتب سازی Flash این است که برای مجموعه داده ای که دارای توزیع احتمال یکنواخت است، با داشتن حد بالا و پایین مجموعه، می توان مکان هر عضو را تخمین زد. برای مثال برای مجموعه ای که کمینه آن 1 و بیشینه آن 100 است و 50 هم عضوی از آن مجموعه است منطقی به نظر می رسد که پس از مرتب سازی، مکان 50 در وسط آرایه مرتب شده باشد. این مکان تخمین زده شده یک کلاس نامیده می شود. اگر اعضای مجموعه را از 1 تا m شماره گذازی کنیم، کلاس A_i به این صورت محاسبه می شود:


  K(A_i) = 1+\textrm{INT}\left((m-1)\frac{A_i-A_\textrm{min}}{A_\textrm{max}-A_\textrm{min}}\right)


که A مجموعه ورودی است و حاصل عبارت شماره کلاسی است که عضو i ام به آن تعلق دارد. حد بالا و پایین پوشش داده شده برای تمام کلاس ها، به غیر از کلاس آخر که شامل بیشینه هاست، یکسان است. این کلاس بندی اطمینان می دهد که هر داده در یک کلاس از داده های کلاس پایین تر بزرگتر است. این کلاس بندی در واقع یک ترتیب جزئی است که که تعداد وارونگی ها را کاهش می دهد. سپس برای هر کلاس مرتب سازی درجی انجام می شود. تا جایی که توزیع احتمال یکنواخت باشد، اندازه کلاس ها ثابت می ماند و مرتب سازی درجی بهینه خواهد بود.

[۱]

پیاده سازی با حافظه بهینه[ویرایش]

برای بهینه کردن حافظه، الگوریتم از ساختمان داده های اضافه برای ذخیره کلاس ها استفاده نمی کند، بلکه حدود بالا و پایین هر کلاس را در وکتوری ای به نام L ذخیره می کند. حدود بالا از شمارش تعداد اعضای کلاس و کلاس های قبلش حاصل می شود. از این حدود بالا می توان به عنوان اشاره گر به کلاس ها استفاده کرد. کلاس بندی توسط تعدادی دور انجام می شود، به این صورت که یک سر دور از آرایه ورودی A گرفته می شود و کلاس اش محاسبه می شود. یک عضو سردور معتبر است اگر کلاس بندی نشده باشد. وقتی الگوریتم روی عناصر ورودی حرکت می کند از عناصر کلاس بندی شده پرش می شود و عناصر کلاس بندی نشده برای ساخت دور جدید استفاده می شوند.

[۱] [۲]

سرعت[ویرایش]

در حالت ایده آل داده ها به گونه ای کلاس بندی می شوند که اندازه کلاس ها تقریبا مساوی باشد، از آنجا که هزینه مرتب سازی هر کلاس m*O(m) است و با فرض این که m کلاس داشته باشیم و کلاس ها را با مرتب سازی درجی در کنار هم قرار دهیم هزینه برابر m*O(1) یاO(m) می شود و چون m ضریبی از n است پس هزینه نهاییO(n) می شود.


در بدترین حالت کلاس بندی به گونه ای انجام می شود که تعداد کلاس ها زیاد و در هر کلاس تقریبا یک عنصر قرار می گیرد، در این حالت هزینه نهایی برابر هزینه مرحله آخر که قرار دادن کلاس ها در کنار هم با مرتب سازی درجی است، می شود. در نتیجه هزینه بدترین حالت O(n^2) می شود. انتخاب تعداد کلاس ها (m) بر هزینه الگوریتم بسیار تاثیر گذار است، طی تحقیقی که Neubert انجام داده است m=0.42n مقدار بهینه برای m خواهد بود.

[۲] [۳]


با توجه به فرآیند کلاس بندی، مرتب سازی Flash پایدار نیست.

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

  1. ۱٫۰ ۱٫۱ ۱٫۲ Neubert, Karl-Dietrich (February 1998). "The Flashsort Algorithm". Dr. Dobb's Journal: 123. Retrieved 2007-11-06. 
  2. ۲٫۰ ۲٫۱ Karl-Dietrich Neubert (1998). "The FlashSort Algorithm". Retrieved 2007-11-06. 
  3. Li Xiao, Xiaodong Zhang, Stefan A. Kubricht. "Cache-Effective Quicksort". Improving Memory Performance of Sorting Algorithms. Department of Computer Science, College of William and Mary, Williamsburg, VA 23187-8795. Archived from the original on 2007-11-02. Retrieved 2007-11-06. 

پیوند به بیرون[ویرایش]