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

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

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

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

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

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

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

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

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

8 4 7 2 3 9 1
  1. درج داده ها در درخت
    inserting data in Splay Tree
  2. پیمایش پیش ترتیب (In-Order) درخت
    In-Order Traversal of the tree

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

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

طبق تحلیل سرشکن، این مرتب‌سازی در بدترین حالت برای 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, MR 1762706, doi:10.1137/S009753979732699X .
  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 3503, Springer, pp. 597–601, doi:10.1007/11427186_52 .