AlgoVerse

انتقال به جلو (Move-to-Front)

لیستی که خودش را سازمان می‌دهد: هر عضوی که درخواست شد به جلوی لیست می‌رود، پس عضوهای پرکاربرد جلو می‌مانند؛ هزینه‌اش حداکثر ۴ برابر بهترین روش آفلاین است.

در یک لیست پیوندی، پیدا کردن عضو kام k قدم طول می‌کشد. اگر بعضی عضوها بیشتر درخواست شوند، بهتر است جلوی لیست باشند. ولی ما از قبل نمی‌دانیم کدام‌ها؛ الگوریتم باید آنلاین تصمیم بگیرد.

ادامه‌ی توضیح ↓
ورودی:
L 1×5 · R 1×8خروجی PDF

لیست اولیه ۱ ۲ ۳ ۴ ۵ است و درخواست‌ها چند بار به ۴ و ۵ برمی‌گردند؛ بعد از اولین بار، آن‌ها جلوی لیست‌اند و ارزان‌اند.

  1. def move_to_front(L, R):
  2. lst = list(L[0])
  3. cells = [lst] # for the picture: the list as one table row
  4. cost = 0
  5. for x in R[0]:
  6. i = 0
  7. while i < len(lst) and lst[i] != x:
  8. i = i + 1
  9. if i == len(lst):
  10. lst.append(x)
  11. cost = cost + i + 1
  12. lst.pop(i)
  13. lst.insert(0, x)
  14. return cost

ناوردا: عضوهای لیست به ترتیب آخرین باری که درخواست شده‌اند هستند (تازه‌ترین جلو)، به جز آن‌هایی که هنوز درخواست نشده‌اند.

شروع اجرا

x—
i—
cost—

جدول هنوز خالی است.

متغیرهای محلی

نارنجی = در همین گام عوض شد

L list

[1, 2, 3, 4, 5]

R list

[4, 5, 4, 5, 4, 1, 4, 5]

Call stack

  1. move_to_front()خط 1
گام ۱ از ۹۲
خط سیاه = found · خط نارنجی = گام کلیدیscan: 0/15 · found: 0/8 · to_front: 0/8
    توضیح

    ایده

    در یک لیست پیوندی، پیدا کردن عضو kام k قدم طول می‌کشد. اگر بعضی عضوها بیشتر درخواست شوند، بهتر است جلوی لیست باشند. ولی ما از قبل نمی‌دانیم کدام‌ها؛ الگوریتم باید آنلاین تصمیم بگیرد.

    انتقال به جلو ساده‌ترین قاعده است: هر عضوی که درخواست شد، به جلوی لیست برود. قاعده‌های دیگر:

    • جابه‌جایی (Transpose): عضو درخواست‌شده فقط با عضو جلوی خودش جابه‌جا شود.
    • شمارش بسامد: لیست به ترتیب تعداد درخواست‌ها مرتب بماند.

    تحلیل رقابتی

    Sleator و Tarjan نشان دادند هزینه‌ی انتقال به جلو روی هر دنباله‌ی درخواست حداکثر ۴ برابر هزینه‌ی بهترین روش آفلاین است که همه‌ی درخواست‌ها را از قبل می‌داند (با شمارش جابه‌جایی‌ها). برای Transpose چنین ضمانتی وجود ندارد.

    ورودی

    L لیست اولیه است و R درخواست‌ها. درخواستی که در لیست نیست به ته لیست اضافه می‌شود.