الگوی اشاره‌گر کند و تند

اشاره‌گر کند و تند (Floyd): تشخیص حلقه در لیست پیوندی، پیدا کردن وسط و شروع حلقه — با سرعت دوبرابر

ایده الگو

دو اشاره‌گر با سرعت متفاوت: تند ۲ قدم، کند ۱ قدم. اگر حلقه وجود داشته باشد، تند دوباره به کند می‌رسد (مثل دو دونده در پیست!).

کاربرد ۱: تشخیص حلقه

در لیست پیوندی یا آرایه‌ای که هر خانه به خانه‌ای دیگر اشاره می‌کند:

چرا قطعاً می‌رسند؟ در هر گام فاصله‌شان ۱ کم می‌شود (تند ۲ جلو، کند ۱) — مثل شکار حتمی.

کاربرد ۲: پیدا کردن شروع حلقه

بعد از برخورد، یکی را به ابتدا برگردانید و هر دو را با سرعت ۱ حرکت دهید — نقطه برخورد دوم = شروع حلقه! (ریاضیات زیبا پشت آن است: فاصله از ابتدا تا شروع = فاصله از نقطه برخورد تا شروع)

کاربرد ۳: وسط لیست

وقتی تند به انتها رسید، کند دقیقاً وسط است — یک پیمایش، بدون دانستن طول!

کاربرد ۴: آرایه‌های دوری و «آشفته»

مسئله «Find Duplicate Number»: آرایه‌ای که مقدارها به عنوان «اشاره‌گر» عمل می‌کنند — کند/تند حلقه را پیدا می‌کند و شروع حلقه = عدد تکراری!

مسئلهراه‌حل کند/تند
حلقه در لیست پیوندیبرخورد = حلقه
شروع حلقهبرخورد + بازگشت به ابتدا
وسط لیستتند تمام ← کند وسط
عدد تکراری (بدون تغییر آرایه)آرایه = گراف تابعی
خوش‌بختی عدد (Happy Number)دنباله مربع ارقام = حلقه‌یاب
نکته: مزیت بزرگ این الگو — O(n) زمان و O(1) حافظه! روش جایگزین (هش بازدیدشده‌ها) همان O(n) زمان اما O(n) حافظه می‌خواهد. در مصاحبه، ارائه هر دو و ترجیح کند/تند امتیاز دارد.

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل الگوریتم‌ها است.

ابزارهای مرتبط