حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش الگوریتم و حل مسئله با پایتون؛ تمرین عملی

شمارش عملیات خطی O(n) در پایتون

تحلیل الگوریتم در پایتون؛ از قرارداد تا شمارش عملیات · 0٪

✍️ برای مقایسه الگوریتم‌ها می‌تونیم یک کار مشخص را بشماریم؛ اینجا هر بازدید از یک عضو، یک عملیات حساب می‌شود. سرعت لپ‌تاپ، اندازه پنجره مرورگر و فاصله زمانی اجرا دخالت ندارند. اگر ورودی هفت عضو داشته باشد، حلقه‌ای که هر عضو را یک بار می‌بیند هفت بازدید دارد؛ اندازه عددهای داخل فهرست مهم نیست.

مثلاً برای [90, -5] مسیر شمارنده 0 → 1 → 2 است و نتیجه دو می‌شود. به چنین رشد متناسبی با تعداد اعضا، خطی یا O(n) می‌گیم. این نماد تعداد دقیق همه دستورهای پردازنده را ادعا نمی‌کند؛ درباره رشد کار با بزرگ شدن ورودی حرف می‌زند.

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

تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

فعالیت شما

تابع count_visits(nums) یک فهرست از عددهای صحیح می‌گیرد و تعداد بازدیدهای یک پیمایش کامل، یعنی طول فهرست، را به صورت عدد صحیح برمی‌گرداند. هیچ تغییری در nums نده. خالی برابر 0 و تک‌عضوی برابر 1 است؛ count_visits([8, 2, 8]) برابر 3 است. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def count_visits(nums):
    visits = 0
    for number in nums:
        pass  # TODO: count this visit
    return visits

# این تابع آماده فقط برای ارزیابی است؛ آن را تغییر نده.
def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = count_visits(*args)
    if args != before:
        raise ValueError('ورودی نباید تغییر کند.')
    return result