AlgoVerse

کمینه و بیشینه با هم

عضوها را جفت‌جفت برمی‌دارد: کوچک‌ترِ جفت فقط با کمینه و بزرگ‌ترش فقط با بیشینه مقایسه می‌شود؛ ۳ مقایسه برای هر ۲ عضو.

پیدا کردن کمینه به تنهایی n − 1 مقایسه لازم دارد و بیشینه هم همین‌قدر؛ اگر جدا پیدا شوند 2n − 2 مقایسه. ترفند این الگوریتم: عضوها را جفت‌جفت بردار. اول دو عضو جفت را با هم مقایسه کن؛ کوچک‌تر فقط کاندیدای کمینه است و بزرگ‌تر فقط کاندیدای بیشینه. پس برای هر دو عضو فقط ۳ مقایسه لازم است.

ادامه‌ی توضیح ↓
ورودی:
n=8خروجی PDF

هشت عدد: ۱ مقایسه برای جفت اول و ۳ مقایسه برای هر یک از سه جفت بعدی، روی هم ۱۰ مقایسه به‌جای ۱۴.

  1. def min_max(a):
  2. n = len(a)
  3. if n % 2 == 1:
  4. lo = a[0]
  5. hi = a[0]
  6. start = 1
  7. else:
  8. if a[0] < a[1]:
  9. lo = a[0]
  10. hi = a[1]
  11. else:
  12. lo = a[1]
  13. hi = a[0]
  14. start = 2
  15. for i in range(start, n - 1, 2):
  16. if a[i] < a[i + 1]:
  17. small = a[i]
  18. big = a[i + 1]
  19. else:
  20. small = a[i + 1]
  21. big = a[i]
  22. if small < lo:
  23. lo = small
  24. if big > hi:
  25. hi = big
  26. return lo, hi

ناوردا: lo و hi کمینه و بیشینه‌ی عضوهایی هستند که تا اینجا دیده شده‌اند.

شروع اجرا

3081129344752667

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

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

a list

38194726

Call stack

  1. min_max()خط 1
گام ۱ از ۲۹
خط سیاه = init, new_min, new_max · خط نارنجی = گام کلیدیcompare: 0/10 · new_min: 0/1 · new_max: 0/1

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • comparisons
    • ورودی فعلی (n=8)
    010203046810121416n = تعداد عضوهای آرایهcomparisons
    نمایش به شکل جدول
    ncomparisons
    44
    67
    810
    1013
    1216
    1419
    1622
    توضیح

    ایده

    پیدا کردن کمینه به تنهایی n − 1 مقایسه لازم دارد و بیشینه هم همین‌قدر؛ اگر جدا پیدا شوند 2n − 2 مقایسه. ترفند این الگوریتم: عضوها را جفت‌جفت بردار. اول دو عضو جفت را با هم مقایسه کن؛ کوچک‌تر فقط کاندیدای کمینه است و بزرگ‌تر فقط کاندیدای بیشینه. پس برای هر دو عضو فقط ۳ مقایسه لازم است.

    هزینه

    حداکثر 3⌊n/2⌋ مقایسه، یعنی حدود 1.5n به‌جای 2n. این بهترین ممکن هم هست: هیچ الگوریتمی با مقایسه نمی‌تواند با کمتر از ⌈3n/2⌉ − 2 مقایسه هر دو را پیدا کند.

    در trace به چه چیزی نگاه کنی

    • فلش i اولین عضو هر جفت را نشان می‌دهد؛ lo و hi در پنل حافظه‌اند.
    • شمار compare را با 2n − 2 مقایسه کن.