مرتب‌سازی گسترده

از ویکی‌پدیا، دانشنامهٔ آزاد

در علوم رایانه، مرتب‌سازی گسترده (به انگلیسی: Splaysort) یک الگوریتم مرتب‌سازی مقایسه‌ای توافقی بر مبنای ساختمان داده‌های درخت اسپلی است.[۱]

الگوریتم[ویرایش]

مراحل اجرای الگوریتم عبارت‌اند از:

  1. مقداردهی اولیه یک درخت اسپلی خالی صورت می‌گیرد؛
  2. برای هر آیتِم داده در ترتیب ورودی، آن را در درخت اسپلی قرار می‌دهد؛
  3. پیمایش درخت برای یافتن ترتیب داده انجام می‌شود.

علاوه بر این، الگوریتم با استفاده از درخت اسپلی برای سرعت بخشیدن به هر عمل درج، ممکن است به‌عنوان شکلی از مرتب‌سازی درجی یا مرتب‌سازی درختی هم به‌نظر برسد.

مثال[ویرایش]

به عنوان مثال داده‌هایی با ترتیب زیر را می‌خواهیم مرتب کنیم:

8 4 7 2 3 9 1
  1. درج داده ها در درخت
    وارد کردن داده در درخت گسترده
  2. پیمایش پیش ترتیب (In-Order) درخت
    پیمایش میان‌ترتیب درخت ساخته‌شده

برای آشنایی بیشتر با روش درج در این درخت به الگوریتم موجود در صفحه‌ی درخت گسنرده مراجعه کنید.

تحلیل زمانی الگوریتم[ویرایش]

طبق تحلیل سرشکن، این مرتب‌سازی در بدترین حالت برای n داده از پیچیدگی زمانی (O (n log n است. که هم‌اندازه با سریع‌ترین الگوریتم‌های مرتب‌سازی مقایسه‌ای غیر توافقی مانند مرتب‌سازی ادغامی و مرتب‌سازی سریع است. برای ورودی‌های خاص با ترتیب به طور مثال تقریبا مرتب یا به طوری که هر عنصر با جدش در حالت مرتب فاصله‌ی کمی دارد، این الگوریتم می‌تواند بهتر از پیچیدگی زمانی (O (n log n عمل کند. این موضوع نشان می‌دهد این مرتب‌سازی یک مرتب سازی توافقی است. طبق قضیه‌ی Dynamic Finger [۲] برای درخت‌های اسپلی زمان اجرای این الگوریتم به شیوه‌ی زیر محاسبه می شود:

اگر xd را فاصله‌ی عنصر x از جدش و xi را برابر با اندازهٔ نابه‌جایی آن (اختلاف جای x در ورودی و جای آن در داده‌ی مرتب‌سازی شده) در نظر بگیریم، کل زمان مرتب‌سازی به و محدود می‌شود.

مقایسه با الگوریتم های دیگر[ویرایش]

طبق محاسبات (Moffat، Eddy و Petersson 1996)، در اعداد تصادفی عامل 1.5 تا 2، الگوریتم مرتب‌سازی سریع و در عامل‌های کوچکتر مرتب‌سازی ادغامی سریعتر عمل می‌کنند. برای داده‌های با مقیاس بزرگ‌تر، مرتب‌سازی سریع به دلیل الگوریتم درجا بودن کندتر است و مرتب‌سازی ادغامی و گسترده از نظر زمانی نزدیک به هم عمل می‌کنند. که اگر داده‌ها تقریبا مرتب باشند مرتب‌سازی گسترده بسیار بهتر از الگوریتم‌های دیگر عمل می‌کند.[۱]

همچنین (Elmasry و Hammad 2005) نیز این الگوریتم را با دیگر الگوریتم‌های توافقی که بر اساس شمار کل نابه‌جایی‌ها در اعداد ورودی هستند، مقایسه کردند و به این نتیجه رسیدند که اگر در ورودی به اندازهٔ کافی نابه‌جایی وجود داشته باشد که مرتب‌سازی سریع از الگوریتم‌های توافقی کندتر عمل کند، مرتب سازی گسترده سریع‌ترین الگوریتم است.[۳]

پانویس[ویرایش]

  1. ۱٫۰ ۱٫۱ Moffat, Alistair; Eddy, Gary; Petersson, Ola (July 1996), "Splaysort: Fast, Versatile, Practical", Software Practice and Experience, 26 (7): 781–797, doi:10.1002/(SICI)1097-024X(199607)26:7<781::AID-SPE35>3.3.CO;2-2
  2. Cole, Richard (2000), "On the dynamic finger conjecture for splay trees. II. The proof", SIAM Journal on Computing, 30 (1): 44–85, doi:10.1137/S009753979732699X, MR 1762706.
  3. Elmasry, Amr; Hammad, Abdelrahman (2005), "An empirical study for inversions-sensitive sorting algorithms", Experimental and Efficient Algorithms: 4th International Workshop, WEA 2005, Santorini Island, Greece, May 10-13, 2005, Proceedings, Lecture Notes in Computer Science, vol. 3503, Springer, pp. 597–601, doi:10.1007/11427186_52.